1. 程式人生 > 實用技巧 >Unity 常用的計時器寫法

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冷卻... ...等等,用途還是很廣泛的。

*** | 以上內容僅為學習參考、學習筆記使用 | ***