【Unity3D基礎(chǔ)教程】給初學(xué)者看的Unity教程(二):所有腳本組件的基類 -- MonoBehaviour的前世今生
作者:王選易,出處:http://m.survivalescaperooms.com/neverdie/ 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。如果你喜歡這篇文章,請(qǐng)點(diǎn)【推薦】。謝謝!

引子
上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全局變量。GameObject是游戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有Transform的Component,這也加深了我們對(duì)GameObject的理解,即GameObject是游戲場(chǎng)景中真實(shí)存在,而且有位置的一個(gè)物件。
但是我們?cè)趺床倏v這個(gè)GameObject呢?這就需要引入腳本組件了,也就是今天講的MonoBehaviour
MonoBehaviour的生命周期
MonoBehaviour是Unity中所有腳本的基類,如果你使用JS的話,腳本會(huì)自動(dòng)繼承MonoBehaviour。如果使用C#的話,你需要顯式繼承MonoBehaviour。
在我們使用MonoBehaviour的時(shí)候,尤其需要注意的是它有哪些可重寫函數(shù),這些可重寫函數(shù)會(huì)在游戲中發(fā)生某些事件的時(shí)候被調(diào)用。我們?cè)赨nity中最常用到的幾個(gè)可重寫函數(shù)是這幾個(gè):
- Awake:當(dāng)一個(gè)腳本實(shí)例被載入時(shí)Awake被調(diào)用。我們大多在這個(gè)類中完成成員變量的初始化
- Start:僅在Update函數(shù)第一次被調(diào)用前調(diào)用。因?yàn)樗窃贏wake之后被調(diào)用的,我們可以把一些需要依賴Awake的變量放在Start里面初始化。 同時(shí)我們還大多在這個(gè)類中執(zhí)行StartCoroutine進(jìn)行一些協(xié)程的觸發(fā)。要注意在用C#寫腳本時(shí),必須使用StartCoroutine開始一個(gè)協(xié)程,但是如果使用的是javaScript,則不需要這么做。
- Update:當(dāng)MonoBehaviour啟用時(shí),其Update在每一幀被調(diào)用。
- FixedUpdate:當(dāng)MonoBehaviour啟用時(shí),其 FixedUpdate 在每一固定幀被調(diào)用。
- OnEnable:當(dāng)對(duì)象變?yōu)榭捎没蚣せ顮顟B(tài)時(shí)此函數(shù)被調(diào)用。
- OnDisable:當(dāng)對(duì)象變?yōu)椴豢捎没蚍羌せ顮顟B(tài)時(shí)此函數(shù)被調(diào)用。
- OnDestroy:當(dāng)MonoBehaviour將被銷毀時(shí),這個(gè)函數(shù)被調(diào)用。
下面用一張圖來更形象地說明一下這幾個(gè)類的在MonoBehaviour的生命周期中是如何被調(diào)用的:

在上面這個(gè)圖里,比較難以理解的就是Coroutine究竟是怎么回事?別著急,之后我們會(huì)單獨(dú)寫一篇博客來講這件事。
MonoBehaviour的那些坑
- 私有(PRivate)和保護(hù)(protected)變量只能在專家模式中顯示.屬性不被序列化或顯示在檢視面板.
- 不要使用命名空間(namespace)
- 記得使用 緩存組件查找, 即在MonoBehaviour的長(zhǎng)遠(yuǎn)方法中經(jīng)常被訪問的組件最好在把它當(dāng)作一個(gè)私有成員變量存儲(chǔ)起來。
- 在游戲里經(jīng)常出現(xiàn)需要檢測(cè)敵人和我方距離的問題,這時(shí)如果要尋找所有的敵人,顯然要消耗的運(yùn)算量太大了,所以最好的辦法是將攻擊范圍使用Collider表示,然后將Collider的isTrigger設(shè)置為True。最后使用OnTriggerEnter來做攻擊范圍內(nèi)的距離檢測(cè),這樣會(huì)極大提升程序性能。
總結(jié)
在MonoBehaviour中最難理解的是Coroutine是如何實(shí)現(xiàn)的,但是如果在一篇博客里面寫Coroutine的話,未免顯得太長(zhǎng),我會(huì)在下一篇博客中寫有關(guān)Coroutine的內(nèi)容。