close
說到 Unity,就一定要來好好的認識 Awake 和 Start 這兩個方法。
Awake 函式和 Start 函式隸屬 MonoBehaviour 類別底下的方法,該類別還包含Update、OnGUI、OnEnabled、OnDisable 等方法函式。
Awake 函式與 Start 函式在腳本被載入時,就會自動被執行,那到底差別在哪裡呢?
- Awake 函式是在腳本甦醒時被叫用,即便這個腳本沒有被啟用(disabled),Awake 也會執行,因此在這個特性底下,Awake適合用來設定類別之間的參考及程式的初始化。
- Start 函式是在腳本開始運行時被叫用,晚於 Awake 函式但早於Update 函式,如果這個腳本沒有被啟用 (disabled) ,Start 函式就不會執行,等到此腳本第一次被啟用時才執行,因此這裡可以用來處理當物件啟用時的初始化事件。
- 方法定義:
- 用法:
void Awake(){ //要做的事}void Start(){ //要做的事
}
- 實作(一):
using UnityEngine;using System.Collections;
public class Test(){ void Awake() { Debug.Log("Script awake!"); } void Start() { Debug.Log("Script start!"); }}
//執行結果//Script awake!//Script start!
- 實作(二):
A類別:
using UnityEngine;using System.Collections;
public class TestA : MonoBehaviour{ TestB b; void Awake() { Debug.Log("Script A awake!"); b = new TestB(); b.Print(); Debug.Log("Script A end awake!"); }
void Start() { Debug.Log("Script A start!"); Debug.Log("Script A end start!"); }}
//執行結果// Script A awake!// Script B awake!// Script B end awake!// Hello// Script A end awake!// Script A start!// Script A end start!// Script B start!// Script B end start!
B類別:
using UnityEngine;using System.Collections;
public class TestB : MonoBehaviour{ void Awake() { Debug.Log("Script B awake!"); Debug.Log("Script B end awake!"); }
void Start() { Debug.Log("Script B start!"); Debug.Log("Script B end start!"); } void Print() { Debug.Log("Hello"); }
}
- 結語:
- Awake 與 Start 在物件的生命週期中只會被呼叫一次,不能藉由啟用/不啟用的方法來重新呼叫這兩個函式。
- 同一個腳本中 Awake 會先於 Start 執行。
- 當在腳本A中參考到腳本B時,腳本B的 Awake 函式會被立刻呼叫並且執行,但是Start 函式並不會,Start 函式會處在待執行的狀態,等它前面的該執行的程式執行完才會執行。(順序可參考實做二)
- 當腳本A的 Awake 中參考到腳本B時,若腳本B的變數初始化放在 Start 函式中,腳本A在參考腳本B後立刻用到腳本B的變數值,會因為這些變數尚未初始化而可能導致錯誤。(順序可參考實做二)
Try it and have fun!
全站熱搜