在 Unity 項目開發中,延遲執行一段代碼、一個方法甚至幾個方法的情況是普遍存在的。
一般會用到 Invoke 和 InvokeRepeating 方法。
第一個參數為方法名(注意是字符串形式),並不是更方便的委托;
第二個參數是延遲執行的時間;
這個方法只會執行一次。
第一個參數同樣為方法名(字符串形式);
第二個參數是延遲多少秒后開始調用;
第三個參數是每次執行的間隔時間。
到這里就會發現,這兩個方法都有個弊端,就是必須輸入字符串形式的方法名!
也就是說,如果想延遲執行某段代碼,必須把代碼放在某個方法里,然后使用 Invoke 或者 InvokeRepeating 方法來延遲執行。
這樣對於上下文變量、屬性的引用就會尤為不便,而且不能傳入參數。
也可以利用 StartCoroutine 來執行一個以 IEnumerator 為返回值的方法,但這種方法通常用於異步下載、加載等比較耗時又不能讓游戲卡死的情況。
還有一個 WaitForSeconds 類,它是一個構造函數,也適用於延遲執行的情況。
將延遲方法放在一個類里以靜態方法的形式存在,就可以在任何時候、任何地方延遲執行指定時間的代碼:
1 using System; 2 using System.Collections; 3 using UnityEngine; 4 5 public class DelayTest : MonoBehaviour 6 { 7 public static IEnumerator DelayToInvoke(Action action, float delaySeconds) 8 { 9 yield return new WaitForSeconds(delaySeconds); 10 action(); 11 } 12 }
例如:點擊 OnGUI 的按鈕去延遲更改界面上的顯示文本
1 private string textTestString = "點擊開始測試!"; 2 3 void OnGUI() 4 { 5 GUI.BeginGroup(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 50, 300, 300)); 6 GUI.Box(new Rect(0, 0, 200, 200), "測試界面"); 7 GUI.Label(new Rect(60, 50, 150, 30), textTestString); 8 if (GUI.Button(new Rect(50, 120, 100, 30), "開始測試")) 9 { 10 textTestString = "測試延遲中... ..."; 11 StartCoroutine(DelayTest.DelayToInvoke(() => { textTestString = "延遲測試結束!"; }, 1f)); 12 } 13 GUI.EndGroup(); 14 }
textTestString = "延遲測試結束!"; 就是想要延遲執行的代碼段。
測試結果:
*** | 以上內容僅為學習參考、學習筆記使用 | ***