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!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Evia.H 的頭像
    Evia.H

    Evia WorkStation 伊維亞工作室

    Evia.H 發表在 痞客邦 留言(0) 人氣()