先大體的給一個官方的Flowchart然后再說一些實際上可能出現的細節問題。
原圖地址:https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg
就常用的函數來說順序是這樣的:
Awake > OnEnable > Start > FixedUpdate > Update > LateUpdate > OnWillRenderObject > OnGUI
======================================================================================
然后說一下常見的問題:
FixedUpdate和Update問題:
Update每幀調用,但因為機器的性能原因,幀數是波動的,所以這個函數的刷新時間是不規律的。如果在Update中添加物體勻速運動,需要乘上Time.deltatime
FixedUpdate固定時間調用一次,即一秒鐘調用的次數是固定的,如需更改頻率,可至Edit -> Project Setting -> Time中修改Fixed Timestep。如果同一次循環中出現FixedUpdate和Update那么FixedUpdate優先,但不建議這兩個函數有依賴(因為update的刷新頻率一直在變啊,誰知道會發生什么)-
OnEnable和OnDisable函數都是一旦被setActive()修改,瞬間跳轉執行。比如下圖的輸出是
“On Disable”
“Update”
雖然實際上是update先開始
image.png
如果setActive(false), 那么先跳轉OnDisable,然后進入正常流程等待OnDestory
另外以下函數:Awake,Start, FixedUpdate, Update, LateUpdate, OnWillRenderObject, OnGUI都是項目中所有激活的component的同時運行的,比如:
“Awake code1”
“Awake code2”
......
"Update code1"
"Update code2"
......
而不是
“Awake code1”
“Start code1”
“Fixed code1”
......
“Awake code2”(這是錯的)
......實際上如果給OnEnable輸出顯示應該是這樣的
“Awake code1”
“OnEnable code1”
“Awake code2”
“OnEnable code2”
......
"Update code1"
"Update code2"
......
因為就像我上文說的,OnEnable和OnDisable是跳轉執行的。
如果通過Instantiate一個原先場景中沒有的prefab,那么瞬間跳轉執行完prefab中所以代碼的Awake和Enable。關于所有Awake等函數內部的順序,是后掛到激活的gameobject上的代碼,先運行。可以理解為unity用一個“棧”來維護所有component的運行順序,和對應gameobject掛入場景的順序無關。但是OnWillRenderObject和OnGUI則不符合這個規律,他們有一套自己的先后順序標準。我們以后再研究。而且OnGUI一個循環內會被調用多次。
關于StartCoroutine的問題,StartCoroutine(function())運行的function會先運行到yield,然后
yield WaitForFixedUpdate的話則到下一個有Fixupdate的循環再接著運行。
yield null(下次循環執行)
yield WaitForSeconds(t)(等待 t 時間后接著執行下面命令)InitializeOnLoad問題,[InitializeOnLoad]的且有static構造函數的類會隨著unity項目的運行第一個運行,如下圖例子
- 另外關于Reset()函數問題:Reset函數在項目運行階段是不運行的,只在編輯模式運行,用于初始化參數:運行方式有兩種 1.手動Reset如下圖,2.給gameobject第一次掛上該script
上文都是我自己測試總結出來的,如果有疏漏歡迎指出~