1: 为什么我们要自己造轮子来做定时器系统
传统的Unity做定时器的方式有三种,总结如下:
(1) 在组件类里面定义一个变量,每次Update的时候,累积时间,当时间到达特定的阈值时, 触发函数调用。
源码素材视频教程可以进入学习交流小组领取
void Update() {
float dt = Time.deltaTime;
this.passedTime += dt;
if(this.passedTime >= 阈值) {
doSomeThing();
this.passedTime -= 阈值;
}
}
(2) 使用协程,来做定时器等待。
yeild return new WaitForSecond(5.0f);
// 5秒后做相关的事情
doSomeThing();
(3) 组件类MonoBehaviour 接口 Invoke,来做定时器 this.Invoke("doSomeThing", 5);
上面三种方法都有自己的缺点,第(1)(2)种使用起来不方便, 第(3)种节点隐藏后不方便触发,不方便掉其他代码里面的回调函数,不方便传递参数。
所以我们在项目里面决定自己造轮子,来打造一个Timer模块,处理游戏种的各种定时器需求。
2: 定时器系统的核心原理是什么?
每个定时器对象是一个Timer, 添加的时候交给定时器管理系统, 定时器系统负责管理所有的定时器对象,每次游戏Update的时候,遍历里面的每个定时器对象,
把它们过去的时间增加Time.deltaTime, 当过去的时间达到定时器触发时间的时候,触发定时器