定时器的功能是每隔一段时间执行一些函数(发送一些信息)
下面是在Unity里用c#实现的定时器功能
using UnityEngine;
public class Timer
{
/// <summary>
/// 使用该类封装float,使Timer中的UpdateTime与外界共享同一数据
/// 在外界更改间隔时间则就不用重新更新Timer中的数据
/// </summary>
[System.Serializable]
public class FloatTime
{
public float value;
}
public delegate void EventHandler();
public event EventHandler EventHandle;
public bool IsPause { set; get; } = false;
public FloatTime UpdateTime { set; get; }
private float passTime;
/// <summary>
/// 请在每一帧调用更新,在一帧中事件最多只会触发一次,若要触发多次请调用StayUpdate
/// </summary>
public void Update()
{
if (IsPause)
return;
passTime += Time.deltaTime;
if (passTime >= UpdateTime.value)
{
passTime -= UpdateTime.value;
EventHandle();
}
}
/// <summary>
/// 请在每一帧调用更新,在一帧中事件会触发多次(可能会卡帧),若要限制每帧只能触发一次请调用Update
/// </summary>
public void StayUpdate()
{
if (IsPause)
return;
passTime += Time.deltaTime;
while (passTime >= UpdateTime.value)
{
passTime -= UpdateTime.value;
EventHandle();
}
}
/// <summary>
/// 使用Time.unscaledDeltaTime版本
/// </summary>
public void UnscaleUpdate()
{
if (IsPause)
return;
passTime += Time.unscaledDeltaTime;
if (passTime >= UpdateTime.value)
{
passTime -= UpdateTime.value;
EventHandle();
}
}
/// <summary>
/// 使用Time.unscaledDeltaTime版本
/// </summary>
public void UnscaleStayUpdate()
{
if (IsPause)
return;
passTime += Time.unscaledDeltaTime;
while (passTime >= UpdateTime.value)
{
passTime -= UpdateTime.value;
EventHandle();
}
}
/// <summary>
/// 重置定时器的工作状态
/// </summary>
public void Stop()
{
IsPause = true;
passTime = 0;
}
}
把float在封装一层是为了让需要该类的引用,让Timer内的更新时间与外部用户自己存储的更新时间字段同步更新。这样用户自己储存的更新时间字段改变就不需要对Timer对象的更新时间字段重新赋值。
在Timer里的EventHandle属性中注册触发事件
测试代码:
public class BublbesCreator : MonoBehaviour
{
public Timer.FloatTime emitDeltaTime;//发射气泡的时间间隔,会被Unity自动实例化
private Timer createTimer = new Timer();//计时器
void Start()
{
createTimer.EventHandle += () => CreateBubble();//注册事件
createTimer.UpdateTime = emitDeltaTime;//引用事件间隔的字段
}
void Update()
{
createTimer.Update();//执行计时器更新
}
void CreateBubble()
{
//Dosomething,你的代码
}
}