unity 定时器实现源码
以下是 Unity 定时器的实现源码,包括计划任务、暂停、恢复等功能:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TimerManager : MonoBehaviour
{
private static TimerManager instance;
private List<Timer> timers = new List<Timer>();
private void Awake()
{
if (instance == null)
{
instance = this;
}
else if (instance != this)
{
Destroy(gameObject);
}
DontDestroyOnLoad(gameObject);
}
private void Update()
{
for (int i = 0; i < timers.Count; i++)
{
Timer timer = timers[i];
if (timer.IsPaused)
{
continue;
}
timer.CurrentTime += Time.deltaTime;
if (timer.CurrentTime >= timer.Duration)
{
timer.OnTimerComplete();
if (timer.IsRepeating)
{
timer.Reset();
}
else
{
timers.Remove(timer);
}
}
}
}
public static Timer AddTimer(float duration, bool isRepeating, System.Action onTimerComplete)
{
Timer timer = new Timer(duration, isRepeating, onTimerComplete);
instance.timers.Add(timer);
return timer;
}
public static void RemoveTimer(Timer timer)
{
instance.timers.Remove(timer);
}
public static void PauseAllTimers()
{
for (int i = 0; i < instance.timers.Count; i++)
{
Timer timer = instance.timers[i];
timer.IsPaused = true;
}
}
public static void ResumeAllTimers()
{
for (int i = 0; i < instance.timers.Count; i++)
{
Timer timer = instance.timers[i];
timer.IsPaused = false;
}
}
}
public class Timer
{
public float Duration { get; private set; }
public bool IsRepeating { get; private set; }
public System.Action OnTimerComplete { get; private set; }
public bool IsPaused { get; set; }
public float CurrentTime { get; set; }
public Timer(float duration, bool isRepeating, System.Action onTimerComplete)
{
Duration = duration;
IsRepeating = isRepeating;
OnTimerComplete = onTimerComplete;
Reset();
}
public void Reset()
{
CurrentTime = 0;
}
}
使用方法:
// 添加定时器
TimerManager.AddTimer(2f, false, () => {
Debug.Log("Timer complete!");
});
// 暂停所有定时器
TimerManager.PauseAllTimers();
// 恢复所有定时器
TimerManager.ResumeAllTimers();
其中,AddTimer 方法用于添加定时器,参数包括持续时间、是否重复、定时器完成回调函数。PauseAllTimers 和 ResumeAllTimers 方法用于暂停和恢复所有定时器。
原文地址: https://www.cveoy.top/t/topic/9ZL 著作权归作者所有。请勿转载和采集!