Unity 常用的計時器寫法
阿新 • • 發佈:2020-06-28
第一種:每幀檢查
定義一個時間變數 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冷卻... ...等等,用途還是很廣泛的。
*** | 以上內容僅為學習參考、學習筆記使用 | ***