Unity3D中自帶事件函數的執(zhí)行順序

在Unity3D繼承自MonoBehavior的腳本中,有幾個Unity3D自帶的事件函數按照預定的順序執(zhí)行作為腳本執(zhí)行。其執(zhí)行順序如下:

編輯器(Editor)

  • Reset:Reset函數被調用來初始化腳本屬性當腳本第一次被附到對象上,并且在Reset命令被使用時也會調用。
    編者注:Reset是在用戶點擊Inspector面板上Reset按鈕或者首次添加該組件時被調用。Reset最常用于在見識面板中給定一個默認值。

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

  • Awake:這個函數總是在任何Start()函數之前一個預設被實例化之后被調用,如果一個GameObject是非激活的(inactive),在啟動期間Awake函數是不會被調用的直到它是活動的(active)。
  • OnEnable:只有在對象是激活(active)狀態(tài)下才會被調用,這個函數只有在object被啟用(enable)后才會調用。這會發(fā)生在一個MonoBehaviour實例被創(chuàng)建,例如當一個關卡被加載或者一個帶有腳本組件的GameObject被實例化。

注意:當一個場景被添加到場景中,所有腳本上的Awake()和OnEable()函數將會被調用在Start()、Update()等它們中任何函數被調用之前。自然的,當一個物體在游戲過程中被實例化時這不能被強制執(zhí)行。

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

  • Start:只要腳本實例被啟用了Start()函數將會在Update()函數第一幀之前被調用。

對于那些被添加到場景中的物體,所有腳本上的Start()函數將會在它們中任何的Update()函數之前被調用,自然的,當一個物體在游戲過程中被實例化時這不能被強制執(zhí)行。

在幀之間(In between frames)

  • OnApplicationPause:這個函數將會被調用在暫停被檢測有效的在正常的幀更新之間的一幀的結束時。在OnApplicationPause被調用后將會有額外的一幀用來允許游戲顯示顯示圖像表示在暫停狀態(tài)下。

更新順序(Update Order)

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

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

渲染(Rendering)

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

協(xié)同程序(Coroutines)

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

  • yield:在所有的Update函數都已經被調用的下一幀該協(xié)程將持續(xù)執(zhí)行。
  • yield WaitForSeconds:一段指定的時間延遲之后繼續(xù)執(zhí)行,在所有的Update函數完成調用的那一幀之后。
  • yield WaitForFixedUpdate:所有腳本上的FixedUpdate函數已經執(zhí)行調用之后持續(xù)。
  • yield WWW:在WWW下載完成之后持續(xù)。
  • yield StartCoroutine:協(xié)同程序鏈,將會等到MuFunc函數協(xié)程執(zhí)行完成首先。

銷毀(When the Object is Destroyed)

  • OnDestory:這個函數在會在一個對象銷毀前一幀調用,會在所有幀更新一個對象存在的最后一幀之后執(zhí)行,對象也許會響應Object.Destroy 或一個場景關閉時被銷毀。

退出游戲(When Quitting)
這些函數會在你場景中所有的激活的物體上調用:

  • OnApplicationQuit:這個函數在應用退出之前的所有游戲物體上調用,在編輯器(Editor)模式中會在用戶停止PlayMode時調用,在網頁播放器(web player)中會在網頁視圖關閉時調用。
  • OnDisable:當行為變?yōu)榉菃⒂茫╠isable)或非激活(inactive)時調用。

腳本的生命周期流程圖

vital.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 更新:【面試題含答案】http://bbs.9ria.com/thread-288394-1-1.html 高頻問...
    好怕怕閱讀 5,081評論 3 53
  • 111. [動畫系統(tǒng)]如何將其他類型的動畫轉換成關鍵幀動畫? 動畫->點緩存->關鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 13,518評論 3 88
  • 一:什么是協(xié)同程序? 答:在主線程運行時同時開啟另一段邏輯處理,來協(xié)助當前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一...
    好怕怕閱讀 4,028評論 2 23
  • 一:什么是協(xié)同程序? 在主線程運行的同時開啟另一段邏輯處理,來協(xié)助當前程序的執(zhí)行,協(xié)程很像多線程,但是不是多線程,...
    胤醚貔貅閱讀 2,221評論 0 13
  • 可參看 http://wiki.ceeger.com/script:unityengine:classes...
    游戲開發(fā)小Y閱讀 1,402評論 0 0

友情鏈接更多精彩內容