在第一天的時候提到過Unity只支持C#語言,但C#寫出來的是什麼?
現在建立兩個物件,一個球體,一個立方體。
這兩個物件有相同的性質,看到下面這張圖,比較兩個物件檢查器中的不同,似乎只有形狀不一樣,其他的部分都一模一樣,而檢查器當中的欄位也可以叫做功能,或者性質(每個腳本擁有的性質/功能)。
很顯然,這兩個腳本有很多一樣的功能,unity已經把常用的功能加在編輯器中了,如果我想要額外添加功能的話只需要在檢查器的最下面選擇“添加組件”就能添加新功能
如果我想要的功能檢查器中沒有怎麼辦?那我就可以自己寫一個功能,我自己用C#寫出來的功能叫做“腳本”。不過該怎麼添加腳本呢?右鍵專案選擇“建立”,點擊“MonoBehaviour”建立一個C#腳本,並且命名為:Move。
現在Move是一個空腳本,因為我還沒編輯,這個空腳本可以當成組件添加到物件當中。
接下來即將進入漫長的Coding時間
一,生命週期方法
雙擊“Move”進入VScode,進入後看到兩個方法,“Update”和“Start”,這兩個方法屬於“生命週期方法”,生命週期方法是Unity 在特定時間點自動呼叫的函式,用來執行遊戲物件的初始化、更新、銷毀等邏輯。也就是說,這是Unity的底層邏輯,屬於不得不學的範疇。
仔細看上面那張圖,不難發現右邊有“GitHub Copilot”,有這麼方便的工具當然要好好利用,所以我讓它生成了所有的生命週期方法,接下來逐個講解。
void Awake():
在遊戲物件 被載入(Instantiate)時最早執行的一個方法,它用來在程式開始前,初始化變數、設定參考 (References)或準備資源。
void OnEnable():
當一個 遊戲物件或其腳本被啟用(Enabled)時,Unity 會自動呼叫這方法。
void Start():
當遊戲物件啟用(enabled)並且場景開始執行後,Unity 會自動呼叫這個方法一次。它用來做「遊戲一開始時 的初始化工作」。
void Update():
每一幀(frame)都會自動執行一次,用來處理持續變化的邏輯,像是移動、輸入偵測、動畫更新等等。
void FixedUpdate():
它會以固定的時間間隔被 Unity 引擎自動呼叫,與畫面更新(幀率)無關。
void LateUpdate():
在每一幀的所有 Update() 執行之後自動被呼叫,常用於需要在其他物件更新完之後再做處理的邏輯,例如攝影 機跟隨。
void OnDisable():
當一個遊戲物件或其腳本被停用(Disabled)時,Unity 會自動呼叫這個方法一次,通常與 OnEnable() 搭配 使用,負責在物件失效時進行收尾或暫停處理。
void OnDestroy():
當一個遊戲物件或其掛載的腳本被銷毀(Destroy)時,Unity 會自動呼叫這個方法一次。通常用來執行「資源 釋放」、「清理記憶體」。
二,腳本執行優先順序
在專案新建兩個腳本,一個叫“test1”,一個叫“test2”,並且在腳本裡的start方法寫各自的名稱,前面提過了,start在專案運行的時候執行,正好用來測試腳本執行的先後順序。
之後先把test2加入“Cube”,再把test1加入“Cube”,然後點擊畫面正中間上方的播放來執行腳本,再到控制台查看結果。
很顯然,腳本加入的順序並不能決定腳本執行的順序,但有的時候我們一定要優先執行某些腳本怎麼辦?這時候前面提到的Awake()就有作用了,把test2的內容寫到Awake()裡面就可以優先執行test2。
另外一種方法就是手動調整腳本執行順序,這裡先把test2的內容放回Strat()中,然後在“編輯”點擊“專案設置”,進去之後找到“腳本執行順序”添加test1和test2。
添加兩個腳本之後unity會自動賦予一個索引值,根據索引值大小決定執行順序,只要test2的索引值比test1小就能讓test2先執行。