1. 程式人生 > >Unity3D中自帶事件函式的執行順序

Unity3D中自帶事件函式的執行順序

在Unity3D指令碼中,有幾個Unity3D自帶的事件函式按照預定的順序執行作為指令碼執行。其執行順序如下:

編輯器(Editor)

  • Reset:Reset函式被呼叫來初始化指令碼屬性當指令碼第一次被附到物件上,並且在Reset命令被使用時也會呼叫。
    編者注:Reset是在使用者點選Inspector面板上Reset按鈕或者首次新增該元件時被呼叫。Reset最常用於在見識面板中給定一個預設值。

第一次場景載入(First Scene Load)
這些函式會在一個場景開始(場景中每個物體只調用一次)時被呼叫。

  • Awake:這個函式總是在任何Start()函式之前一個預設被例項化之後被呼叫,如果一個GameObject是非啟用的(inactive),在啟動期間Awake函式是不會被呼叫的直到它是活動的(active)。
  • OnEnable:只有在物件是啟用(active)狀態下才會被呼叫,這個函式只有在object被啟用(enable)後才會呼叫。這會發生在一個MonoBehaviour例項被建立,例如當一個關卡被載入或者一個帶有指令碼元件的GameObject被例項化。

注意:當一個場景被新增到場景中,所有指令碼上的Awake()和OnEable()函式將會被呼叫在Start()、Update()等它們中任何函式被呼叫之前。自然的,當一個物體在遊戲過程中被例項化時這不能被強制執行。

第一幀更新之前(Before the first frame update)

  • Start:只要指令碼例項被啟用了Start()函式將會在Update()函式第一幀之前被呼叫。

對於那些被新增到場景中的物體,所有指令碼上的Start()函式將會在它們中任何的Update()函式之前被呼叫,自然的,當一個物體在遊戲過程中被例項化時這不能被強制執行。

在幀之間(In between frames)

  • OnApplicationPause:這個函式將會被呼叫在暫停被檢測有效的在正常的幀更新之間的一幀的結束時。在OnApplicationPause被呼叫後將會有額外的一幀用來允許遊戲顯示顯示影象表示在暫停狀態下。

更新順序(Update Order)

當你在跟蹤遊戲邏輯和狀態,動畫,相機位置等的時候,有幾個不同的事件函式你可以使用。常見的模式是在Update()函式中執行大多數任務,但是也有其它的函式你可以使用。

  • FixedUpdate:FixedUpdate函式經常會比Update函式更頻繁的被呼叫。它一幀會被呼叫多次,如果幀率低它可能不會在幀之間被呼叫,就算幀率是高的。所有的圖形計算和更新在FixedUpdate之後會立即執行。當在FixedUpdate裡執行移動計算,你並不需要Time.deltaTime乘以你的值,這是因為FixedUpdate是按真實時間,獨立於幀率被呼叫的。
  • Update:Update每一幀都會被呼叫,對於幀更新它是主要的負荷函式。
  • LateUpdate:LateUpdate會在Update結束之後每一幀被呼叫,任何計算在Update裡執行結束當LateUpdate開始時。LateUpdate常用為第三人稱視角相機跟隨。

渲染(Rendering)

  • OnPreCull:在相機剔除場景前被呼叫。剔除是取決於哪些物體對於攝像機是可見的,OnPreCull僅在剔除起作用之前被呼叫。
  • OnBecameVisible/OnBecameInvisible:當一個物體對任意攝像機變得可見/不可見時被呼叫。
  • OnPreRender:在攝像機開始渲染場景之前呼叫。
  • OnRenderObject:在指定場景渲染完成之後呼叫,你可以使用GL類或者Graphics.DrawMeshNow 來繪製自定義幾何體在這裡。
  • OnPostRender:在攝像機完成場景渲染之後呼叫。
  • OnRenderImage(Pro Only):在場景徐然完成之後允許螢幕影象後期處理呼叫。
  • OnGUI:為了響應GUI事件,每幀會被呼叫多次(一般最低兩次)。佈局Layout和Repaint事件會首先處理,接下來處理的是是通過
    Layout和鍵盤/滑鼠事件對應的每個輸入事件。
  • OnDrawGizmos:用於視覺化的繪製一些小玩意在場景檢視中。

協同程式(Coroutines)

正常的協同程式更新是在Update函式返回之後執行。一個協同程式是可以暫停執行(yield)直到給出的依從指令(YieldInstruction )完成,寫成的不同運用:

  • yield:在所有的Update函式都已經被呼叫的下一幀該協程將持續執行。
  • yield WaitForSeconds:一段指定的時間延遲之後繼續執行,在所有的Update函式完成呼叫的那一幀之後。
  • yield WaitForFixedUpdate:所有指令碼上的FixedUpdate函式已經執行呼叫之後持續。
  • yield WWW:在WWW下載完成之後持續。
  • yield StartCoroutine:協同程式鏈,將會等到MuFunc函式協程執行完成首先。

銷燬(When the Object is Destroyed)

  • OnDestory:這個函式在會在一個物件銷燬前一幀呼叫,會在所有幀更新一個物件存在的最後一幀之後執行,物件也許會響應Object.Destroy 或一個場景關閉時被銷燬。

退出遊戲(When Quitting)
這些函式會在你場景中所有的啟用的物體上呼叫:

  • OnApplicationQuit:這個函式在應用退出之前的所有遊戲物體上呼叫,在編輯器(Editor)模式中會在使用者停止PlayMode時呼叫,在網頁播放器(web player)中會在網頁檢視關閉時呼叫。
  • OnDisable:當行為變為非啟用(disable)或非啟用(inactive)時呼叫。

指令碼的生命週期流程圖