Unity预定义程序集及自定义包编译顺序


在Unity项目中,unity会按照脚本在项目中的位置生成四个预定义程序集(Assembly-CSharp-firstpass,Assembly-CSharp-Editor-firstpass,Assembly-CSharp,Assembly-CSharp-Editor),其编译顺序是按插件->工程代码,运行时->Editor规则交错的编译顺序.

对于Package的代码,Package中的代码不能依赖于预定义程序集,只能依赖于Unity插件!所谓插件指的是编译成dll或平台对应的库文件.

特殊文件夹和脚本编译顺序


Unity 保留了一些项目文件夹名称来指示内容具有特殊用途。其中一些文件夹会影响脚本编译的顺序。这些文件夹名称为:

  • Assets
  • Editor
  • Editor default resources
  • Gizmos
  • Plugins
  • Resources
  • Standard Assets
  • StreamingAssets

请参阅特殊文件夹名称了解有关这些文件夹的更多信息。

预定义的程序集


Unity 根据脚本文件在项目文件夹结构中的位置,以四个不同的阶段编译脚本。Unity 为每个阶段创建一个单独的 CSharp 项目文件 (.csproj) 和一个预定义的程序集。(如果没有符合编译阶段的脚本,Unity 不会创建相应的项目文件或程序集。)

当脚本引用在不同阶段编译的类(因此位于不同的程序集中)时,编译顺序很重要。基本规则是无法引用在当前阶段_之后_的阶段编译的任何内容。在当前阶段或早期阶段编译的所有内容则是完全可用的。

编译阶段如下:

阶段 程序集名称 脚本文件
1 Assembly-CSharp-firstpass 名为 Standard Assets、Pro Standard Assets 和 Plugins 的文件夹中的运行时脚本。
2 Assembly-CSharp-Editor-firstpass 名为 Editor 的文件夹(位于名为 Standard Assets、Pro Standard Assets 和 Plugins 的顶级文件夹中的任意位置)中的 Editor 脚本。
3 Assembly-CSharp 不在名为 Editor 的文件夹中的所有其他脚本。
4 Assembly-CSharp-Editor 其余所有脚本(位于名为 Editor 的文件夹中的脚本)。

注意:Standard Assets 仅在 Assets 根文件夹中有效。

您可以创建程序集定义文件,从而使用自己的程序集来组织项目中的脚本。定义自己的程序集可以减少在进行不相关的代码更改时需要重新编译的代码量,并可提供对其他程序集的依赖性的更多控制。请参阅脚本编译 - 程序集定义文件以了解更多信息。

默认引用

默认情况下,预定义程序集会引用所有其他程序集,包括使用程序集定义创建的程序集 (1) 以及作为插件添加到项目中的预编译程序集 (2)。此外,使用程序集定义资源创建的程序集会自动引用所有预编译程序集 (3):

默认设置中,预定义程序集中的类可以使用项目中任何其他程序集定义的所有类型。同样,使用程序集定义资源创建的程序集可以使用在任何预编译(插件)程序集中定义的所有类型。

可以通过在程序集定义资源的 Inspector 中关闭 [Auto Referenced 选项]来防止预定义程序集引用某个程序集。关闭自动引用意味着在更改程序集中的代码时不会重新编译预定义程序集,但也意味着预定义程序集无法直接使用此程序集中的代码。请参阅[程序集定义 (Assembly Definition) 属性]。

同样,可以通过在插件资源的 [Plugin Inspector] 中关闭 [Auto Referenced 属性]来防止自动引用插件程序集。这会影响预定义程序集以及使用程序集定义创建的程序集。请参阅 [Plugin Inspector] 以了解更多信息。

关闭插件的 Auto Referenced 时,可以在 Inspector 中为程序集定义资源显式引用它。请启用该资源的 [Override References] 选项,然后添加对插件的引用。请参阅[程序集定义 (Assembly Definition) 属性]。

注意 :无法声明预编译程序集的显式引用。预定义程序集只能使用自动引用的程序集中的代码。

程序集定义和包


必须将包内的脚本与程序集定义文件 (.asmdef) 关联。在 Unity 中,程序集定义文件等效于 .NET 生态系统中的 C# 项目。必须在程序集定义文件中设置对其他程序集(无论是在同一包中还是在外部包中)的显式引用。请参阅程序集定义以了解更多详细信息。

请使用以下约定来命名和存储程序集定义文件,确保编译的程序集文件名遵循 .NET Framework 设计指南 (.NET Framework Design Guidelines):

  • 将特定于 Editor 的代码存储在根 Editor 程序集定义文件中:

    Editor/MyCompany.MyFeature.Editor.asmdef

  • 将特定于运行时的代码存储在根运行时程序集定义文件中:

    Runtime/MyCompany.MyFeature.Runtime.asmdef

  • 为 Editor 和运行时脚本配置相关的测试程序集:

    Tests/Editor/MyCompany.MyFeature.Editor.Tests.asmdef

    Tests/Runtime/MyCompany.MyFeature.Runtime.Tests.asmdef

要整体了解建议的包文件夹布局,请参阅自定义包布局。

相关参考链接:
特殊文件夹名称
程序集定义和包
程序集定义
程序集定义 (Assembly Definition) 属性
自定义包布局

技术有限,如有纰漏,请在回复中指出.