(Editor)以上是Unity官方文檔中的截圖,腳本在被掛載到物體上,會啟用Editor的方法Reset。
(Initialization)當執行腳本開始,初始化的過程中,依次執行的是Awake->OnEnable->Start,這些方法均只被執行一次。
(Physics)接下來執行的方法依次是FixedUpdate->yield WaitForFixedUpdate->內部的物理更新->OnTriggerXXX->OnCollisionXXX,這些方法循環執行,主要用于物理計算過程。
(Input events)再執行完物理部分以后,會執行Input的事件過程(http://docs.unity3d.com/ScriptReference/Input.html),如OnMouseDown等。
(Game logic)Input執行之后的,執行的腳本的邏輯部分,即Update->yield null->yield WaitForSeconds->yield WWW->yield StartCoroutine->動畫更新->LateUpdate。
(Scene rendering)執行完成邏輯以后,會執行場景的繪制部分,該部分執行了一連串的繪制操作,OnWillRenderObject->OnPreCull->OnBecameVisible->OnBecameInVisible->OnPreRender->OnRenderObject->OnPostRender->OnRenderImage。
(Gizmo rendering)接下來的執行順序到了OnDrawGizmos,此過程僅在Editor模式下執行。
(GUI rendering)在此過程,OnGUI的方法每幀會被執行多次。
(End of frame)每幀結束調用的方法,即yield WaitForEndOfFrame。
(Pausing)當幀停止時,執行OnApplicationPause方法,當繼續執行后直接從Start之后的方法繼續執行。
(Disable/enable)腳本禁用時,執行Ondisable方法,如果腳本在此開啟,則重新執行OnEnable,但是不走Start(測試過是這樣)
(Decommissioning)當腳本被吊銷,最后執行OnDestroy方法,最后是程序退出。
以上過程就是腳本的整個生命周期,里邊的每個階段需要關注一下,以前了解的不夠直觀,爭取以后能用到這些。這里還需要注意一個點,就是如果每個腳本都有Awake方法,具體哪個腳本的Awake方法先執行呢,這里可以通過Unity進行設置,通過Edit->Project Settings->Script Execution Order菜單進行設置,腳本后面的數字越小,腳本越靠上,也就越先執行,其中的DefaultTime表示沒有設置腳本的執行順序的執行順序。
接下來從別人的博客借鑒過來的,從項目文件中分析腳本的編譯順序,中途涉及到了特殊文件夾,希望能對大家有用。(作者地址:http://www.cnblogs.com/champ/p/execorder.html)
關于腳本的編譯順序,官方的說法有點模糊,官方的解釋如下:
由于腳本的編譯順序會涉及到特殊文件夾,比如上面提到的Plugins、Editor還有Standard Assets等標準的資源文件夾,所以腳本的放置位置就非常重要了。下面用一個例子來說明不同文件夾中的腳本的編譯順序:
實際上,如果你細心的話會發現,如果在你的項目中建立如上圖所示的文件夾層次結構時,編譯項目之后會在項目文件夾中生成一些文件名中包含Editor、firstpass這些字樣的項目文件。比如按照上圖的文件夾結構,我們打開項目文件夾來看一下產生的項目文件是什么樣的?
下面就來詳細探討一下這些個字樣是什么意思?它們與腳本的編譯順序有著怎樣的聯系?
1、首先從腳本語言類型來看,Unity3d支持3種腳本語言,都會被編譯成CLI的DLL
如果項目中包含有C#腳本,那么Unity3D會產生以Assembly-CSharp為前綴的工程,名字中包含”vs”的是產生給Vistual Studio使用的,不包含”vs”的是產生給MonoDevelop使用的。
項目中的腳本語言 | 工程前綴 | 工程后綴 |
C# | Assembly-CSharp | csproj |
UnityScript | Assembly-UnityScript | unityproj |
Boo | Assembly-Boo | booproj |
如果項目中這三種腳本都存在,那么Unity將會生成3種前綴類型的工程。
2、對于每一種腳本語言,根據腳本放置的位置(其實也部分根據腳本的作用,比如編輯器擴展腳本,就必須放在Editor文件夾下),Unity會生成4中后綴的工程。其中的firstpass表示先編譯,Editor表示放在Editor文件夾下的腳本。
在上面的示例中,我們得到了兩套項目工程文件:分別被Virtual Studio和MonoDevelop使用(后綴包不包含vs),為簡單起見,我們只分析vs項目。得到的文件列表如下:
Assembly-CSharp-filepass-vs.csproj
Assembly-CSharp-Editor-filepass-vs.csproj
Assembly-CSharp-vs.csproj
Assembly-CSharp-Editor-vs.csproj
根據官方的解釋,它們的編譯順序如下:
(1)所有在Standard Assets、Pro Standard Assets或者Plugins文件夾中的腳本會產生一個Assembly-CSharp-filepass-vs.csproj文件,并且先編譯;
(2)所有在Standard Assets/Editor、Pro Standard Assets/Editor或者Plugins/Editor文件夾中的腳本產生Assembly-CSharp-Editor-filepass-vs.csproj工程文件,接著編譯;
(3)所有在Assets/Editor外面的,并且不在(1),(2)中的腳本文件(一般這些腳本就是我們自己寫的非編輯器擴展腳本)會產生Assembly-CSharp-vs.csproj工程文件,被編譯;
(4)所有在Assets/Editor中的腳本產生一個Assembly-CSharp-Editor-vs.csproj工程文件,被編譯。之所以按照這樣建立工程并按此順序編譯,也是因為DLL間存在的依賴關系所決定的。
文章列表