2012年1月11日 星期三

Awake() 跟 Start() 差在哪?



Dear All:
剛開始學UNITY的時候,最難搞定的就是這兩個functions的差異,依照官方文件所描述的:
Awake(): Awake is called when the script instance is being loaded.
Start(): Start is called just before any of the Update methods is called the first time.

習慣C++寫作的我來說,這根本是"小三"的顛倒!!為什麼要這樣分搞不懂。後來寫久了遇到問題了才瞭解原來繼承MonoBehaviour的class:
Awake() == C++的Construct
Start() == 程式啟動後第一個會被忽叫的function
進一步想,我們在寫C++的class時,不也有時候會自己寫Init()的Member Fucntion嗎?所以Start()也可想成自訂的Init()就好!
在使用上的基本原則就是,如果你有class的member參考其它Component,就在Awake裡設定好,裡如:
protected void Awake () {
    thisTrans = transform;
    item = GetComponent();
}

這是確保當我們在Start()裡需要呼叫member所參考component中的function時,這個參考已經建立而非NULL。當然你也可以說你在Start()的一開始先做GetComponent的動作,這也是OK的。不過開發到後來系統class彼此間的連結越來越強時,因該就會慢慢體會到Awake()的重要,因為UNITY裡物件的建立順序無法控制,所以保險一點還是將GetComponent這件事留在Awake比較好一點。


作者:Bric Lin, Email: ericlin09@gmail.com
曾任職台灣某遊戲公司研發Game Engine,為書籍“OGRE 入門指南”的譯者之一,專攻Rendering技術與遊戲開發,目前為獨立開發團隊CocosPlay主程式

2 則留言:

  1. "UNITY裡物件的建立順序無法控制"
    應該是可以控制的喔
    Project Settings > Script Execution

    回覆刪除
    回覆
    1. 是啊!感謝皓哲,這篇文章是沒這功能時寫的,當時從我以前的Blog轉貼後,就沒有Update了。Project Settings -> Script Execution,的確可以解決部分問題。 THX~ MAN!!

      刪除