unity生命週期(二)

1、靜態構造函數

當程序集被加載的時候就被調用了,如果你的unity處於編輯狀態時,此時你保存一個腳本(從而迫使重新編譯),靜態構造函數會立即被調用,因爲unity加載了DLL。並且它將不會再次運行,永遠只會執行一次,unity運行時,是不會再次執行了!在一個已部署的遊戲上,這個構造器將會在unity加載過程的早期被調用!

靜態構造函數文章:http://www.cnblogs.com/MrZivChu/p/BaseKnowledge_staticConstructor.html

2、非靜態構造器

Unity將會在一個貌似隨機的時間調用一個對象的默認構造器。當你編輯一個遊戲時,在你保存一個腳本(從而迫使重新編譯)後,這構造器將會被立馬調用!

程序運行時被隨機調用多次,程序結束時也被調用了(自己測試發現)

所以不要使用構造器去初始化字段的值,unity的Awake就是專門爲這個目的設計的。 

3、Awake

只會被調用一次,在Start方法之前被調用! 主要用於字段值的初始化工作,禁用腳本,創建遊戲對象,或者Resources.Load(Prefab) 對象

4、Start

只執行一次,在Awake方法執行結束後執行,但在Update方法執行前執行, 主要用於程序UI的初始化操作,比如獲取遊戲對象或者組件

5、Update

每一幀執行的,監聽用戶輸入,播放動畫,當機器忙或者性能差的時候,他會停止執行,會產生停頓的感覺,例如一個人本來在1米的位置,突然到了5米的位置上,產生了跳幀,而下面的FixedUpdate方法則相反!會一米一米的去執行!(自己調試發現,Update是先於OnGUI執行的,且執行一次Update之後,會執行兩次OnGUI)

6、FixedUpdate 

不管當前機器忙不忙,都會保證每一幀執行一次!避免跳幀!固定更新。固定更新常用於移動模型等操作。

7、LateUpdate 

先執行Update,然後纔去執行lateUpdate(Update方法執行完,必定接着執行LateUpdate,而Update和FixedUpdate方法的執行順序不確定,而且有時候FIxedUpdate執行了多幀,而Update卻只執行了一幀,這就是因爲跳幀的緣故造成的(取決於你的機器性能)!),如果現在有100個腳本,分別有100個 Update()函數,其中只有一個LateUpdate,那麼在同一幀中,等待100個Update()執行完後,才執行這一個LateUpdate()。

8、OnGUI

在這裏面進行GUI的繪製,且GUI是每幀擦除重繪的!僅僅只是繪製!沒有生命週期的概念!所有關於繪製GUI的代碼,都要直接或者間接地寫到OnGUI方法中!

9、OnDestroy 

當前腳本銷燬時調用

10、OnEnable

腳本可用時被調用、如果腳本是不可用的,將不會被調用!

如果有三個對象,a1 > a2 > a3 (父子級的關係),掛有三個腳本s1,s2,s3,三個腳本都有Awake,Start,OnEnable,OnDisable,Update方法,那麼unity執行的順序爲:

awake1,OnEnable1,awake2,OnEnable2,awake3,OnEnable3,Start1,Start2,Start3,Update1,Update2,Update3

如果在腳本s2的Awake方法中設置腳本s1不可用(s1.enabled=false),那麼腳本的執行結果爲:

awake1,OnEnable1,OnDisable1,awake2,OnEnable2,awake3,OnEnable3,Start2,Start3,Update2,Update3

如果在腳本s2的Awake方法中設置腳本s3不可用(s3.enabled=false),那麼腳本的執行結果爲:

awake1,OnEnable1,awake2,OnEnable2,awake3,Start1,Start2,Update1,Update2

如果在腳本s2的Start方法中設置腳本s3不可用(s3.enabled=false),那麼腳本的執行結果爲:

awake1,OnEnable1,awake2,OnEnable2,awake3,OnEnable3,Start1,OnDisable3,Start2,Update1,Update2

