在Unity3D繼承自MonoBehavior的腳本中弯囊,有幾個(gè)Unity3D自帶的事件函數(shù)按照預(yù)定的順序執(zhí)行作為腳本執(zhí)行。其執(zhí)行順序如下:
編輯器(Editor)
-
Reset:Reset函數(shù)被調(diào)用來初始化腳本屬性當(dāng)腳本第一次被附到對(duì)象上铜秆,并且在Reset命令被使用時(shí)也會(huì)調(diào)用械蹋。
編者注:Reset是在用戶點(diǎn)擊Inspector面板上Reset按鈕或者首次添加該組件時(shí)被調(diào)用。Reset最常用于在見識(shí)面板中給定一個(gè)默認(rèn)值裆蒸。
第一次場(chǎng)景加載(First Scene Load)
這些函數(shù)會(huì)在一個(gè)場(chǎng)景開始(場(chǎng)景中每個(gè)物體只調(diào)用一次)時(shí)被調(diào)用。
- Awake:這個(gè)函數(shù)總是在任何Start()函數(shù)之前一個(gè)預(yù)設(shè)被實(shí)例化之后被調(diào)用搀暑,如果一個(gè)GameObject是非激活的(inactive)沥阳,在啟動(dòng)期間Awake函數(shù)是不會(huì)被調(diào)用的直到它是活動(dòng)的(active)。
- OnEnable:只有在對(duì)象是激活(active)狀態(tài)下才會(huì)被調(diào)用自点,這個(gè)函數(shù)只有在object被啟用(enable)后才會(huì)調(diào)用桐罕。這會(huì)發(fā)生在一個(gè)MonoBehaviour實(shí)例被創(chuàng)建,例如當(dāng)一個(gè)關(guān)卡被加載或者一個(gè)帶有腳本組件的GameObject被實(shí)例化桂敛。
注意:當(dāng)一個(gè)場(chǎng)景被添加到場(chǎng)景中功炮,所有腳本上的Awake()和OnEable()函數(shù)將會(huì)被調(diào)用在Start()、Update()等它們中任何函數(shù)被調(diào)用之前术唬。自然的薪伏,當(dāng)一個(gè)物體在游戲過程中被實(shí)例化時(shí)這不能被強(qiáng)制執(zhí)行。
第一幀更新之前(Before the first frame update)
- Start:只要腳本實(shí)例被啟用了Start()函數(shù)將會(huì)在Update()函數(shù)第一幀之前被調(diào)用粗仓。
對(duì)于那些被添加到場(chǎng)景中的物體嫁怀,所有腳本上的Start()函數(shù)將會(huì)在它們中任何的Update()函數(shù)之前被調(diào)用,自然的借浊,當(dāng)一個(gè)物體在游戲過程中被實(shí)例化時(shí)這不能被強(qiáng)制執(zhí)行塘淑。
在幀之間(In between frames)
- OnApplicationPause:這個(gè)函數(shù)將會(huì)被調(diào)用在暫停被檢測(cè)有效的在正常的幀更新之間的一幀的結(jié)束時(shí)。在OnApplicationPause被調(diào)用后將會(huì)有額外的一幀用來允許游戲顯示顯示圖像表示在暫停狀態(tài)下蚂斤。
更新順序(Update Order)
當(dāng)你在跟蹤游戲邏輯和狀態(tài)存捺,動(dòng)畫,相機(jī)位置等的時(shí)候曙蒸,有幾個(gè)不同的事件函數(shù)你可以使用捌治。常見的模式是在Update()函數(shù)中執(zhí)行大多數(shù)任務(wù),但是也有其它的函數(shù)你可以使用纽窟。
- FixedUpdate:FixedUpdate函數(shù)經(jīng)常會(huì)比Update函數(shù)更頻繁的被調(diào)用肖油。它一幀會(huì)被調(diào)用多次,如果幀率低它可能不會(huì)在幀之間被調(diào)用臂港,就算幀率是高的构韵。所有的圖形計(jì)算和更新在FixedUpdate之后會(huì)立即執(zhí)行。當(dāng)在FixedUpdate里執(zhí)行移動(dòng)計(jì)算趋艘,你并不需要Time.deltaTime乘以你的值,這是因?yàn)镕ixedUpdate是按真實(shí)時(shí)間凶朗,獨(dú)立于幀率被調(diào)用的瓷胧。
- Update:Update每一幀都會(huì)被調(diào)用,對(duì)于幀更新它是主要的負(fù)荷函數(shù)棚愤。
- LateUpdate:LateUpdate會(huì)在Update結(jié)束之后每一幀被調(diào)用搓萧,任何計(jì)算在Update里執(zhí)行結(jié)束當(dāng)LateUpdate開始時(shí)杂数。LateUpdate常用為第三人稱視角相機(jī)跟隨。
渲染(Rendering)
- OnPreCull:在相機(jī)剔除場(chǎng)景前被調(diào)用瘸洛。剔除是取決于哪些物體對(duì)于攝像機(jī)是可見的揍移,OnPreCull僅在剔除起作用之前被調(diào)用。
- OnBecameVisible/OnBecameInvisible:當(dāng)一個(gè)物體對(duì)任意攝像機(jī)變得可見/不可見時(shí)被調(diào)用反肋。
- OnPreRender:在攝像機(jī)開始渲染場(chǎng)景之前調(diào)用那伐。
- OnRenderObject:在指定場(chǎng)景渲染完成之后調(diào)用,你可以使用GL類或者Graphics.DrawMeshNow 來繪制自定義幾何體在這里石蔗。
- OnPostRender:在攝像機(jī)完成場(chǎng)景渲染之后調(diào)用罕邀。
- OnRenderImage(Pro Only):在場(chǎng)景徐然完成之后允許屏幕圖像后期處理調(diào)用。
-
OnGUI:為了響應(yīng)GUI事件养距,每幀會(huì)被調(diào)用多次(一般最低兩次)诉探。布局Layout和Repaint事件會(huì)首先處理,接下來處理的是是通過
Layout和鍵盤/鼠標(biāo)事件對(duì)應(yīng)的每個(gè)輸入事件棍厌。 - OnDrawGizmos:用于可視化的繪制一些小玩意在場(chǎng)景視圖中肾胯。
協(xié)同程序(Coroutines)
正常的協(xié)同程序更新是在Update函數(shù)返回之后運(yùn)行。一個(gè)協(xié)同程序是可以暫停執(zhí)行(yield)直到給出的依從指令(YieldInstruction )完成耘纱,寫成的不同運(yùn)用:
- yield:在所有的Update函數(shù)都已經(jīng)被調(diào)用的下一幀該協(xié)程將持續(xù)執(zhí)行敬肚。
- yield WaitForSeconds:一段指定的時(shí)間延遲之后繼續(xù)執(zhí)行,在所有的Update函數(shù)完成調(diào)用的那一幀之后揣炕。
- yield WaitForFixedUpdate:所有腳本上的FixedUpdate函數(shù)已經(jīng)執(zhí)行調(diào)用之后持續(xù)帘皿。
- yield WWW:在WWW下載完成之后持續(xù)。
- yield StartCoroutine:協(xié)同程序鏈畸陡,將會(huì)等到MuFunc函數(shù)協(xié)程執(zhí)行完成首先鹰溜。
銷毀(When the Object is Destroyed)
- OnDestory:這個(gè)函數(shù)在會(huì)在一個(gè)對(duì)象銷毀前一幀調(diào)用,會(huì)在所有幀更新一個(gè)對(duì)象存在的最后一幀之后執(zhí)行丁恭,對(duì)象也許會(huì)響應(yīng)Object.Destroy 或一個(gè)場(chǎng)景關(guān)閉時(shí)被銷毀曹动。
退出游戲(When Quitting)
這些函數(shù)會(huì)在你場(chǎng)景中所有的激活的物體上調(diào)用:
- OnApplicationQuit:這個(gè)函數(shù)在應(yīng)用退出之前的所有游戲物體上調(diào)用,在編輯器(Editor)模式中會(huì)在用戶停止PlayMode時(shí)調(diào)用牲览,在網(wǎng)頁播放器(web player)中會(huì)在網(wǎng)頁視圖關(guān)閉時(shí)調(diào)用墓陈。
- OnDisable:當(dāng)行為變?yōu)榉菃⒂茫╠isable)或非激活(inactive)時(shí)調(diào)用。
腳本的生命周期流程圖