开发基于C#语言实现的高效便捷计时器工具,可集成中在服务器(.net core/.net framework)以及Unity客户端环境中。定时任务可循环、可替换、可取消。可使用独立线程计时,也可以使用Update()驱动计时。自由集成,灵活性高。
开发目标:
1.支持时间定时
2.定时任务可循环,可取消,可替换
3.使用简单,调用方便
时间定时:
场景中创建一个Button组件,挂上GameRoot、TimerSystem脚本;
using UnityEngine;
public class GameRoot : MonoBehaviour {
private void Start()
{
TimerSystem timerSystem = GetComponent<TimerSystem>();
timerSystem.InitTimer();
}
public void ClickBtn()
{
Debug.Log("Add Time Task");
TimerSystem._instance.AddTimerTask(FuncA,3.0f);
}
void FuncA()
{
Debug.Log("Delay Log");
}
}
using System;
public class PETimeTask
{
public float destTime;//多少时间后执行任务
public Action callBack;// 要执行什么任务
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TimerSystem : MonoBehaviour
{
public static TimerSystem _instance;
private List<PETimeTask> mTimerTaskList = new List<PETimeTask>();
public void InitTimer()
{
_instance = this;
}
private void Update()
{
//遍历检测任务是否达到条件
for (int i = 0; i < mTimerTaskList.Count; i++)
{
PETimeTask timeTask = mTimerTaskList[i];
//任务时间超过当前时间
if (timeTask.destTime > Time.realtimeSinceStartup)
{
continue;
}
else
{
Action action = timeTask.callBack;
if (action != null)
{
action();
}
//移除已经完成的任务
mTimerTaskList.RemoveAt(i);
i--;
}
}
}
//添加计时器任务
public void AddTimerTask(Action callBack, float delay)
{
float destTime = Time.realtimeSinceStartup + delay;
PETimeTask task = new PETimeTask();
task.callBack = callBack;
task.destTime = destTime;
mTimerTaskList.Add(task);
}
}
以上实现类似协程的效果↑
如何支持多线程定时任务?
--通过临时列表进行缓存,错开操作时间
--避免使用锁,提高操作效率
添加临时缓存列表:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TimerSystem : MonoBehaviour
{
public static TimerSystem _instance;
private List<PETimeTask> mTimerTaskList = new List<PETimeTask>();
//临时缓存列表
private List<PETimeTask> mTempTimeTaskList = new List<PETimeTask>();
public void InitTimer()
{
_instance = this;
}
private void Update()
{
//加入缓存区中的定时任务
for (int tempIndex = 0; tempIndex < mTempTimeTaskList.Count; tempIndex++)
{
mTimerTaskList.Add(mTempTimeTaskList[tempIndex]);
}
mTempTimeTaskList.Clear();
//遍历检测任务是否达到条件
for (int i = 0; i < mTimerTaskList.Count; i++)
{
PETimeTask timeTask = mTimerTaskList[i];
//任务时间超过当前时间
if (timeTask.destTime > Time.realtimeSinceStartup)
{
continue;
}
else
{
Action action = timeTask.callBack;
if (action != null)
{
action();
}
//移除已经完成的任务
mTimerTaskList.RemoveAt(i);
i--;
}
}
}
//添加计时器任务
public void AddTimerTask(Action callBack, float delay)
{
float destTime = Time.realtimeSinceStartup + delay;
PETimeTask task = new PETimeTask();
task.callBack = callBack;
task.destTime = destTime;
mTempTimeTaskList.Add(task);
}
}
扩展时间单位:
统一换算成最小的单位毫秒进行运算
using System;
public class PETimeTask
{
public float destTime;//多少时间后执行任务 单位为毫秒
public Action callBack;// 要执行什么任务
}
扩展时间单位
public enum PETimeUnit
{
Millise,
Second,
Minute,
Hour,
Day
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TimerSystem : MonoBehaviour
{
public static TimerSystem _instance;
private List<PETimeTask> mTimerTaskList = new List<PETimeTask>();
//临时缓存列表
private List<PETimeTask> mTempTimeTaskList = new List<PETimeTask>();
public void InitTimer()
{
_instance = this;
}
//实现基础定时任务
private void Update()
{
//加入缓存区中的定时任务
for (int tempIndex = 0; tempIndex < mTempTimeTaskList.Count; tempIndex+