標籤:dem 運行 text 沒有 開始 常用 rtc 編輯 reset
Unity指令碼的生命週期
前言:Unity中定義了10個重要的事件函數,按照執行的先後順序依次為以下的內容:
(1):Reset:重設函數,編輯期當指令碼賦值給遊戲對象時觸發,僅執行一次。
(2):Awake:喚醒函數,最先執行的事件函數,用於優先順序最高的事件處理,僅執行一次。
(3):OnEnable:啟用函數,當指令碼啟動的時候觸發,隨著指令碼的不斷啟用與禁用可以執行多次。
(4):Start:開始函數,一般用於給指令碼欄位賦初值使用,僅執行一次。
(5):FixedUpdate:固定更新函數,以預設0.02s的時鐘頻率執行,常用於物體學類比中處理剛體的移動等,每秒執行多次。
(6):Update:更新函數,執行的頻率不固定,與電腦當前的效能消耗乘反比,常用於邏輯計算,每秒執行多次。
(7):LateUpdate:後更新函數,在其餘兩個更新函數之後執行,常用於攝像機的控制情形中,每秒執行多次。
(8):OnGUI:圖形繪製函數:繪製系統UI介面,每秒執行多次。
(9):OnDisable:指令碼禁用函數,當指令碼禁用的時候觸發,隨著指令碼的不斷啟用和禁用,可以多次的執行。
(10):OnDestroy:銷毀函數,本指令碼所屬遊戲對象銷毀的時候執行本指令碼。僅執行一次。
1.寫下來我們編寫指令碼來測試一下各個函數的生命週期:
public class Demo10_ScriptLifeCycle : MonoBehaviour{ void Reset() { print("重設函數Reset"); } void Awake() { print("喚醒事件函數Awake"); } void OnEnable() { print("指令碼啟用事件函數OnEnable"); } void Start() { print("開始函數Start"); //開啟調用函數 InvokeRepeating("InvokeTest", 0f, 1f); //開始協成 StartCoroutine("CoroutineTest"); } void FixedUpdate() { print("固定更新函數FixedUpdate"); } void Update() { print("更新函數Update"); //停止調用函數 if (Input.GetKey(KeyCode.I)) { CancelInvoke("InvokeTest"); } //停止協成 else if (Input.GetKey(KeyCode.C)) { StopCoroutine("CoroutineTest"); } } void LateUpdate() { print("延遲更新函數LateUpdate"); } void OnGUI() { print("介面繪製函數OnGUI"); } void OnDisable() { print("指令碼禁用函數OnDisable"); } void OnDestroy() { print("銷毀函數OnDestory"); } void InvokeTest() { print("被測試的調用函數的方法"); } IEnumerator CoroutineTest() { while (true) { yield return new WaitForSeconds(1f); print("被測試的協成"); } }}//class_end
當我們把指令碼賦值給層級視圖的一個Null 物件的時候,注意我們Console視圖中會出現一個資訊:
以上的輸出的結果是Unity生命週期中的Reset()函數在編輯期間就觸發的(當我們給Null 物件賦值我們的指令碼的時候觸發的)。好的,接下來執行我們的程式:
啟動並執行結果我們可以看到指令碼中的部分事件函數的執行的順序與執行的次數。但是我們發現沒有OnDisable和OnDestroy事件函數的輸出。我們開始禁用這個指令碼:
當我們禁用完指令碼後會發現“被測試的調用函數的方法”和“被測試的協成”依然還是會執行:
當我們啟用指令碼的時候會執行OnEnable()事件函數:
我們用結構圖表示各個函數的執行的順序:
Unity指令碼的生命週期