unity腳本自帶函數執行順序

在unity的腳本中,有大量的腳本執行按照預先確定的順序執行的事件函數,由於篇幅有限,無法一一列舉,這裏只列舉一些常用的自帶函數的順序,並論述他們之間的區別。
在Unity腳本中常用到的函數就是下面這些,他們的順序也是按照箭頭的方向執行的。
Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy
秉着實踐是檢驗真理的唯一標準,咱們可以將下面腳本掛在一個物體運行,從打印結果中便可以看到執行順序

[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片

  1. void Awake()  

  2. {  

  3.     print("Here is Awake");  

  4. }  

  5.   

  6.   

  7. void OnEnable()  

  8. {  

  9.     print("Here is OnEnable");  

  10. }  

  11.   

  12.   

  13. void Start()  

  14. {  

  15.     print("Here is Start");  

  16. }  

  17.   

  18.   

  19. void FixedUpdate()  

  20. {  

  21.     print("Here is FixedUpdate");  

  22. }  

  23.   

  24.   

  25. void Update()  

  26. {  

  27.     print("Here is Update");  

  28. }  

  29.   

  30.   

  31. void LateUpdate()  

  32. {  

  33.     Debug.Log("Here is LateUpdate");  

  34. }  

  35.   

  36.   

  37. void OnGUI()  

  38. {  

  39.     print("Here is OnGUI");  

  40. }  

  41.   

  42.   

  43. void Reset()  

  44. {  

  45.     print("Here is OnReset");  

  46. }  

  47.   

  48.   

  49. void OnDisable()  

  50. {  

  51.     print("Here is OnDisable");  

  52. }  

  53.   

  54.   

  55. void OnDestroy()  

  56. {  

  57.     print("Here is OnDestroy");  

  58. }     

下面是打印結果


接下來針對每個方法進行詳細的說明

1.Awake

     用於在遊戲開始之前初始化變量或遊戲狀態。在腳本整個生命週期內它僅被調用一次.Awake在所有對象被初始化之後調用,所以你可以安全的與其他對象對 話或用諸如GameObject.FindWithTag()這樣的函數搜索它們。每個遊戲物體上的Awake以隨機的順序被調用。因此,你應該用 Awake來設置腳本間的引用,並用Start來傳遞信息Awake總是在Start之前被調用。它不能用來執行協同程序。

2.Start

    僅在Update函數第一次被調用前調用。Start在behaviour的生命週期中只被調用一次。它和Awake的不同是Start只在腳本實例被啓 用時調用。你可以按需調整延遲初始化代碼。Awake總是在Start之前執行。這允許你協調初始化順序。在所有腳本實例中,Start函數總是在 Awake函數之後調用。

3.FixedUpdate

   固定幀更新,在Unity導航菜單欄中,點擊“Edit”-->“Project Setting”-->“Time”菜單項後,右側的Inspector視圖將彈出時間管理器,其中“Fixed Timestep”選項用於設置FixedUpdate()的更新頻率,更新頻率默認爲0.02s。

4.Update

    正 常幀更新,用於更新邏輯。每一幀都執行,處理Rigidbody時,需要用FixedUpdate代替Update。例如:給剛體加一個作用力時,你必須 應用作用力在FixedUpdate裏的固定幀,而不是Update中的幀。(兩者幀長不同)FixedUpdate,每固定幀繪製時執行一次,和 update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟着下降。 FixedUpdate比較適用於物理引擎的計算,因爲是跟每幀渲染有關。Update就比較適合做控制。

     Update()與FixedUpdate()的區別

     從字面上理解,它們都是在更新時會被調用,並且會循環的調用。但是Update會在每次渲 染新的一幀時,被調用。而FixedUpdate會在每個固定的時間間隔被調用,那麼要是Update 和FixedUpdate的時間間隔一樣,是不是就一樣呢?答案是不一定,因爲Update受當前渲染的物體,更確切的說是三角形的數量影響,有時快有時 慢,幀率會變化,update被調用的時間間隔就發生變化。但是FixedUpdate則不受幀率的變化,它是以固定的時間間隔來被調用,那麼這個時間間 隔怎麼設置呢?Edit->Project Setting->time下面的Fixed timestep。

5.LateUpdate

     在所有Update函數調用後被調用,和fixedupdate一樣都是每一幀都被調用執行,這可用於調整腳本執行順序。例如:當物體在Update裏 移動時,跟隨物體的相機可以在LateUpdate裏實現。LateUpdate,在每幀Update執行完畢調用,他是在所有update結束後才調 用,比較適合用於命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有update操作完纔跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里 還未有角色的空幀出現。

    Update和LateUpdate的區別

    在聖典裏LateUpdate被解釋成一句話,LateUpdate是在所有Update函數調用後被調用。這可用於調整腳本執行順序。例如:當物體在Update裏移動時,跟隨物體的相機可以在LateUpdate裏實現。

        LateUpdate是晚於所有Update執行的。例如:遊戲中有2個腳本,腳1含有Update和LateUpdate,腳2含有Update,那麼當遊戲執行時,每一幀都是把2個腳中的Update執行完後才執行LateUpdate 。雖然是在同一幀中執行的,但是Update會先執行,LateUpdate會晚執行。

        現在假設有2個不同的腳本同時在Update中控制一個物體,那麼當其中一個腳本改變物體方位、旋轉或者其他參數時,另一個腳步也在改變這些東西,那麼這 個物體的方位、旋轉就會出現一定的反覆。如果還有個物體在Update中跟隨這個物體移動、旋轉的話,那跟隨的物體就會出現抖動。 如果是在LateUpdate中跟隨的話就會只跟隨所有Update執行完後的最後位置、旋轉,這樣就防止了抖動。

6.OnGUI

   在渲染和處理GUI事件時調用。比如:你畫一個button或label時常常用到它。這意味着OnGUI也是每幀執行一次。

7.Reset

   在用戶點擊檢視面板的Reset按鈕或者首次添加該組件時被調用。此函數只在編輯模式下被調用。Reset最常用於在檢視面板中給定一個默認值。

8.OnDisable

   當物體被銷燬時 OnDisable將被調用,並且可用於任意清理代碼。腳本被卸載時,OnDisable將被調用,OnEnable在腳本被載入後調用。注意: OnDisable不能用於協同程序。

9.OnDestroy

當MonoBehaviour將被銷燬時,這個函數被調用。OnDestroy只會在預先已經被激活的遊戲物體上被調用。注意:OnDestroy也不能用於協同程序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章