


本人用的腳本編輯器是vs2015中文版,如果沒有vs的小伙伴請(qǐng)戳下面的下載鏈接,里面還有詳細(xì)說明。
vs2015中文旗艦版下載

我們會(huì)發(fā)現(xiàn),腳本里,自帶兩個(gè)函數(shù):
void Start(){
}
void Update(){
}
Start()方法在Update被調(diào)用前進(jìn)行調(diào)用,只調(diào)用一次。(所以Start()方法無論寫在上面還是下面都在Update之前執(zhí)行)Update方法每幀都要執(zhí)行一次
我們先看一下腳本的流程圖,然后再進(jìn)行逐個(gè)講解及匯總。

Reset:在用戶點(diǎn)擊檢視面板的Reset按鈕或者首次添加該組件時(shí)被調(diào)用。此函數(shù)只在編輯模式下被調(diào)用。
Reset最常用于在檢視面板中給定一個(gè)默認(rèn)值。
Awake(一次):Awake在所有對(duì)象被初始化之后調(diào)用,用于在游戲開始之前初始化變量或游戲狀態(tài)。在腳本整個(gè)生命周期內(nèi)Awake僅被調(diào)用一次。Awake不能用來執(zhí)行協(xié)同程序。
每個(gè)游戲物體上的Awake以隨機(jī)的順序被調(diào)用。所以在一般時(shí)候,用Awake來設(shè)置腳本間的引用,然后用Start來傳遞信息。
OnEnable:在Awake之后調(diào)用??刂颇_本中組件的啟動(dòng)與禁用。
例如:this.enable=false,則會(huì)直接跳轉(zhuǎn)到OnDisable方法執(zhí)行一次,其它的任何方法,將不再被執(zhí)行。
Start(一次):Start函數(shù)總是在Awake函數(shù)之后調(diào)用。Start在生命周期中只被調(diào)用一次。
Start和Awake的不同是Start只在腳本實(shí)例被啟用時(shí)調(diào)用。你可以按需調(diào)整延遲初始化代碼,協(xié)調(diào)初始化順序。
FixedUpdate(每幀):固定幀(固定的時(shí)間間隔,不受幀率(FPS)影響)更新,更新頻率默認(rèn)為0.02s。
FixedUpdate比較適用于物理引擎的計(jì)算,因?yàn)槭歉繋秩居嘘P(guān)。
Update(每幀):正常幀更新,每一幀都執(zhí)行,用于更新邏輯。
Update比較適合做控制。如果卡幀了Update就不會(huì)再執(zhí)行,而FixedUpdate則繼續(xù)執(zhí)行。
LateUpdate(每幀):在所有Update函數(shù)調(diào)用后被調(diào)用,和fixedupdate一樣都是每一幀都被調(diào)用執(zhí)行。
LateUpdate可用于調(diào)整腳本執(zhí)行順序。例如:相機(jī)跟隨就可以用這個(gè)函數(shù),即人物移動(dòng)在Update中實(shí)現(xiàn),相機(jī)跟隨在LateUpdate()中實(shí)現(xiàn),播放后的效果是:角色移動(dòng)發(fā)生在前,相機(jī)移動(dòng)緊跟其后。(如果相機(jī)也在Update里執(zhí)行,就可能出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了,但是視角里還未有角色的空幀出現(xiàn)。)
OnGUI(每幀)在渲染和處理GUI事件時(shí)調(diào)用。每幀都執(zhí)行。
在界面顯示一個(gè)button或label時(shí)常常用到它。
OnDisable:腳本被卸載時(shí),OnDisable將被調(diào)用(腳本不會(huì)被銷毀)。OnDisable不能用于協(xié)同程序。
常用于一些用于清理的事件。
OnDestroy:當(dāng)MonoBehaviour將被銷毀時(shí),這個(gè)函數(shù)被調(diào)用。OnDestroy只會(huì)在預(yù)先已經(jīng)被激活的游戲物體上被調(diào)用。OnDestroy也不能用于協(xié)同程序。
函數(shù)執(zhí)行順序:
**Awake→OnEable→ Start → FixedUpdate→Update →LateUpdate →OnGUI →Reset → OnDisable →OnDestroy **
最先執(zhí)行的方法是Awake,這是生命周期的開始,用于進(jìn)行激活時(shí)的初始化代碼,如果在這個(gè)地方將當(dāng)前腳本禁用:this.enable=false,則會(huì)直接執(zhí)行OnDisable方法,其它的任何方法,都將不再被執(zhí)行。
如果當(dāng)前腳本處于可用狀態(tài):this.enable =true,則按正常的執(zhí)行順序是繼續(xù)向下執(zhí)行OnEnable。
再向下執(zhí)行,會(huì)進(jìn)行一個(gè)判斷,如果Start方法還沒有被執(zhí)行,則會(huì)被執(zhí)行一次,如果已經(jīng)被執(zhí)行了,則不會(huì)再被執(zhí)行。這是個(gè)什么意思呢?我們可以在某個(gè)腳本中將組件禁用this.enable=false,再啟用時(shí)會(huì)轉(zhuǎn)到OnEnable處執(zhí)行,這時(shí)繼續(xù)向下走,發(fā)現(xiàn)Start執(zhí)行過了,將不再被執(zhí)行。比如說:第一次啟用時(shí),將怪物的初始位置定在了(0,0,0)點(diǎn),然后怪物可能會(huì)發(fā)生了位置的變換,后來被禁用了,再次啟用時(shí),不會(huì)讓怪物又回到初始的(0,0,0)位置。
繼續(xù)向后執(zhí)行,就是FixedUpdate了,然后是Update,再然后是LateUpdate,如果后面寫了Reset,則會(huì)又回到Update,在這4個(gè)事件間可以進(jìn)行循環(huán)流動(dòng)。
再向后執(zhí)行,就進(jìn)入了渲染模塊(Rendering),非常重要的一個(gè)方法就是OnGUI,用于繪制圖形界面,每幀都執(zhí)行。
再向后,就是卸載模塊(TearDown),當(dāng)被禁用(enable=false)時(shí),會(huì)執(zhí)行OnDisable方法,但是這個(gè)時(shí)候,腳本并不會(huì)被銷毀,在這個(gè)狀態(tài)下,可以重新回到OnEnable狀態(tài)(enable=true)。
當(dāng)手動(dòng)銷毀或附屬的游戲?qū)ο蟊讳N毀時(shí),OnDestroy才會(huì)被執(zhí)行,當(dāng)前腳本的生命周期結(jié)束。
有了生命周期,物體才能動(dòng)起來。我們以后要用這些方法做游戲了,理解并牢記這些方法吧。