unity 基于最小堆算法定时器
Unity中使用最小堆算法实现定时器的步骤如下:
- 创建Timer类,用于表示一个定时器。Timer类包含以下属性:
- float delay:定时器的延迟时间。
- float time:定时器已经运行的时间。
- bool isPaused:定时器是否暂停。
- bool isCompleted:定时器是否已经完成。
- Action callback:定时器完成时执行的回调函数。
- 创建TimerManager类,用于管理所有的定时器。TimerManager类包含以下属性:
- List
timers:所有的定时器列表。 - PriorityQueue
timerQueue:基于最小堆算法的定时器队列。
-
在Update函数中,遍历所有的定时器,更新它们的时间。
-
将所有未完成的定时器添加到定时器队列中。
-
从定时器队列中取出时间最小的定时器,执行它的回调函数。
-
如果定时器已经完成,则从定时器列表中删除它。
-
如果定时器被暂停或者重置,则从定时器队列中移除它。
下面是Timer和TimerManager类的代码示例:
public class Timer
{
public float delay;
public float time;
public bool isPaused;
public bool isCompleted;
public Action callback;
public Timer(float delay, Action callback)
{
this.delay = delay;
this.callback = callback;
}
}
public class TimerManager : MonoBehaviour
{
private List<Timer> timers = new List<Timer>();
private PriorityQueue<Timer> timerQueue = new PriorityQueue<Timer>();
private void Update()
{
foreach (Timer timer in timers)
{
if (!timer.isPaused && !timer.isCompleted)
{
timer.time += Time.deltaTime;
if (timer.time > timer.delay)
{
timer.isCompleted = true;
timer.callback?.Invoke();
}
}
}
foreach (Timer timer in timers)
{
if (!timer.isCompleted && !timer.isPaused)
{
timerQueue.Enqueue(timer, timer.time + timer.delay);
}
}
while (timerQueue.Count > 0 && timerQueue.Peek().isCompleted)
{
Timer timer = timerQueue.Dequeue();
timers.Remove(timer);
}
}
public Timer AddTimer(float delay, Action callback)
{
Timer timer = new Timer(delay, callback);
timers.Add(timer);
return timer;
}
public void RemoveTimer(Timer timer)
{
if (timer != null)
{
timer.isCompleted = true;
timer.isPaused = true;
timerQueue.Remove(timer);
timers.Remove(timer);
}
}
public void PauseTimer(Timer timer)
{
if (timer != null)
{
timer.isPaused = true;
timerQueue.Remove(timer);
}
}
public void ResumeTimer(Timer timer)
{
if (timer != null)
{
timer.isPaused = false;
timerQueue.Enqueue(timer, timer.time + timer.delay);
}
}
}
在使用定时器时,可以通过TimerManager的AddTimer函数创建一个定时器,并将它添加到管理器中。例如:
Timer timer = timerManager.AddTimer(2f, () => Debug.Log("Timer completed!"));
使用PauseTimer函数可以暂停一个定时器,使用ResumeTimer函数可以恢复一个暂停的定时器,使用RemoveTimer函数可以移除一个定时器。例如:
timerManager.PauseTimer(timer);
timerManager.ResumeTimer(timer);
timerManager.RemoveTimer(timer);
原文地址: https://www.cveoy.top/t/topic/9ZU 著作权归作者所有。请勿转载和采集!