【轉】unity中事件函數的執行順序

在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:當對象被禁用或不活動時,將調用此函數。

流程圖

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章