Unity MonoBehaviour 生命周期整理

先大體的給一個官方的Flowchart然后再說一些實際上可能出現的細節問題。

image.png

原圖地址:https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg

就常用的函數來說順序是這樣的:
Awake > OnEnable > Start > FixedUpdate > Update > LateUpdate > OnWillRenderObject > OnGUI

======================================================================================
然后說一下常見的問題:

  1. FixedUpdate和Update問題:
    Update每幀調用,但因為機器的性能原因,幀數是波動的,所以這個函數的刷新時間是不規律的。如果在Update中添加物體勻速運動,需要乘上Time.deltatime
    FixedUpdate固定時間調用一次,即一秒鐘調用的次數是固定的,如需更改頻率,可至Edit -> Project Setting -> Time中修改Fixed Timestep。如果同一次循環中出現FixedUpdate和Update那么FixedUpdate優先,但不建議這兩個函數有依賴(因為update的刷新頻率一直在變啊,誰知道會發生什么)

  2. OnEnable和OnDisable函數都是一旦被setActive()修改,瞬間跳轉執行。比如下圖的輸出是
    “On Disable”
    “Update”
    雖然實際上是update先開始


    image.png

    如果setActive(false), 那么先跳轉OnDisable,然后進入正常流程等待OnDestory

  3. 另外以下函數:Awake,Start, FixedUpdate, Update, LateUpdate, OnWillRenderObject, OnGUI都是項目中所有激活的component的同時運行的,比如:
    “Awake code1”
    “Awake code2”
    ......
    "Update code1"
    "Update code2"
    ......
    而不是
    “Awake code1”
    “Start code1”
    “Fixed code1”
    ......
    “Awake code2”(這是錯的)
    ......

  4. 實際上如果給OnEnable輸出顯示應該是這樣的
    “Awake code1”
    “OnEnable code1”
    “Awake code2”
    “OnEnable code2”
    ......
    "Update code1"
    "Update code2"
    ......
    因為就像我上文說的,OnEnable和OnDisable是跳轉執行的。
    如果通過Instantiate一個原先場景中沒有的prefab,那么瞬間跳轉執行完prefab中所以代碼的Awake和Enable。

  5. 關于所有Awake等函數內部的順序,是后掛到激活的gameobject上的代碼,先運行。可以理解為unity用一個“棧”來維護所有component的運行順序,和對應gameobject掛入場景的順序無關。但是OnWillRenderObject和OnGUI則不符合這個規律,他們有一套自己的先后順序標準。我們以后再研究。而且OnGUI一個循環內會被調用多次。

  6. 關于StartCoroutine的問題,StartCoroutine(function())運行的function會先運行到yield,然后
    yield WaitForFixedUpdate的話則到下一個有Fixupdate的循環再接著運行。
    yield null(下次循環執行)
    yield WaitForSeconds(t)(等待 t 時間后接著執行下面命令)

  7. InitializeOnLoad問題,[InitializeOnLoad]的且有static構造函數的類會隨著unity項目的運行第一個運行,如下圖例子

image.png
image.png
  1. 另外關于Reset()函數問題:Reset函數在項目運行階段是不運行的,只在編輯模式運行,用于初始化參數:運行方式有兩種 1.手動Reset如下圖,2.給gameobject第一次掛上該script
image.png
image.png

上文都是我自己測試總結出來的,如果有疏漏歡迎指出~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、下面我們來學習下腳本生命周期常用的10個腳本函數: (1) Reset() 組件重設為默認值時(只用于編輯狀態...
    李昀熹1112閱讀 22,547評論 0 12
  • Unity技術面試題 一:什么是協同程序? 答:在主線程運行時同時開啟另一段邏輯處理,來協助當前程序的執行。換句話...
    沐冉閱讀 2,909評論 1 19
  • [Unity]技術學習路線圖(長期更新) Unity技術面試題 一:什么是協同程序?答:在主線程運行時同時開啟另一...
    肖浩唄閱讀 23,634評論 15 243
  • 背景和概述 Unity Networking是官方自Unity5.1以來推出的新網絡通信解決方案。UNet是非官方...
    DonaldW閱讀 6,198評論 2 9
  • 母親是水鄉人,記事時腦子里滿是隨母親回娘家的情景。 作為一個在土里生長的孩子對坐船是向往的。身邊的小伙伴也總...
    薄荷羽閱讀 272評論 0 1