先大體的給一個(gè)官方的Flowchart然后再說一些實(shí)際上可能出現(xiàn)的細(xì)節(jié)問題需了。
原圖地址:https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg
就常用的函數(shù)來說順序是這樣的:
Awake > OnEnable > Start > FixedUpdate > Update > LateUpdate > OnWillRenderObject > OnGUI
======================================================================================
然后說一下常見的問題:
FixedUpdate和Update問題:
Update每幀調(diào)用装盯,但因?yàn)闄C(jī)器的性能原因秽誊,幀數(shù)是波動(dòng)的掐场,所以這個(gè)函數(shù)的刷新時(shí)間是不規(guī)律的莹规。如果在Update中添加物體勻速運(yùn)動(dòng)颠悬,需要乘上Time.deltatime
FixedUpdate固定時(shí)間調(diào)用一次诱担,即一秒鐘調(diào)用的次數(shù)是固定的窑滞,如需更改頻率琼牧,可至Edit -> Project Setting -> Time中修改Fixed Timestep恢筝。如果同一次循環(huán)中出現(xiàn)FixedUpdate和Update那么FixedUpdate優(yōu)先,但不建議這兩個(gè)函數(shù)有依賴(因?yàn)閡pdate的刷新頻率一直在變啊巨坊,誰知道會(huì)發(fā)生什么)-
OnEnable和OnDisable函數(shù)都是一旦被setActive()修改撬槽,瞬間跳轉(zhuǎn)執(zhí)行。比如下圖的輸出是
“On Disable”
“Update”
雖然實(shí)際上是update先開始
image.png
如果setActive(false), 那么先跳轉(zhuǎn)OnDisable趾撵,然后進(jìn)入正常流程等待OnDestory
另外以下函數(shù):Awake恢氯,Start, FixedUpdate, Update, LateUpdate, OnWillRenderObject, OnGUI都是項(xiàng)目中所有激活的component的同時(shí)運(yùn)行的,比如:
“Awake code1”
“Awake code2”
......
"Update code1"
"Update code2"
......
而不是
“Awake code1”
“Start code1”
“Fixed code1”
......
“Awake code2”(這是錯(cuò)的)
......實(shí)際上如果給OnEnable輸出顯示應(yīng)該是這樣的
“Awake code1”
“OnEnable code1”
“Awake code2”
“OnEnable code2”
......
"Update code1"
"Update code2"
......
因?yàn)榫拖裎疑衔恼f的鼓寺,OnEnable和OnDisable是跳轉(zhuǎn)執(zhí)行的勋拟。
如果通過Instantiate一個(gè)原先場景中沒有的prefab,那么瞬間跳轉(zhuǎn)執(zhí)行完prefab中所以代碼的Awake和Enable妈候。關(guān)于所有Awake等函數(shù)內(nèi)部的順序敢靡,是后掛到激活的gameobject上的代碼,先運(yùn)行苦银⌒ル剩可以理解為unity用一個(gè)“棧”來維護(hù)所有component的運(yùn)行順序幔虏,和對(duì)應(yīng)gameobject掛入場景的順序無關(guān)纺念。但是OnWillRenderObject和OnGUI則不符合這個(gè)規(guī)律,他們有一套自己的先后順序標(biāo)準(zhǔn)想括。我們以后再研究陷谱。而且OnGUI一個(gè)循環(huán)內(nèi)會(huì)被調(diào)用多次。
關(guān)于StartCoroutine的問題瑟蜈,StartCoroutine(function())運(yùn)行的function會(huì)先運(yùn)行到y(tǒng)ield烟逊,然后
yield WaitForFixedUpdate的話則到下一個(gè)有Fixupdate的循環(huán)再接著運(yùn)行。
yield null(下次循環(huán)執(zhí)行)
yield WaitForSeconds(t)(等待 t 時(shí)間后接著執(zhí)行下面命令)InitializeOnLoad問題铺根,[InitializeOnLoad]的且有static構(gòu)造函數(shù)的類會(huì)隨著unity項(xiàng)目的運(yùn)行第一個(gè)運(yùn)行宪躯,如下圖例子
- 另外關(guān)于Reset()函數(shù)問題:Reset函數(shù)在項(xiàng)目運(yùn)行階段是不運(yùn)行的,只在編輯模式運(yùn)行位迂,用于初始化參數(shù):運(yùn)行方式有兩種 1.手動(dòng)Reset如下圖访雪,2.給gameobject第一次掛上該script
上文都是我自己測試總結(jié)出來的,如果有疏漏歡迎指出~