Unity中使用最小堆算法实现定时器的步骤如下:

  1. 创建Timer类,用于表示一个定时器。Timer类包含以下属性:
  • float delay:定时器的延迟时间。
  • float time:定时器已经运行的时间。
  • bool isPaused:定时器是否暂停。
  • bool isCompleted:定时器是否已经完成。
  • Action callback:定时器完成时执行的回调函数。
  1. 创建TimerManager类,用于管理所有的定时器。TimerManager类包含以下属性:
  • List timers:所有的定时器列表。
  • PriorityQueue timerQueue:基于最小堆算法的定时器队列。
  1. 在Update函数中,遍历所有的定时器,更新它们的时间。

  2. 将所有未完成的定时器添加到定时器队列中。

  3. 从定时器队列中取出时间最小的定时器,执行它的回调函数。

  4. 如果定时器已经完成,则从定时器列表中删除它。

  5. 如果定时器被暂停或者重置,则从定时器队列中移除它。

下面是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);
unity 基于最小堆算法定时器

原文地址: https://www.cveoy.top/t/topic/9ZU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录