總結:關鍵是看設置腳本不可用的位置:

A(1)如果在父級的Awake方法裏面設置子級的腳本不可用 

          那麼僅僅只會執行子級裏面的Awake方法,當子級被激活後(enabled=true),會先執行OnEnable,然後執行Start方法,Update等幀序列方法都會開始執行 

  (2)如果在父級的Start方法裏面設置子級的腳本不可用 

          那麼會執行子集裏面的Awake,OnEnable和OnDisable方法,當子級被激活後(enabled=true),會先執行OnEnable,然後執行Start方法,Update等幀序列方法也都會開始執行

B(1)如果在子級的Awake方法裏面設置父級的腳本不可用 

          那麼會執行父級裏面的Awake,OnEnable和OnDisable方法,當父級被激活後(enabled=true),會先執行OnEnable,然後執行Start方法,Update等幀序列方法都會開始執行  

  (2)如果在子級的Start方法裏面設置父級的腳本不可用  

          那麼會執行父集裏面的Awake,OnEnable,Start和OnDisable方法,當父級被激活後(enabled=true),會先執行OnEnable,Update等幀序列方法也都會開始執行

如果被激活的腳本之前沒有調用Start方法,那麼當此腳本被激活後,會調用一次Start方法!具體,看生命週期第一幅圖,在文章後面!

11、OnDisable 

如果腳本被設置爲不可用將會被執行,程序結束時也會執行一次! 

 

OnEnable 和 OnDisable 只受腳本的可用狀態的影響(enabled)

OnBecameVisible 和 OnBecameInvisible 是受對象是否可見的影響(如下)!即使腳本設置爲不可用,OnBecameVisible和OnBecameInvisible 也會被執行,主要是看對象是否在場景中顯示了!

 

OnBecameVisible 和 OnBecameInvisible : 

(1)當一開始加載一個對象時: 

Game 顯示     Scene 顯示      OnBecameInvisible   不執行   OnBecameVisible 執行 

Game 不顯示   Scene 不顯示    OnBecameInvisible   不執行   OnBecameVisible 不執行 

Game 不顯示   Scene 顯示      OnBecameInvisible   不執行   OnBecameVisible 執行 

Game 顯示     Scene 不顯示    OnBecameInvisible   不執行   OnBecameVisible 執行 

小結:只要Game和Scene中有一個顯示了,OnBecameVisible 就會執行!而OnBecameInvisible 一直都不會執行 

(2)當移動對象時: 

game 和 scene 對象必須在兩個場景中同時消失  OnBecameInVisible 才執行 

scene 和 game 只要有一方進入了場景 OnBecameVisible 就執行了

 

腳本執行順序總結:

假如現在有三個GameObject對象:a1 > a2 > a3 (a1爲a2的父節點,a2爲a1的父節點,unity執行腳本的順序是從上往下執行,也就是說先執行父節點上的腳本,再去執行子節點的腳本,子節點上如果有多個腳本,那麼也是自上而下的順序執行),這三個對象對應各有一個腳本:s1,s2,s3,且這三個腳本代碼都一樣,都有Awake,Start,Update,LateUpdate,FixUpdate,那麼當運行程序時,程序會進行分組,即把s1,s2,s3中的Awake方法組成一組,把Start方法組成一組,把Update方法組成一組,把LateUpdate方法組成一組,把FixUpdate方法組成一組,最後按照Awake,Start,FixUpdate,Update,LateUpdate(FixUpdate和Update順序不確定)的順序依次執行!即把Awake組裏面的Awake方法全執行完,再去依次執行Start,FixUpdate,Update,LateUpdate組裏面的代碼:執行順序如下:

Awak1 Awak2 Awak3 Start1 Start2 Start3 FixUpdate1 FixUpdate2 FixUpdate3 Update1 Update2 Update3 LateUpdate1 LateUpdate2 LateUpdate3 

 

  

參考:http://wiki.unity3d.com/index.php?title=Life_cycle#0_:_Start

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章