using System; using UnityEngine; namespace AibisDream { public class AbsMobileObject : MonoBehaviour { private MobileObjectData _mobileObjectData; private Vector3 _initPos; public bool IsActive { get; private set; } public float ExistTime { get; private set; } public float Speed { get; private set; } public event Action OnDisposed; public virtual void Init(MobileObjectData mobileObjectData) { _initPos = transform.position; _mobileObjectData = mobileObjectData; gameObject.name = mobileObjectData.itemName; IsActive = true; Speed = RandomSpeed(); gameObject.SetActive(true); } protected string RandomSelectAddress() { return _mobileObjectData.assetAddressArray[ UnityEngine.Random.Range(0, _mobileObjectData.assetAddressArray.Length)]; } protected float RandomSpeed() { return UnityEngine.Random.Range(_mobileObjectData.speed.x, _mobileObjectData.speed.y); } public void Update() { // 移动 if (IsActive) { var posDelta = _mobileObjectData.direction.normalized * (Speed * Time.deltaTime); transform.position += new Vector3(posDelta.x, posDelta.y, 0); ExistTime += Time.deltaTime; if (IsReachEnd()) { Dispose(); } } } private bool IsReachEnd() { if (_mobileObjectData.isDistanceMode) { return _mobileObjectData.existDistance <= Vector3.Distance(transform.position, _initPos); } return _mobileObjectData.existTime <= ExistTime; } protected virtual void Dispose() { IsActive = false; ExistTime = 0; _initPos = default; _mobileObjectData = default; gameObject.name = "Empty"; gameObject.SetActive(false); // 回收 OnDisposed?.Invoke(this); OnDisposed = null; } } }