2025-09-06 12:25:55 +08:00
|
|
|
|
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<float, float> GetXPosition { get; private set; }
|
|
|
|
|
|
|
|
|
|
[Tooltip("定义Y轴偏移的函数 (时间 -> Y偏移量)")]
|
|
|
|
|
public Func<float, float> GetYPosition { get; private set; }
|
|
|
|
|
|
|
|
|
|
private Vector3 _originalPosition;
|
|
|
|
|
|
|
|
|
|
private void Start()
|
|
|
|
|
{
|
2025-09-08 00:13:12 +08:00
|
|
|
|
_originalPosition = transform.localPosition; // 初始位置只需在组件生命周期中获取一次
|
2025-09-06 12:25:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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; // 判断是否达到销毁条件
|
|
|
|
|
|
2025-09-08 09:24:32 +08:00
|
|
|
|
// 调用委托获取X和Y轴的偏移量,如果委托未设置则使用当前位置的对应轴值
|
|
|
|
|
// 有委托时:原始位置 + 偏移量;无委托时:当前位置的对应轴值
|
|
|
|
|
var xPos = GetXPosition != null ? _originalPosition.x + GetXPosition.Invoke(currentAnimationTime) : transform.localPosition.x;
|
|
|
|
|
var yPos = GetYPosition != null ? _originalPosition.y + GetYPosition.Invoke(currentAnimationTime) : transform.localPosition.y;
|
|
|
|
|
|
|
|
|
|
// 应用计算后的值到物体位置,保持原始Z轴不变
|
|
|
|
|
transform.localPosition = new Vector3(xPos, yPos, _originalPosition.z);
|
2025-09-06 12:25:55 +08:00
|
|
|
|
|
|
|
|
|
// 如果达到销毁条件,在完成最后一帧动画更新后销毁物体
|
|
|
|
|
if (shouldDestroy)
|
|
|
|
|
{
|
|
|
|
|
Destroy(this.gameObject);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设置动画的X和Y轴位移函数。
|
|
|
|
|
/// 此方法通常在实例化TemporaryAnimator后立即调用以配置其动画行为。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="getXPosFunc">时间到X轴位移的函数。</param>
|
|
|
|
|
/// <param name="getYPosFunc">时间到Y轴位移的函数。</param>
|
|
|
|
|
public void SetAnimationFunctions(Func<float, float> getXPosFunc, Func<float, float> getYPosFunc)
|
|
|
|
|
{
|
|
|
|
|
GetXPosition = getXPosFunc;
|
|
|
|
|
GetYPosition = getYPosFunc;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|