Unity —生命周期

一、下面我們來學習下腳本生命周期常用的10個腳本函數:

(1) Reset() 組件重設為默認值時(只用于編輯狀態)
(2)Awake() 腳本組件載入時 (調用一次)
(3)OnEnable() 是在游戲對象可以調用時調用
(4) Start()第一個Update發生之前 (調用一次)
(5)FixedUpdate() 固定時間調用,常用于物理相關的計算,比如對Rigidbody的操作
(6)Update()大部分游戲行為代碼被執行的地方,除了物理代碼
(7)LateUpdate() 每幀Update調用之后
(8)OnGUI() 繪制GUI時調用
(9)OnDisable() 當對象設置為不可用時
(10)OnDestroy()組件銷毀時調用

二、下面看在程序運行后的結果

1、代碼:
 void Awake() 
    {
        Debug.Log("Awake----1");
    }
    void Start()
    {
        Debug.Log("Start----3");
    }
    void OnEnable()
    {
        Debug.Log("OnEnable----2");
    }
    
    void LateUpdate()
    {
        Debug.Log("LateUpdate----6");
    }
    void FixedUpdate()
    {
        Debug.Log("FixedUpdate----4");
    }
    void Update ()
    {
        Debug.Log("Update----5");
    }
   
    void OnGUI() 
    {
        Debug.Log("OnGUI----7");
    }
    void OnDisable()
    {
        Debug.Log("OnDisable----8");
    }
    void OnDestroy() 
    {
        Debug.Log("OnDestroy----9");
    }
2、從下圖得出,不管代碼順序如何的寫都是按照以下順序執行的:

Awake ->OnEable-> Start -> -> FixedUpdate-> Update -> LateUpdate ->OnGUI -> OnDisable ->OnDestroy

運行結果一:

這是在暫停的情況下

運行結果二:
退出運行時所調用的

-這時在運行時,去掉在Inspector場景中Cube前面的勾后,還會調用OnDisable.
Paste_Image.png

三、生命周期的作用:

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就比較適合做控制。
5.LateUpdate
在所有Update函數調用后被調用,和fixedupdate一樣都是每一幀都被調用執行,這可用于調整腳本執行順序。例如:當物體在Update里移動時,跟隨物體的相機可以在LateUpdate里實現。LateUpdate,在每幀Update執行完畢調用,他是在所有update結束后才調用,比較適合用于命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。
6.OnGUI:
在渲染和處理GUI事件時調用。比如:你畫一個button或label時常常用到它。這意味著OnGUI也是每幀執行一次。
7.Reset
在用戶點擊檢視面板的Reset按鈕或者首次添加該組件時被調用。此函數只在編輯模式下被調用。Reset最常用于在檢視面板中給定一個默認值。
8.OnDisable
當物體被銷毀時 OnDisable將被調用,并且可用于任意清理代碼。腳本被卸載時,OnDisable將被調用,OnEnable在腳本被載入后調用。注意: OnDisable不能用于協同程序。
9.OnDestroy
當MonoBehaviour將被銷毀時,這個函數被調用。OnDestroy只會在預先已經被激活的游戲物體上被調用。注意:OnDestroy也不能用于協同程序。

*圖解(此圖百度而來)


Paste_Image.png

Paste_Image.png
如若不理解,可參考一下博客:

http://blog.csdn.net/akof1314/article/details/39323081
http://blog.csdn.net/zhaoguanghui2012/article/details/49121103

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

推薦閱讀更多精彩內容

  • 一,生命周期函數 1,按執行的先后順序代碼如下 // 注意:在游戲運行過程中,一個游戲對象第一次啟用的時候,會執行...
    彭晉閱讀 913評論 0 0
  • 我們會發現,腳本里,自帶兩個函數: Start()方法在Update被調用前進行調用,只調用一次。(所以Start...
    FLY旳影子閱讀 7,741評論 0 7
  • 進階測試參考unity腳本MonoBehaviour默認方法執行順序測試 將腳本掛到空物體上執行 執行結果 Uni...
    codingriver閱讀 2,551評論 0 0
  • Unity腳本執行順序:Awake -->OnEable--> Start --> FixedUpdate -->...
    夜行水寒閱讀 2,685評論 0 1
  • 對于我們這一代,這一代所指的是95后,我們好像就沒吃過什么苦,所以也沒閱歷過多少人性。可有句話說得好呀:“沒吃過豬...
    心傷人閱讀 630評論 0 0