1.Awake
Awake用於腳本喚醒。此方法為系統執行的第一個方法,用於腳本的初始化,在腳本的生命周期中只執行一次。
2.Start
Start方法在Awake之后執行,在腳本生命周期中只執行一次。
由於Awake和Start函數的特性與C#中的構造函數類似(一般情況下,在整個腳本生命周期中只執行一次),所以在Unity中也常用來初始化類的成員變量。
3.FixedUpdate
FixedUpdate用於固定頻率更新
在Unity中依次單擊菜單項Edit→Project Settings→Time,可以打開Time Manager面板,其中Fixed Timestep選項用於設置FixedUpdate更新頻率,默認為0.02秒,即每秒50次。
通常情況下,FixedUpdate()會比Update()更頻繁的調用。當幀率較低時,在某一幀的時間間隔內FixedUpdate可能會被調用多久;而當幀率很高時,在某一幀的時間間隔內FixedUpdate可能根本不會被調用。
還有一點,在Unity中,若設置Time Scale值為0,可以實現動力學特性的暫停,即所有在FixedUpdate函數中的代碼都不會被執行。(可以用這個特性來實現游戲暫停的功能)
4.Update
Update用於正常更新,即用於幀更新后同步場景狀態。此方法每幀都會由系統自動調用一次。
在使用Update()時,對於一些變量,如速度、移動距離等通常需要乘以Time.deltaTime來抵消幀率帶來的影響,使物體狀態的改變看起來比較均勻、正常。而在FixedUpdate中,由於其更新幀率固定,所以不需要采用Time.deltaTime來修正狀態改變幀率。
5.LateUpdate
LateUpdate用於延遲更新,此方法在Update()之后執行,每一幀調用一次。
6.OnGUI
OnGUI用來繪制用戶交互界面,在一幀中會調用多次。其中,與布局(Layout)和重繪(Repaint)相關的事件會被優先處理,然后是鍵盤和鼠標事件。
7.OnDestroy
OnDestroy在當前腳本銷毀時調用。若腳本中動態分配了內存,可以在OnDestroy()中進行釋放。
下面腳本可以測試事件函數的順序。
1 public class MyScript : MonoBehaviour 2 { 3 void Awake() 4 { 5 print("Awake is called"); 6 } 7 8 void Start() 9 { 10 print("Start is called"); 11 } 12 13 void OnGUI() 14 { 15 print("OnGUI is called"); 16 } 17 18 void Update() 19 { 20 print("Update is called"); 21 } 22 23 void LateUpdate() 24 { 25 print("LateUpdate is called"); 26 } 27 28 void FixedUpdate() 29 { 30 print("FixedUpdate is called"); 31 } 32 33 void OnDestroy() 34 { 35 print("OnDestroy is called"); 36 } 37 }
Unity官方提供的事件順序圖。