1. 程式人生 > >腳本生命周期

腳本生命周期

strong 角色 模塊 clas art 攝像機 生命 什麽 頻率

技術分享圖片

Reset:在用戶點擊檢視面板的Reset按鈕或者首次添加該組件時被調用。此函數只在編輯模式下被調用。
Reset最常用於在檢視面板中給定一個默認值。

Awake(一次):Awake在所有對象被初始化之後調用,用於在遊戲開始之前初始化變量或遊戲狀態。在腳本整個生命周期內Awake僅被調用一次。Awake不能用來執行協同程序。
每個遊戲物體上的Awake以隨機的順序被調用。所以在一般時候,用Awake來設置腳本間的引用,然後用Start來傳遞信息。

OnEnable:在Awake之後調用。控制腳本中組件的啟動與禁用。
例如:this.enable=false,則會直接跳轉到OnDisable

方法執行一次,其它的任何方法,將不再被執行。

Start(一次):Start函數總是在Awake函數之後調用。Start在生命周期中只被調用一次。
Start和Awake的不同是Start只在腳本實例被啟用時調用。你可以按需調整延遲初始化代碼,協調初始化順序。

FixedUpdate(每幀):固定幀(固定的時間間隔,不受幀率(FPS)影響)更新,更新頻率默認為0.02s。
FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。

Update(每幀):正常幀更新,每一幀都執行,用於更新邏輯。
Update比較適合做控制。如果卡幀了Update就不會再執行,而FixedUpdate則繼續執行。

LateUpdate(每幀):在所有Update函數調用後被調用,和fixedupdate一樣都是每一幀都被調用執行。
LateUpdate可用於調整腳本執行順序。例如:相機跟隨就可以用這個函數,即人物移動在Update中實現,相機跟隨在LateUpdate()中實現,播放後的效果是:角色移動發生在前,相機移動緊跟其後。(如果相機也在Update裏執行,就可能出現攝像機已經推進了,但是視角裏還未有角色的空幀出現。)

OnGUI(每幀)在渲染和處理GUI事件時調用。每幀都執行。
在界面顯示一個button或label時常常用到它。

OnDisable:腳本被卸載時,OnDisable將被調用(腳本不會被銷毀)。OnDisable不能用於協同程序。
常用於一些用於清理的事件。

OnDestroy:當MonoBehaviour將被銷毀時,這個函數被調用。OnDestroy只會在預先已經被激活的遊戲物體上被調用。OnDestroy也不能用於協同程序。

函數執行順序:

**Awake→OnEable→ Start → FixedUpdate→Update →LateUpdate →OnGUI →Reset → OnDisable →OnDestroy **

最先執行的方法是Awake,這是生命周期的開始,用於進行激活時的初始化代碼,如果在這個地方將當前腳本禁用:this.enable=false,則會直接執行OnDisable方法,其它的任何方法,都將不再被執行。

如果當前腳本處於可用狀態:this.enable =true,則按正常的執行順序是繼續向下執行OnEnable

再向下執行,會進行一個判斷,如果Start方法還沒有被執行,則會被執行一次,如果已經被執行了,則不會再被執行。這是個什麽意思呢?我們可以在某個腳本中將組件禁用this.enable=false,再啟用時會轉到OnEnable處執行,這時繼續向下走,發現Start執行過了,將不再被執行。比如說:第一次啟用時,將怪物的初始位置定在了(0,0,0)點,然後怪物可能會發生了位置的變換,後來被禁用了,再次啟用時,不會讓怪物又回到初始的(0,0,0)位置。

繼續向後執行,就是FixedUpdate了,然後是Update,再然後是LateUpdate,如果後面寫了Reset,則會又回到Update,在這4個事件間可以進行循環流動

再向後執行,就進入了渲染模塊(Rendering),非常重要的一個方法就是OnGUI,用於繪制圖形界面,每幀都執行。

再向後,就是卸載模塊(TearDown),當被禁用(enable=false)時,會執行OnDisable方法,但是這個時候,腳本並不會被銷毀,在這個狀態下,可以重新回到OnEnable狀態(enable=true)。

當手動銷毀或附屬的遊戲對象被銷毀時,OnDestroy才會被執行,當前腳本的生命周期結束。



作者:FLY旳影子
鏈接:https://www.jianshu.com/p/32ce8768607f
來源:簡書

腳本生命周期