在实际游戏开发过程中经常会用到计时器,例如在多少秒以后执行某个任务,游戏中各种弹窗的消失等等事件。
每当我们需要用到计时器的时候就去写一个,这样子等工程庞大的时候,非常不利于管理。为了方便管理,
我们可以把所有的计时任务统一管理起来。
首先 我们需要一个全局的计时任务管理类:
public class TimerTaskManager : MonoBehaviour
{
private List<TimerTask> taskList = new List<TimerTask>();
private static TimerTaskManager _instance;
public static TimerTaskManager Instance
{
get
{
return _instance;
}
}
private void Awake()
{
_instance = this;
}
public void AddTimeTask(float delayTime,bool repeat,TimeTaskDelegate timeCallBack)
{
TimerTask timeTask = new TimerTask(delayTime, repeat, timeCallBack);
if (taskList.Contains(timeTask) || timeTask == null)
return;
taskList.Add(timeTask);
}
public void RemoveTask(TimeTaskDelegate timeTask)
{
if (taskList.Count == 0 || timeTask == null)
return;
for (int i = 0; i < taskList.Count; i++)
{
if (taskList[i].TimeTaskCallBack==timeTask)
{
taskList.Remove(taskList[i]);
i--;
}
}
}
private void Update()
{
//驱动每一帧去检测
Tick();
}
/// <summary>
/// 检测定时任务是否达到执行要求
/// </summary>
private void Tick()
{
if (taskList == null)
return;
for (int i = 0; i < taskList.Count; i++)
{
taskList[i].TimeDelay -= Time.deltaTime;
if (taskList[i].TimeDelay<=0)
{
taskList[i].TimeTaskCallBack();
taskList[i].TimeDelay = taskList[i].TimeDelayOnly;
if (!taskList[i].IsRepeat)
{
taskList.Remove(taskList[i]);
i--;
}
}
}
}
}
该类有一个存放待执行任务的list,可以添加任务,和取消某任务。
还需要声明一个 计时任务的委托。
public delegate void TimeTaskDelegate();
接下来是任务类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 定时任务类
/// </summary>
public class TimerTask
{
//延迟时间
public float TimeDelay { set; get; }
//和延迟时间一样
public float TimeDelayOnly { get; set; }
//是否重复执行
public bool IsRepeat { set; get; }
//任务回调
public TimeTaskDelegate TimeTaskCallBack { set; get; }
public TimerTask(float _timeDelay,bool _isRepeat,TimeTaskDelegate _timeTaskDelegate)
{
TimeDelay = _timeDelay;
TimeDelayOnly = _timeDelay;
IsRepeat = _isRepeat;
TimeTaskCallBack = _timeTaskDelegate;
}
}
在写一个测试脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestTimerTask : MonoBehaviour
{
private void Start()
{
TimerTaskManager.Instance.AddTimeTask(6f, true, TestFunA);
TimerTaskManager.Instance.AddTimeTask(3f, true, TestFunB);
TimerTaskManager.Instance.AddTimeTask(2f, false, TestFunC);
}
private void TestFunA()
{
Debug.Log("任务A");
}
private void TestFunB()
{
Debug.Log("任务B");
}
private void TestFunC()
{
Debug.Log("任务C");
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
TimerTaskManager.Instance.RemoveTask(TestFunA);
}
}
}
最后输出结果: