基本函式生命週期和執行規律
轉載自:http://www.cnblogs.com/SunboyL/p/Unity_CallSequence.html
官方參考手冊:http://docs.unity3d.com/Manual/ExecutionOrder.html
unity指令碼從喚醒到銷燬都有著一套比較完善的生命週期,新增任何指令碼都要遵守生命週期法則!
接下來介紹幾種系統自呼叫的重要方法。首先要我們先來說明一下它們的執行順序:
Awake --> Start --> Update --> FixedUpdate --> LateUpdate -->OnGUI -->Reset --> OnDisable -->OnDestroy
下面我們針對每一個方法進行詳細的說明:
1.Awake:用於在遊戲開始之前初始化變數或遊戲狀態。在指令碼整個生命週期內它僅被呼叫一次.Awake在所有物件被初始化之後呼叫,所以你可以安全的與其他物件對話或用諸如GameObject.FindWithTag()這樣的函式搜尋它們。每個遊戲物體上的Awake以隨機的順序被呼叫。因此,你應該用Awake來設定指令碼間的引用,並用Start來傳遞資訊Awake總是在Start之前被呼叫。它不能用來執行協同程式。
2.Start:僅在Update函式第一次被呼叫前呼叫。Start在behaviour的生命週期中只被呼叫一次。它和Awake的不同是Start只在指令碼例項被啟用時呼叫。你可以按需調整延遲初始化程式碼。Awake總是在Start之前執行。這允許你協調初始化順序。在所有指令碼例項中,Start函式總是在Awake函式之後呼叫。
3.Update:正常幀更新,用於更新邏輯。每一幀都執行,處理Rigidbody時,需要用FixedUpdate代替Update。例如:給剛體加一個作用力時,你必須應用作用力在FixedUpdate裡的固定幀,而不是Update中的幀。(兩者幀長不同)FixedUpdate,每固定幀繪製時執行一次,和update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate呼叫次數就會跟著下降。FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。
4.FixedUpdate:固定幀更新,在Unity導航選單欄中,點選“Edit”-->“Project Setting”-->“Time”選單項後,右側的Inspector檢視將彈出時間管理器,其中“Fixed Timestep”選項用於設定FixedUpdate()的更新頻率,更新頻率預設為0.02s。
5.LateUpdate:在所有Update函式呼叫後被呼叫,和fixedupdate一樣都是每一幀都被呼叫執行,這可用於調整指令碼執行順序。例如:當物體在Update裡移動時,跟隨物體的相機可以在LateUpdate裡實現。LateUpdate,在每幀Update執行完畢呼叫,他是在所有update結束後才呼叫,比較適合用於命令指令碼的執行。官網上例子是攝像機的跟隨,都是在所有update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。
6.OnGUI:在渲染和處理GUI事件時呼叫。比如:你畫一個button或label時常常用到它。這意味著OnGUI也是每幀執行一次。
7.Reset:在使用者點選檢視面板的Reset按鈕或者首次新增該元件時被呼叫。此函式只在編輯模式下被呼叫。Reset最常用於在檢視面板中給定一個預設值。
8.OnDisable:當物體被銷燬時 OnDisable將被呼叫,並且可用於任意清理程式碼。指令碼被解除安裝時,OnDisable將被呼叫,OnEnable在指令碼被載入後呼叫。注意: OnDisable不能用於協同程式。
9.OnDestroy:當MonoBehaviour將被銷燬時,這個函式被呼叫。OnDestroy只會在預先已經被啟用的遊戲物體上被呼叫。注意:OnDestroy也不能用於協同程式。
備註:
協同程式,即在主程式執行時同時開啟另一段邏輯處理,來協同當前程式的執行。換句話說,開啟協同程式就是開啟一個執行緒。在unity3d中,使用MonoBehaviour.StartCoroutine方法即可開啟一個協同程式,也就是說該方法必須在MonoBehaviour或繼承於MonoBehaviour的類中呼叫。