1. 程式人生 > >unity中事件函式的執行順序【超詳細,圖+文】

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:當物件被禁用或不活動時,將呼叫此函式。

流程圖

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述