unity腳本生命週期和執行順序

最近我也開始爲將來的面試做準備了
然後我會更新一系列關於unity底層的知識
就從今天這篇開始

unity腳本生命週期
Awake 腳本實例被創建時調用 用於遊戲對象的初始化,注意Awake的執行早於所有腳本的Start函數
OnEnable 當對象變爲可用或激活狀態時被調用
Start Update函數第一次運行之前調用 用於遊戲對象的初始化
Update 每幀調用一次 用於更新遊戲場景和狀態
FixedUpdate 每個固定物理時間間隔調用一次 用於物理狀態的更新
LateUpdate 每幀調用一次(在update之後調用)用於更新遊戲場景和狀態,和相機有關的更新一般放在這裏
OnGUI 渲染和處理OnGUI事件
OnDisable 當前對象不可用或非激活狀態時被調用
OnDestroy 當前對象被銷燬時調用

Monobehavior生命週期圖
在這裏插入圖片描述

在我們開發項目的時候 腳本會成羣結隊 同時進行好多腳本
這個時候的順序是怎樣的呢
我們下面來測試一下

首先我們創建三個腳本

public class testorder : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log("awake 1");
    }
    private void Start()
    {
        Debug.Log("start 1");
    }
    private void Update()
    {
        Debug.Log("update 1");
    }
}//第一個

public class testorder2 : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log("awake 2");
    }
    private void Start()
    {
        Debug.Log("start 2");
    }
    private void Update()
    {
        Debug.Log("update 2");
    }
}//第二個

public class testorder3 : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log("awake 3");
    }
    private void Start()
    {
        Debug.Log("start 3");
    }
    private void Update()
    {
        Debug.Log("update3");
    }
}//第三個

然後把他們掛在同一個物體上(注意我的順序)

在這裏插入圖片描述

之後再運行看輸出情況
在這裏插入圖片描述
可以看到awake和start只在開始時候執行一次
在之後就是update在重複每一幀執行一次

大家可能看到我弄紅線標出了輸出的順序
這個順序默認爲創建順序 新創建的越靠前輸出

當然unity很貼心的爲我們提供了一個控制先後順序的設置
在這裏插入圖片描述
在設置中通過我用紅箭頭標誌的**+上可以添加我們自己寫的腳本
其中
order的值越小 越先執行**
在這裏插入圖片描述
大家可以看到修改後的輸出

總結一下
無論多個腳本的執行順序如何,但所有腳本的Awake函數一定會比所有的Start函數先執行完,所有的Start函數一定也會比所有的Update函數先執行完,其他有順序的生命週期函數也是類似的(從上圖的日誌信息中也可以看出)
Awake, Start函數都是在遊戲對象被創建時調用一次。
當遊戲過程中調整腳本的可見狀態時,會分別調用OnEnable, OnDisable函數,而Awake和Start將不會再調用,也就是說一旦腳本被掛載上以後,Awake和Start有且僅會被執行一次。
而Update, FixedUpdate, LateUpdate, OnGUI函數是會在遊戲過程中被多次調用的(日誌窗口右側的數字表示該條日誌信息打印的次數)。
最後在遊戲對象被銷燬時,會依次調用OnDisable, OnDestory函數。

以後的路還有特別長 如果想要走遊戲開發這個行業 算法 unity底層知識等都是很重要的
一起努力吧
最後祝大家頭髮濃密 睡眠良好 財富自由

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