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