.asmdef程序集定義文件Assembly Definition File

轉自:http://tieba.baidu.com/p/5496292012

程序集定義文件Assembly Definition File,使用該特性,開發者可以在一個文件夾中自定義託管程序集。定義明晰的依賴文件,可以確保腳本被更改後,只會重新生成必需的程序集,減少編譯時間。

開發者的項目越大,編譯時間必然會越長。而在進行項目迭代時,這很容易會成爲一個問題,因此設置好正確的程序集定義文件可以助力提高工作效率,減少等待腳本編譯的時間。

腳本編譯—程序集定義文件

Unity自動定義腳本編譯爲託管程序集的方式。Unity編輯器中進行腳本更改迭代的編譯時間會隨腳本數量的增加而增加。當然, 在進行迭代時,我們一定是希望編譯的速度越快越平順越好。

你可以使用新的程序集定義文件特性,基於文件夾中的腳本定義你自己的託管程序集。如果你將項目腳本分爲多個程序集,並進行良好的依賴定義,可以確保你在更改某個腳本時,只會重新生成必需的程序集。這減少了編譯時間,因此你可以在Unity項目中將每個託管程序集看做是單個的庫。

圖中展示的是可以將項目腳本分爲多個程序集。如果你僅僅更改了Main.dll中的腳本,那其它程序集都不需要重新編譯。由於Main.dll包含的腳本更少,因此它的編譯速度比Assembly-CSharp.dll更快。 同樣的,你對Stuff.dll的更改,僅會導致Main.dll和Stuff.dll重新編譯。

如何使用程序集定義文件

程序集定義文件是資源文件,可以通過Assets > Create > Assembly Definition菜單創建。它們的擴展名是.asmdef。

你可以將一個程序集定義文件添加到Unity項目中的一個文件夾裏,對該文件夾裏所有的腳本進行編譯,然後在檢視窗口中對程序集名稱進行設置。


注意:程序集定義文件所在的文件夾名稱,以及程序集定義文件的文件名,對程序集的名稱毫無影響。

你還可以使用檢視窗口添加對項目中其它程序集定義文件的引用。編譯程序集和定義程序集間的依賴時會用到這些引用。

Unity使用引用來編譯程序集,以及定義程序集之間的依賴關係。你可以在檢視窗口中設置程序集定義文件的平臺兼容性,也可以選擇排除或包括特定平臺。

文件夾層級中的多程序集定義文件

如果在一個文件夾層級中,有多個程序集定義文件(擴展名:asmdef),將會使每個腳本被添加到最短路徑距離的程序集定義文件中去。

示例:

假設你有一個Assets/ExampleFolder/MyLibrary.asmdef和一個Assets/ExampleFolder/ExampleFolder2/Utility.asmdef文件,那麼:Assets > ExampleFolder > ExampleFolder2文件夾中的所有腳本將會被編譯到Assets/ExampleFolder/ExampleFolder2/Utility.asmdef定義的程序集中。

Assets > ExampleFolder文件夾中的所有腳本,除Assets > ExampleFolder> ExampleFolder2中的腳本之外,將會被編譯到Assets/ExampleFolder/MyLibrary.asmdef定義的程序集中。

程序集定義文件不屬於生成系統的文件

注意:程序集定義文件不屬於程序集生成文件。它們不支持在生成系統中常見的條件化生成規則。

這也是程序集定義文件不支持預處理指令(定義)的原因,因爲它們一直是靜態的。

向後兼容與隱式依賴

程序集定義文件向後兼容Unity中現存的[預定義編譯系統](Predefined Compilation System)。也就是說,預定義程序集總是依賴於每個程序集定義文件的程序集。這與Unity中所有腳本都依賴於所有和當前生成目標兼容的預編譯程序集(插件/.dll)的情況相似。

圖中的圖表展示了預定義程序集、程序集定義文件以及預編譯程序集之間的依賴關係。

Unity給予程序集定義文件的優先級要比[預定義編譯系統](ScriptCompileOrderFolders)高。

這意味着,任何來自程序集定義文件文件夾內的預定義編譯的特殊文件夾名,都不會對編譯產生任何影響。Unity只將它們視爲常規文件夾。

強烈建議你對項目中的所有腳本使用程序集定義文件,或完全不使用。否則,沒有使用程序集定義文件的腳本會在每次程序集定義文件重新編譯時也被重新編譯。這會減少你在項目中程序集定義文件所帶來的好處。

API

在UnityEditor.Compilation命名空間中,有一個靜態的CompilationPipeline類,你可用它獲取程序集定義文件以及所有由Unity生成的程序集的信息。

文件格式

程序集定義文件都是JSON文件。它們有以下這些字段:

字段includePlatforms和 excludePlatforms不能在同一個程序集定義文件中使用。要獲取平臺名,可使用:
CompilationPipeline.GetAssemblyDefinitionPlatforms

示例

MyLibrary.asmdef
{
"name" : "MyLibrary" ,
"references" : [ "Utility" ],
"includePlatforms" : [ "Android" , "iOS" ]
}
{
"name" : "MyLibrary2" ,
"references" : [ "Utility" ],
"excludePlatforms" : [ "WebGL" ]
}

 

 

 

 

 

 

 

 

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