在學習Unity時,掌握如何編寫腳本是必須掌握的一項基本技能。但是關於Unity的游戲腳本中各函數的生命周期是怎樣開始和結束的,它們的執行順序是如何安排的?這一點我們要清楚的了解。
我們知道Unity中的腳本大多派生於MonoBehaviour類,所以可以重寫MonoBehaviour類里面的方法來實現我們想要的功能。那么自定義腳本中的各函數執行順序和MonoBehaviour里面的函數執行順序大致是一樣的。
首先介紹一下MonoBehaviour類里面的成員變量和成員函數。
1 public class MonoBehaviour : Behaviour 2 { 3 public MonoBehaviour(); 4 5 public bool useGUILayout { get; set; } 6 7 public void CancelInvoke(); 8 public void CancelInvoke(string methodName); 9 public void Invoke(string methodName, float time); 10 public void InvokeRepeating(string methodName, float time, float repeatRate); 11 public bool IsInvoking(); 12 public bool IsInvoking(string methodName); 13 public static void print(object message); 14 public Coroutine StartCoroutine(IEnumerator routine); 15 [ExcludeFromDocs] 16 public Coroutine StartCoroutine(string methodName); 17 public Coroutine StartCoroutine(string methodName, object value); 18 public Coroutine StartCoroutine_Auto(IEnumerator routine); 19 public void StopAllCoroutines(); 20 public void StopCoroutine(Coroutine routine); 21 public void StopCoroutine(IEnumerator routine); 22 public void StopCoroutine(string methodName); 23 }
注:對於MonoBehaviour類的成員變量和成員函數,只作一些相關介紹,具體的使用方法在以后會陸續進行舉例說明。或者可以參考Unity的API手冊。
Variables 變量
useGUILayout 禁用此項,將會跳過GUILayout布局階段
Functions 函數
- Invoke 原型:void Invoke(string methodName,float time);根據時間調用指定方法名的方法。
- InvokeRepeating 原型:void InvokeRepeating (methodName : string, time : float, repeatRate : float);每隔指定時間調用指定方法名的方法,從第一次調用開始,每隔repeatRate時間調用一次.
- CancelInvoke 原型:void CancelInvoke ();取消這個MonoBehaviour上的所有調用。void CancelInvoke(string methodName);取消所有名為methodName的調用。
- IsInvoking 原型:bool IsInvoking(string methodName);某指定函數是否在等候調用。正在調用返回true,否則返回false。
- StartCoroutine 原型:Coroutine StartCoroutine(IEnumerator routine);開始協同程序。
- StopCoroutline 停止methodName的所有協同程序。
- StopAllCoroutline 停止所有動作的協同程序。
Overridable Functions 可重寫函數
- Update 原型:void Update();當MonoBehaviour啟用時,Update函數在每一幀被調用。
-
LateUpdate 原型:void LateUpdate();當MonoBehaviour啟用時,LateUpdate函數在每一幀被調用。LateUpdate是在所有Update函數調用后被調用。這可用於調整腳本執行順序。
-
FixedUpdate 原型:void FixedUpdate();當MonoBehaviour啟用時,FixedUpdate函數在每一幀被調用。
-
Awake 原型:void Awake();當腳本實例被載入時Awake被調用。Awake用於在游戲開始之前初始化變量或游戲狀態。在腳本整個生命周期內它僅被調用一次。
-
Start 原型:void Start();Start僅在Update函數第一次被調用前調用。和Awake不同的是,Awake函數的調用要早於Start,並且Start函數只在腳本實例被啟用時調用。
-
Reset 原型:void Reset();重置為默認值。Reset是在用戶點擊檢視面板的Reset按鈕或者首次添加該組件時被調用。此函數只在編輯模式下被調用。Reset最常用於在檢視面板中給定一個最常用的默認值。
以上是常用的成員函數,還有一些成員函數是關於鼠標操作事件的,比如:OnMouseOver(),OnMouseEnter()等。
另外OnGUI()函數也是比較常用的,它主要負責窗口控件的渲染和管理。
接下來附上一張官方文檔對腳本中各函數生命周期的圖表:
圖片來源於:http://docs.unity3d.com/Manual/ExecutionOrder.html
可見Unity腳本從創建到銷毀是具有一個完整的生命周期的,主要的調用順序如下:
OnGUI函數會在每幀上多次被調用,因為要時刻准備相應里面的GUI事件。