作者:王選易,出處:http://www.cnblogs.com/neverdie/ 歡迎轉載,也請保留這段聲明。如果你喜歡這篇文章,請點【推薦】。謝謝!
引子
上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全局變量。GameObject是游戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有Transform的Component,這也加深了我們對GameObject的理解,即GameObject是游戲場景中真實存在,而且有位置的一個物件。
但是我們怎麼操縱這個GameObject呢?這就需要引入腳本組件了,也就是今天講的MonoBehaviour
MonoBehaviour的生命周期
MonoBehaviour是Unity中所有腳本的基類,如果你使用JS的話,腳本會自動繼承MonoBehaviour。如果使用C#的話,你需要顯式繼承MonoBehaviour。
在我們使用MonoBehaviour的時候,尤其需要注意的是它有哪些可重寫函數,這些可重寫函數會在游戲中發生某些事件的時候被調用。我們在Unity中最常用到的幾個可重寫函數是這幾個:
- Awake:當一個腳本實例被載入時Awake被調用。我們大多在這個類中完成成員變量的初始化
- Start:僅在Update函數第一次被調用前調用。因為它是在Awake之後被調用的,我們可以把一些需要依賴Awake的變量放在Start裡面初始化。 同時我們還大多在這個類中執行StartCoroutine進行一些協程的觸發。要注意在用C#寫腳本時,必須使用StartCoroutine開始一個協程,但是如果使用的是JavaScript,則不需要這麼做。
- Update:當MonoBehaviour啟用時,其Update在每一幀被調用。
- FixedUpdate:當MonoBehaviour啟用時,其 FixedUpdate 在每一固定幀被調用。
- OnEnable:當對象變為可用或激活狀態時此函數被調用。
- OnDisable:當對象變為不可用或非激活狀態時此函數被調用。
- OnDestroy:當MonoBehaviour將被銷毀時,這個函數被調用。
下面用一張圖來更形象地說明一下這幾個類的在MonoBehaviour的生命周期中是如何被調用的:
在上面這個圖裡,比較難以理解的就是Coroutine究竟是怎麼回事?別著急,之後我們會單獨寫一篇博客來講這件事。
MonoBehaviour的那些坑
- 私有(private)和保護(protected)變量只能在專家模式中顯示.屬性不被序列化或顯示在檢視面板.
- 不要使用命名空間(namespace)
- 記得使用 緩存組件查找, 即在MonoBehaviour的長遠方法中經常被訪問的組件最好在把它當作一個私有成員變量存儲起來。
- 在游戲裡經常出現需要檢測敵人和我方距離的問題,這時如果要尋找所有的敵人,顯然要消耗的運算量太大了,所以最好的辦法是將攻擊范圍使用Collider表示,然後將Collider的isTrigger設置為True。最後使用OnTriggerEnter來做攻擊范圍內的距離檢測,這樣會極大提升程序性能。
總結
在MonoBehaviour中最難理解的是Coroutine是如何實現的,但是如果在一篇博客裡面寫Coroutine的話,未免顯得太長,我會在下一篇博客中寫有關Coroutine的內容。