在Unity腳本中,有一些事件函數會在腳本執行時按預定順序執行。 該執行順序如下所述:
編輯
- Reset:Reset是用來初始化腳本屬性的,在第一次腳本附在對象上的時候和按下Reset按鈕的時候會被執行。
第一次場景加載
- Awake:Awake方法總是在Start方法執行之前和在一個prefab初始化後被調用。(如果一個gameobject處於inactive的狀態,則Awake不會被調用,一直會到gameobject處於active狀態的時候會被調用)
- OnEnable:(只有在對象處於活動狀態時纔會調用):在啓用對象後立即調用此函數, 當創建一個MonoBehaviour實例時會發生。例如,當一個關卡加載或者一個帶有腳本的GameObject實例化的時候。
- OnLevelWasLoaded:這個方法被執行,是爲了通知遊戲已經加載了新的關卡。
請注意,對於添加到場景中的對象,所有腳本的Awake和OnEnable函數將在調用其中的任何腳本的Start,Update等之前調用。 當然,在遊戲過程中對象被實例化時,這不能被強制執行。
在第一幀更新之前
- Start:只有在啓用腳本實例時,纔會在第一次幀更新之前調用Start。
對於添加到場景中的對象,對象上的所有腳本的Update函數執行之前調用Start函數。 當然,在遊戲過程中對象被實例化時,這不能被強制執行。
幀與幀之間
- OnApplicationPause:這個方法將在暫停鍵按下的那一幀結束的時候被調用。在調用OnApplicationPause之後會發出一個額外的幀,以允許遊戲顯示指示暫停狀態的圖形。
Update的順序
當你跟蹤遊戲邏輯和交互,動畫,相機位置等時,可以使用幾個不同的事件。 常用的模式是在Update函數中完成大部分的任務,不過也有其他一些函數可以利用。
- FixedUpdate:FixedUpdate通常比Update被調用得更頻繁。如果幀率很低的時候,FixedUpdate可以一幀被調用多次;如果幀率很高的時候,FixedUpdate也可以幾幀調用一次。所有的物理計算和更新都會在FixedUpdate後立即生效。在FixedUpdate中應用運動計算時,您不需要通過Time.deltaTime乘以您的值。 這是因爲FixedUpdate是在可靠的定時器上調用的,與幀速率無關。
- Update:Update函數每一幀調用一次。這是我們使用最頻繁的一個函數。
- LateUpdate:LateUpdate同樣也是每一幀調用一次,在Update函數結束之後被調用。LateUpdate常用於第三人稱攝像頭的實時跟隨。如果你在Update函數中讓角色移動或者轉彎,你可以把所有攝像頭的移動和旋轉計算都放到LateUpdate函數中。這可以確保在角色完成移動或者轉彎動作之後攝像頭纔開始跟隨。
渲染期間
- OnPreCull:在相機剔除場景之前調用。
- OnBecameVisible/OnBecameInvisible:當一個物體對任何相機變得可見/不可見時調用。
- OnWillRenderObject:如果對象可見,則爲每個攝像機調用一次。
- OnPreRender:在相機開始渲染場景之前調用。
- OnRenderObject:所有常規場景渲染完成後調用。 此時可以使用GL類或Graphics.DrawMeshNow繪製自定義幾何圖形。
- OnPostRender:相機完成渲染場景後調用。
- OnRenderImage:在場景渲染完成後調用,用來對圖像進行後期處理。
- OnGUI:每幀調用多次,用於響應GUI事件。Layout和Repaint事件首先被處理,然後是每個輸入事件的佈局和鍵盤/鼠標事件。
- OnDrawGizmos :用於在場景視圖中繪製Gizmos以進行可視化。
協程
正常的協程更新在Update函數返回之後調用。協程是一個函數,可以暫停執行(yield),直到給定的YieldInstruction完成。 Coroutines的不同用途:
- yield :所有的Update函數在下一幀被調用後,協程將繼續。
- yield WaitForSeconds:在指定的時間延遲後,調用所有Update函數之後,繼續。
- yield WaitForFixedUpdate:在所有腳本上調用所有FixedUpdate後繼續。
- yield WWW:一個WWW下載完成之後繼續。
- yield StartCoroutine:鏈接協程,會等MyFunc協程先完成。
當對象被銷燬的時候
- OnDestroy:對象存在的最後一幀更新完之後的所有update函數執行完之後執行。(對象可能在響應Object.Destroy或關閉場景時被銷燬)。
當中止的時候
這些函數被調用到場景中的所有活動對象上:
- OnApplicationQuit:在應用程序退出之前,所有遊戲對象都會調用該函數。 在編輯器中,當用戶停止播放模式時會調用它。
- OnDisable:當對象被禁用或不活動時,將調用此函數。
流程圖