Unity-腳本編譯和程序集定義文件
關(guān)于
Unity 自動(dòng)定義腳本如何編譯到托管程序集。通常情況下,隨著向項(xiàng)目添加的腳本越來越多,Unity Editor 中用于迭代腳本更改的編譯時(shí)間也會(huì)相應(yīng)增加。
可使用程序集定義文件根據(jù)文件夾中的腳本來定義您自己的托管程序集。為此,請(qǐng)將項(xiàng)目腳本分成具有明確定義的依賴項(xiàng)的多個(gè)程序集,以確保在腳本中進(jìn)行更改時(shí)僅重新構(gòu)建所需的程序集。這樣可以減少編譯時(shí)間。應(yīng)將每個(gè)托管程序集視為 Unity 項(xiàng)目中的單個(gè)庫。

上面的圖 1?說明了如何將項(xiàng)目腳本拆分為多個(gè)程序集。僅更改 Main.dll 中的腳本不會(huì)導(dǎo)致其他任何程序集重新編譯。由于 Main.dll 包含的腳本較少,因此編譯速度也比 CSharp.dll 快。 同樣,只有 Stuff.dll 中的腳本更改才會(huì)導(dǎo)致 Main.dll 和 Stuff.dll 重新編譯。
如何使用程序集定義文件
程序集定義文件是通過?Assets?>?Create?>?Assembly Definition?創(chuàng)建的資源文件。這些文件的擴(kuò)展名為 .asmdef。
將一個(gè)程序集定義文件添加到 Unity 項(xiàng)目中的某個(gè)文件夾,即可將該文件夾中的所有腳本編譯為一個(gè)程序集??稍?Inspector 中定義程序集的名稱。
注意:程序集定義文件所在的文件夾的名稱以及程序集定義文件的文件名對(duì)程序集的名稱沒有影響。

添加對(duì)項(xiàng)目其他程序集定義文件的引用也需要使用 Inspector。要查看 Inspector,請(qǐng)單擊程序集定義文件,隨后應(yīng)該會(huì)出現(xiàn)該面板。要添加引用,請(qǐng)單擊?References?部分下的?+?圖標(biāo),然后選擇您的文件。
Unity 使用引用來編譯程序集,還定義程序集之間的依賴關(guān)系。
要標(biāo)記該程序集以進(jìn)行測(cè)試,請(qǐng)?jiān)?Inspector 中啟用 Test Assemblies。這樣會(huì)在程序集定義文件中添加對(duì) unit.framework.dll 和 UnityEngine.TestRunner.dll 的引用。
在標(biāo)記程序集以進(jìn)行測(cè)試時(shí),請(qǐng)確保:
預(yù)定義的程序集(Assembly-CSharp.dll 等)不會(huì)自動(dòng)引用標(biāo)記為進(jìn)行測(cè)試的程序集定義文件。
該程序集未包含在正常構(gòu)建中。要將程序集包含在播放器構(gòu)建中,請(qǐng)?jiān)跇?gòu)建腳本中使用?BuildOptions.IncludeTestAssemblies。請(qǐng)注意,這樣只會(huì)在構(gòu)建中包含程序集,而不會(huì)執(zhí)行任何測(cè)試。
注意:如果在程序集內(nèi)的腳本中使用?unsafe?關(guān)鍵字,必須在 Inspector 中啟用?Allow ‘unsafe’ Code?選項(xiàng)。這樣將在編譯程序集時(shí)將 /unsafe 選項(xiàng)傳遞給 C# 編譯器。
可在 Inspector 中為程序集定義文件設(shè)置平臺(tái)兼容性。在此處可選擇排除或包含特定平臺(tái)。
文件夾層級(jí)視圖中的多個(gè)程序集定義文件
在文件夾層級(jí)視圖中保留多個(gè)程序集定義文件(擴(kuò)展名:.asmdef)會(huì)使每個(gè)腳本添加到具有最短路徑距離的程序集定義文件。
示例:
如果有一個(gè)?Assets/ExampleFolder/MyLibrary.asmdef?文件和一個(gè)?Assets/ExampleFolder/ExampleFolder2/Utility.asmdef?文件, 則:
位于?Assets?>?ExampleFolder?>?ExampleFolder2?文件夾內(nèi)的任何腳本都將編譯為 Assets/ExampleFolder/ExampleFolder2/Utility.asmdef 定義的程序集。
位于?Assets?>?ExampleFolder?文件夾內(nèi)而不在?Assets?>?ExampleFolder?>?ExampleFolder2?文件夾內(nèi)的任何文件都將編譯為 Assets/ExampleFolder/MyLibrary.asmdef 定義的程序集。
程序集定義文件不是構(gòu)建系統(tǒng)文件
注意:程序集定義文件不是程序集構(gòu)建文件。它們不支持構(gòu)建系統(tǒng)中常見的條件構(gòu)建規(guī)則。
也正因?yàn)槿绱?,程序集定義文件不支持預(yù)處理器指令(define 指令)的設(shè)置,因?yàn)樗鼈兪冀K為靜態(tài)。
向后兼容性和隱式依賴關(guān)系
程序集定義文件向后兼容 Unity 中的現(xiàn)有預(yù)定義編譯系統(tǒng)。這意味著預(yù)定義的程序集始終依賴于每個(gè)程序集定義文件的程序集。 這類似于所有腳本都依賴于與 Unity 中的活動(dòng)構(gòu)建目標(biāo)兼容的所有預(yù)編譯程序集(插件/.dll)。

圖 3?中的圖表說明了預(yù)定義程序集、程序集定義文件程序集和預(yù)編譯程序集之間的依賴關(guān)系。
Unity 為程序集定義文件設(shè)定的優(yōu)先級(jí)高于預(yù)定義編譯系統(tǒng)。 這意味著,在程序集定義文件的文件夾中具有來自預(yù)定義編譯的任何特殊文件夾名稱對(duì)編譯沒有任何影響。Unity 將這些文件夾視為沒有任何特殊含義的常規(guī)文件夾。
強(qiáng)烈建議要么對(duì)項(xiàng)目中的所有腳本使用程序集定義文件,要么根本不使用。否則,程序集定義文件每次重新編譯時(shí),不使用程序集定義文件的腳本也會(huì)始終重新編譯。這樣就弱化了使用程序集定義文件的優(yōu)勢(shì)。
API
在 UnityEditor.Compilation 命名空間中,有一個(gè)靜態(tài)的?CompilationPipeline?類用于檢索關(guān)于程序集定義文件和 Unity 構(gòu)建的所有程序集的信息。
文件格式
程序集定義文件是 JSON 文件。它們具有以下字段:
字段類型namestringreferences(可選)字符串?dāng)?shù)組includePlatforms(可選)字符串?dāng)?shù)組excludePlatforms(可選)字符串?dāng)?shù)組
不要在同一程序集定義文件中同時(shí)使用?includePlatforms?和?excludePlatforms?字段。
可使用?CompilationPipeline.GetAssemblyDefinitionPlatforms
?檢索平臺(tái)名稱。
示例