Unity 常用的计时器写法
第一种:每帧检查
定义一个时间变量 timer,每帧都将这个时间减去帧间隔时间 Time.deltaTime,如果小于或者等于零,说明定时到了,执行相应功能的代码,将这个定时器重置。如下:
1 using UnityEngine; 2 3 public class Timer : MonoBehaviour 4 { 5 public float timer = 1.0f; 6 7 void Update() 8 { 9 timer -= Time.deltaTime; 10 if (timer <= 0) 11 { 12 Debug.Log(string.Format("计时器正在计时! Time={0}s", Time.time)); 13 timer = 1.0f; 14 } 15 } 16 }
计时效果:
也就是一秒内从第一个 Frame 到最后一个 Frame 所花的时间,所以不管设备是一秒60帧或者一秒30帧、24帧,值都会趋近于一。
就结果而言,deltaTime 是为了游戏公平性而产生的东西,因此最常用于位移(translate),但拿来计时也是可以的。
第二种:利用协程
启动一个协程,在协程中返回需要等待的时间。
协程简而言之就是执行一个可中断、可继续的函数,所以可以利用协程间隔几秒再执行下一个语句,把它当做计时器使用。如下:
1 using System.Collections; 2 using UnityEngine; 3 4 public class Timer : MonoBehaviour 5 { 6 void Start() 7 { 8 StartCoroutine(timer()); 9 } 10 11 IEnumerator timer() 12 { 13 while (true) 14 { 15 yield return new WaitForSeconds(1.0f); 16 Debug.Log(string.Format("计时器正在计时!time={0}s", Time.time)); 17 } 18 } 19 }
计时效果:
第三种:延迟调用
使用 MonoBehaviour.InvokeRepeating,三个参数分别是要调用的方法、第一次调用的时间和间隔调用的时间。如下:
1 using UnityEngine; 2 3 public class Timer : MonoBehaviour 4 { 5 void Start() 6 { 7 InvokeRepeating("timer", 0f, 1.0f); 8 } 9 10 void timer() 11 { 12 Debug.Log(string.Format("计时器正在计时!time={0}s", Time.time)); 13 } 14 }
计时效果:
InvokeRepeating 与 StartCoroutine 一样,是可以中断的,只要使用 CancelInvoke()。
这最常使用在怪物、敌人以及道具生成的时候,比如可以设定第一波怪物在游戏开始10秒后出现,之后每隔0.5秒召唤一只怪物。
总结:
这三种都是常用的计时器方法,可以拿来读取时间;
而配合所要使用值的不同,就可以拿来当作游戏时间、Combo、倒计时、CD冷却... ...等等,用途还是很广泛的。
*** | 以上内容仅为学习参考、学习笔记使用 | ***