(五)Unity腳本——生命周期函數(shù)

創(chuàng)建腳本
點(diǎn)擊創(chuàng)建

腳本上右鍵點(diǎn)擊 Edit Script 進(jìn)行編輯

本人用的腳本編輯器是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)起來。我們以后要用這些方法做游戲了,理解并牢記這些方法吧。

參考博客:
Unity 腳本生命周期流程圖 - 無幻
Unity生命周期 - 寧靜致遠(yuǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一,生命周期函數(shù) 1,按執(zhí)行的先后順序代碼如下 // 注意:在游戲運(yùn)行過程中,一個(gè)游戲?qū)ο蟮谝淮螁⒂玫臅r(shí)候,會(huì)執(zhí)行...
    彭晉閱讀 949評(píng)論 0 0
  • Unity腳本執(zhí)行順序:Awake -->OnEable--> Start --> FixedUpdate -->...
    夜行水寒閱讀 2,770評(píng)論 0 1
  • 一、下面我們來學(xué)習(xí)下腳本生命周期常用的10個(gè)腳本函數(shù): (1) Reset() 組件重設(shè)為默認(rèn)值時(shí)(只用于編輯狀態(tài)...
    李昀熹1112閱讀 22,708評(píng)論 0 12
  • Unity中腳本的生命周期就是代碼中腳本函數(shù)的執(zhí)行過程(順序),具體過程由圖1.1,1.2和1.3介紹: 這里我們...
    S_H_C閱讀 1,842評(píng)論 0 2
  • 有時(shí)候我們??偸窃诓唤?jīng)意間失去某些曾經(jīng)認(rèn)為很重要的東西; 有時(shí)候我們總是在不經(jīng)意間想起某些人; 有時(shí)候我們聚在一起...
    我家三叔閱讀 227評(píng)論 0 0

友情鏈接更多精彩內(nèi)容