利用委托实现按fixupdate更新倒计时,计时结束后触发委托方法
为TimeBehaviour的unity自定义委托添加触发方法,在计时结束后触发timer类的委托方法,再执行到用户添加的unity自定义委托方法并销毁该组件。
public class TimeBehaviour : MonoBehaviour
{
[SerializeField] private float duration = 1.0f;
[SerializeField] private UnityEvent onTimerEnd = null;
private Timer timer;
private void Start()
{
//1.创建计时器
timer = new Timer(duration);
//2.计时器添加监听 计时结束后执行
timer.OnTimerEnd += HandleTimerEnd;
}
private void HandleTimerEnd()
{
onTimerEnd.Invoke();//执行手动添加的事件方法
Destroy(this);//删除计时器组件
}
private void Update()
{
//3.时间更新
timer.Tick(Time.deltaTime);
}
}
public class Timer
{
public float RemainingSeconds { get; private set; }
public Timer(float duration)
{
RemainingSeconds = duration;
}
public event Action OnTimerEnd;
//计时器更新方法
public void Tick(float deltaTime)
{
//先判断是否为0,不为零则计时器减去单位物理时间且进入结束方法
if (RemainingSeconds ==0f ) { return; }
RemainingSeconds -= deltaTime;
CheckForTimerEnd();
}
/// <summary>
/// 计时器结束(计时时间<=0) 执行方法
/// </summary>
private void CheckForTimerEnd()
{
if(RemainingSeconds > 0f) { return; }
RemainingSeconds = 0f;//避免<0s
OnTimerEnd?.Invoke();//执行外部监听方法
}
}