天天看點

Unity 事件函數的執行順序

在 Unity 腳本中,有許多事件函數在腳本執行時按預定的順序執行。這個執行順序如下所述:

首個場景加載

這些函數在場景開始時調用(對于場景中的每個對象調用一次)。

Awake:在所有 Start 函數之前,以及 prefab 執行個體化之後調用。(如果一個 GameObject 在啟動期間處于非活動狀态,則在激活之前不會調用它。)

OnEnable(僅在對象處于活動狀态時調用):在對象啟用後調用。這發生在建立 MonoBehaviour 執行個體時,例如加載關卡或執行個體化帶有腳本元件的 GameObject 時。

OnLevelWasLoaded:執行此函數是為了通知遊戲已加載新關卡。

注意,對于添加到場景中的對象,所有腳本的 Awake 和 OnEnable 函數都将在任何一個腳本調用 Start、Update 等之前調用。當然,對于在遊戲過程中已被執行個體化的對象,這些函數并不能強制執行。

編輯器

Reset:當腳本的屬性首次附加到對象時,以及使用 Reset 指令時,調用該函數來初始化腳本的屬性。

第一幀之前

Start:隻有在腳本執行個體被啟用時,才會在第一個幀更新之前調用 Start。

對于添加到場景中的對象,所有腳本的 Start 函數在 Update 等函數之前調用。當然,對于在遊戲過程中已被執行個體化的對象,這個函數并不能強制執行。

幀間

OnApplicationPause:在檢測到暫停的幀的末尾調用,在正常幀更新之間有效。在調用 OnApplicationPause之後,将會發出一個額外的幀,以允許遊戲顯示暫停狀态的圖形。

更新順序

當在跟蹤遊戲邏輯和互動,動畫,錄影機位置等時,可以使用一些不同的事件。常見的模式是在 Update 函數中執行大多數任務,但是也存在其他函數供調用。

FixedUpdate:FixedUpdate 通常比 Update 更頻繁地被調用。如果幀率很低,它可以在每幀中調用多次;如果幀率很高,它也可能根本不會在幀之間被調用。所有實體計算和更新在 FixedUpdate 調用後立即發生。在 FixedUpdate 中應用移動計算時,不需要将值乘以 Time.deltaTime。這是因為 FixedUpdate 是在一個可靠的定時器上調用的,與幀率無關。

Update:每幀調用一次 Update。它是幀更新的主要主力函數。

LateUpdate:在 Update 調用完成後,每幀調用一次 LateUpdate。在 Update 中執行的任何計算都将在 LateUpdate 開始之前完成。LateUpdate 的一個常用功能是第三人稱視角跟随相機。如果角色在 Update 中發生移動和旋轉,那麼相機的移動和旋轉就應該在 LateUpdate 中發生。這将確定角色在錄影機跟蹤其位置之前已經移動完成。

渲染

OnPreCull:在錄影機對場景進行剔除前被調用。剔除動作決定了哪些對象對相機可見。OnPreCull 在進行剔除動作之前調用。

OnBecameVisible/OnBecameInvisible:當對象對任意相機可見/不可見時調用。

OnWillRenderObject:如果對象可見,則每個相機調用一次。

OnPreRender:在相機開始渲染場景之前調用。

OnRenderObject:在所有正常場景渲染完成後調用。此時可以使用 GL 類或 Graphics.DrawMeshNow 來繪制自定義幾何圖形。

OnPostRender:在相機完成對場景的渲染後調用。

OnRenderImage:在場景渲染完成後調用,允許對圖像進行後處理。

OnGUI:響應 GUI 事件,每幀調用多次。首先處理布局和重繪事件,然後為每個輸入事件處理布局和鍵盤/滑鼠事件。

OnDrawGizmos:用于在 scene 視圖中繪制 Gizmo。

協程

一般的協程更新在 Update 函數傳回後運作。協程是一個函數,它可以暫停執行(yield),直到給定的 YieldInstruction 完成。協程的不同用法:

yield:下一幀的所有 Update 函數被調用後,協程繼續。

yield WaitForSeconds:延時特定時間後,在目前幀所有 Update 函數被調用之後繼續。

yield WaitForFixedUpdate:在所有腳本的 FixedUpdate 被調用後繼續。

yield WWW:在一個 WWW 下載下傳完成後繼續。

yield StartCoroutine:将協程鍊起來,并等待 MyFunc協程首先完成。

對象被銷毀

OnDestroy:在對象存在的最後一幀的所有更新之後調用(對象可能在會響應 Object.Destroy 時或在場景結束時被銷毀)。

退出

這些函數會調用場景中的所有活動對象:

OnApplicationQuit:在應用程式退出之前,将對所有遊戲對象調用此函數。在編輯器中,當使用者停止播放模式時調用它。

OnDisable:當行為被禁用或不活動時,将調用此函數。

更多unity2018的功能介紹請到paws3d爪爪學院查找。

繼續閱讀