using System; using Base; using UnityEngine; namespace Prefab { public class TemporaryAnimator : MonoBehaviour, ITick { [Tooltip("动画持续时间")] public float lifeTime = 3; private float _timer; // 每次启用时会重置为0 // 使用属性限制外部只能获取和一次性设置动画函数 [Tooltip("定义X轴偏移的函数 (时间 -> X偏移量)")] public Func GetXPosition { get; private set; } [Tooltip("定义Y轴偏移的函数 (时间 -> Y偏移量)")] public Func GetYPosition { get; private set; } private Vector3 _originalPosition; private void Start() { _originalPosition = transform.localPosition; // 初始位置只需在组件生命周期中获取一次 } private void OnEnable() { _timer = 0; // 每次启用时重置计时器,确保动画从头开始 Clock.AddTick(this); // 在启用时注册到全局Tick系统 } private void OnDisable() { // 在禁用或销毁时从全局Tick系统取消注册,避免不必要的调用和资源泄露 Clock.RemoveTick(this); } public virtual void Tick() { _timer += Time.deltaTime; // 钳制当前动画时间,确保最后一帧使用精确的lifeTime值 // 避免动画函数接收到超出预期范围的时间参数 var currentAnimationTime = Mathf.Min(_timer, lifeTime); var shouldDestroy = _timer >= lifeTime; // 判断是否达到销毁条件 // 调用委托获取X和Y轴的偏移量,如果委托未设置则默认为0 var xOffset = GetXPosition?.Invoke(currentAnimationTime) ?? 0f; var yOffset = GetYPosition?.Invoke(currentAnimationTime) ?? 0f; // 应用偏移量到物体位置,保持原始Z轴不变 transform.localPosition = _originalPosition + new Vector3(xOffset, yOffset, 0); // 如果达到销毁条件,在完成最后一帧动画更新后销毁物体 if (shouldDestroy) { Destroy(this.gameObject); } } /// /// 设置动画的X和Y轴位移函数。 /// 此方法通常在实例化TemporaryAnimator后立即调用以配置其动画行为。 /// /// 时间到X轴位移的函数。 /// 时间到Y轴位移的函数。 public void SetAnimationFunctions(Func getXPosFunc, Func getYPosFunc) { GetXPosition = getXPosFunc; GetYPosition = getYPosFunc; } } }