using System.Collections.Generic;
using UnityEngine;
using System;
namespace XRTool.Util
{
public delegate void TimerHandler();
public delegate void TimerArgsHandler(System.Object[] args);
public class Timer
{
public TimerHandler Handler; //无参的委托
public TimerArgsHandler ArgsHandler; //带参数的委托
public float Frequency; //时间间隔
public int Repeats; //重复次数
public System.Object[] Args;
public float LastTickTime;
public event Action OnComplete; //计时器完成一次工作
public event Action OnDestroy; //计时器被销毁
public Timer() { }
///
/// 创建一个时间事件对象
///
/// 回调函数
/// 带参数的回调函数
/// 时间内执行
/// 重复次数
/// 参数 可以任意的传不定数量,类型的参数
public Timer(TimerHandler Handler, TimerArgsHandler ArgsHandler, float frequency, int repeats, System.Object[] Args)
{
this.Handler = Handler;
this.ArgsHandler = ArgsHandler;
this.Frequency = frequency;
this.Repeats = repeats == 0 ? 1 : repeats;
this.Args = Args;
this.LastTickTime = Time.time;
}
public void Notify()
{
if (Handler != null)
Handler();
if (ArgsHandler != null)
ArgsHandler(Args);
if (OnComplete != null)
{
OnComplete();
}
}
///
/// 清理计时器,初始化参数 同时清理事件
///
public void CleanUp()
{
Handler = null;
ArgsHandler = null;
Repeats = 1;
Frequency = 0;
if (OnDestroy != null)
{
OnDestroy();
}
OnDestroy = null;
OnComplete = null;
}
}
///
/// 计时器
/// 添加一个计时事件
/// 删除一个计时事件
/// 更新计时事件
///
public class TimerMgr : UnitySingleton
{
private List _Timers;//时间管理器
protected override void Awake()
{
DontDestroyOnLoad(gameObject);
if (_Timers == null)
{
_Timers = new List();
}
base.Awake();
}
///
/// 创建一个简单的计时器
///
/// 回调函数
/// 计时器时间
/// 回调次数 小于0代表循环 大于0代表repeats次
public Timer CreateTimer(TimerHandler callBack, float time, int repeats = 1)
{
return Create(callBack, null, time, repeats);
}
public Timer CreateTimerWithArgs(TimerArgsHandler callBack, float time, int repeats, params System.Object[] args)
{
return Create(null, callBack, time, repeats, args);
}
private Timer Create(TimerHandler callBack, TimerArgsHandler callBackArgs, float time, int repeats, params System.Object[] args)
{
Timer timer = new Timer(callBack, callBackArgs, time, repeats, args);
_Timers.Add(timer);
return timer;
}
public Timer DestroyTimer(Timer timer)
{
if (timer != null)
{
_Timers.Remove(timer);
timer.CleanUp();
timer = null;
}
return timer;
}
public void ClearAll()
{
if (_Timers != null)
{
for (int i = 0; i < _Timers.Count; i++)
{
_Timers[i].CleanUp();
}
_Timers.Clear();
}
}
///
/// 固定更新检查更新的频率
///
void Update()
{
if (_Timers.Count != 0)
{
for (int i = _Timers.Count - 1; i >= 0 && i < _Timers.Count; i--)
{
Timer timer = _Timers[i];
float curTime = Time.time;
if (timer.Frequency + timer.LastTickTime > curTime)
{
continue;
}
timer.LastTickTime = curTime;
if (timer.Repeats-- == 0)
{//计时完成,可以删除了
DestroyTimer(timer);
}
else
{//触发计时
timer.Notify();
}
}
}
}
}
}