using UnityEngine; using BaseGames.Core; using BaseGames.Core.Pool; namespace BaseGames.Combat { /// /// 抛射物基类。子类通过重写 设定初速度。 /// 依赖 子组件进行碰撞伤害检测。 /// [RequireComponent(typeof(Rigidbody2D), typeof(HitBox))] public abstract class Projectile : MonoBehaviour { [HideInInspector] public DamageInfo DamageInfo; [HideInInspector] public Vector2 Direction; protected ProjectileConfigSO _config; protected Rigidbody2D _rb; protected HitBox _hitBox; protected float _aliveTimer; private PooledObject _pooledObject; protected virtual void Awake() { _rb = GetComponent(); _hitBox = GetComponent(); _pooledObject = GetComponent(); } /// 从对象池取出后的初始化入口。 public virtual void Initialize(ProjectileConfigSO config, DamageInfo damageInfo, Vector2 direction) { _config = config; DamageInfo = damageInfo; Direction = direction.normalized; _aliveTimer = 0f; _hitBox.Activate(config.DamageSource); OnInitialized(); } /// 子类在此设定初速度或附加初始化逻辑。 protected virtual void OnInitialized() { } protected virtual void Update() { _aliveTimer += Time.deltaTime; if (_config != null && _aliveTimer >= _config.Lifetime) ReturnToPool(); } /// 停用并归还对象池。 protected void ReturnToPool() { _hitBox.Deactivate(); gameObject.SetActive(false); if (_pooledObject != null && _config != null) ServiceLocator.GetOrDefault()?.Despawn(_config.PoolKey, _pooledObject); } protected virtual void OnDisable() { _aliveTimer = 0f; } } }