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冷却... ...等等,用途还是很广泛的。

*** |  以上内容仅为学习参考、学习笔记使用  | ***

猜你喜欢

转载自www.cnblogs.com/ChenZiRong1999/p/13201359.html
今日推荐