- Timer类构建
- TimerManeger构建
实现了基本的计时、暂停、停止功能
支持最多三参数函数触发
未实现帧计时功能
using System;
using UnityEngine;
public class Timer
{
public bool onOff;//计时器开关
public float passTime;
public int passCount;
public int paramLevel;
public float firstTime;
public Tuple<int, float> loopSet;//循环配置元组
public bool isScale;
public dynamic action;
public dynamic param_1;
public dynamic param_2;
public dynamic param_3;
public void Update()
{
if (onOff)
{
if (isScale)
{
passTime += Time.deltaTime;
}
else
{
passTime += Time.unscaledDeltaTime;
}
if (loopSet == null)
{
if (passTime >= firstTime)
{
Trigger();
TimerManeger.Instance.Stop(this);
}
}
else if (loopSet.Item1 > 0)
{
if (passCount > 0)
{
if (passTime >= loopSet.Item2)
{
Trigger();
passCount++;
passTime = 0f;
}
}
else
{
if (passTime >= firstTime)
{
Trigger();
passCount++;
passTime = 0f;
}
}
if (passCount >= loopSet.Item1)
{
TimerManeger.Instance.Stop(this);
}
}
else if (loopSet.Item1 == 0)
{
if (passCount > 0)
{
if (passTime >= loopSet.Item2)
{
Trigger();
passTime = 0;
}
}
else
{
if (passTime >= firstTime)
{
Trigger();
passTime = 0;
}
}
}
}
}
private void Trigger()
{
switch (paramLevel)
{
case 0:
action();
break;
case 1:
action(param_1);
break;
case 2:
action(param_1, param_2);
break;
case 3:
action(param_1, param_2, param_3);
break;
default:
break;
}
}
}
TimerManeger构建
using System;
using System.Collections.Generic;
using UnityEngine.Events;
public class TimerManeger : SingletonMono<TimerManeger>
{
private List<Timer> idleTimers;
private UnityAction actions;
private void Start()
{
idleTimers = new List<Timer>();
}
private void Update()
{
if (actions != null)
{
actions();//触发
}
}
///
/// 开启计时器(无参)
/// 参数1:首次触发需要等待的时间
/// 参数2:触发函数
/// 参数3:循环配置元组
/// 参数4:是否受游戏时间缩放影响
///
public Timer StartTimer(float firstTime, UnityAction action, Tuple<int, float> loopSet = null, bool isScale = true)
{
Timer timer;
if (idleTimers.Count > 0)
{
timer = idleTimers[0];
idleTimers.RemoveAt(0);
}
else
{
timer = new Timer();
}
timer.firstTime = firstTime;
timer.action = action;
timer.loopSet = loopSet;
timer.isScale = isScale;
timer.paramLevel = 0;
timer.onOff = true;
actions += timer.Update;
return timer;
}
///
/// 开启计时器(一个参数)
///
public Timer StartTimer<T>(float firstTime, UnityAction<T> action, T param, Tuple<int, float> loopSet = null, bool isScale = true)
{
Timer timer;
if (idleTimers.Count > 0)
{
timer = idleTimers[0];
idleTimers.RemoveAt(0);
}
else
{
timer = new Timer();
}
timer.firstTime = firstTime;
timer.action = action;
timer.param_1 = param;
timer.loopSet = loopSet;
timer.isScale = isScale;
timer.paramLevel = 1;
timer.onOff = true;
actions += timer.Update;
return timer;
}
///
/// 开启计时器(两个参数)
///
public Timer StartTimer<T1, T2>(float firstTime, UnityAction<T1, T2> action, T1 param1, T2 param2, Tuple<int, float> loopSet = null, bool isScale = true)
{
Timer timer;
if (idleTimers.Count > 0)
{
timer = idleTimers[0];
idleTimers.RemoveAt(0);
}
else
{
timer = new Timer();
}
timer.firstTime = firstTime;
timer.action = action;
timer.param_1 = param1;
timer.param_2 = param2;
timer.loopSet = loopSet;
timer.isScale = isScale;
timer.paramLevel = 2;
timer.onOff = true;
actions += timer.Update;
return timer;
}
///
/// 开启计时器(三个参数)
///
public Timer StartTimer<T1, T2, T3>(float firstTime, UnityAction<T1, T2, T3> action, T1 param1, T2 param2, T3 param3, Tuple<int, float> loopSet = null, bool isScale = true)
{
Timer timer;
if (idleTimers.Count > 0)
{
timer = idleTimers[0];
idleTimers.RemoveAt(0);
}
else
{
timer = new Timer();
}
timer.firstTime = firstTime;
timer.action = action;
timer.param_1 = param1;
timer.param_2 = param2;
timer.param_3 = param3;
timer.loopSet = loopSet;
timer.isScale = isScale;
timer.paramLevel = 3;
timer.onOff = true;
actions += timer.Update;
return timer;
}
///
/// 暂停计时器
///
public void Pause(Timer timer)
{
timer.onOff = false;
}
///
/// 停止计时器
///
public void Stop(Timer timer)
{
timer.onOff = false;
timer.isScale = true;
timer.passTime = 0f;
timer.passCount = 0;
timer.paramLevel = -1;
timer.firstTime = 0f;
timer.loopSet = null;
timer.action = null;
timer.param_1 = null;
timer.param_2 = null;
timer.param_3 = null;
actions -= timer.Update;
idleTimers.Add(timer);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)