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

 

 

 

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM