程序集(Assembly)是 .NET 平台组织和部署代码的基本单元,它可以是 .exe 或 .dll,其中包含一个或多个类型、资源、元数据和代码。

在 Unity 中,程序集可以被当作一个代码仓库,我们可以使用程序集来组织代码,将代码划分为多个程序集。默认情况下,Unity 将所有脚本编译到预定义的 Assembly-CSharp.dll 这个程序集中。当代码较多时,会出现以下问题:

  • 编译时间过长:每次编译都需要编译所有代码,即使只修改了一个脚本。
  • 代码难以管理:所有代码都在一个程序集中,没有明确的划分,难以维护和复用。
  • 不能平台独立:无法根据平台进行编译,比如只在 Android 平台使用的代码,也会被编译到 iOS 平台的程序集中。

为了解决这些问题,我们可以将代码划分为多个程序集,每个程序集只包含特定的代码,这样可以提高编译效率,也方便管理代码。

定义程序集

在 Unity 中,程序集的定义是通过 Assembly Definition 来实现的。Unity 会获取包含 Assembly Definition 的文件夹的所有代码,并将其编译到一个程序集中。

为了定义一个程序集,我们需要为所需的程序集创建一个文件夹,并将相关代码放入其中,然后在文件夹中创建一个 Assembly Definition。在 Project 窗口中右键点击文件夹,然后选择 Create > Assembly Definition

定义程序集引用

程序集不仅能包含当前文件夹下的脚本,也可以关联其他文件夹中的脚本。只需要在这些文件中创建 Assembly Definition Reference,并将其引用指向所需的程序集,这些文件夹中的脚本就会被编译到引用的程序集中。

引用和依赖

在默认情况下,以下程序集的引用关系如下:

  • 预定义程序集 Assembly-CSharp.dll 自动引用所有程序集。
  • 手动创建的 Assembly Definition 自动引用所有预定义程序集。

此外,程序集还可以引用其他程序集,这需要声明对其他程序集的引用。通过以下设置可以管理各个程序集之间的引用关系(位于程序集的 Inspector 窗口中):

  • Auto Referenced:Unity 预定义的程序集是否自动引用该程序集。
  • Assembly Definition References:该程序集引用的其他程序集。
  • Override References:启用时,可以手动选择对预编译(Plugin)程序集的引用。
  • No Engine References:该程序集是否引用 Unity 引擎程序集(UnityEngine 和 UnityEditor)。

指定平台

Assembly DefinitionInspector 窗口中,可以指定程序集的平台。在构建时,Unity 会根据目标平台编译程序集,只有该平台的程序集会被包含在构建结果中。

将平台设置为仅 Editor 时可以创建编辑器程序集。

宏定义

程序集还可以根据宏定义进行编译,只有符合宏定义的代码才会被编译到程序集中。在 Assembly DefinitionInspector 窗口中,可以指定程序集的宏定义。

通过以下方式可以获得或修改宏定义:

  • Project Settings > Player > Other Settings > Scripting Define Symbols。
  • Unity 内置宏,如 UNITY_EDITORUNITY_2019 等。
  • Version Defines 定义宏。

程序集属性

Assembly Definition 的目录中创建 AssemblyInfo.cs 文件,可以设置程序集的属性,如程序集名称、版本号等。以下是一个示例:

using System.Reflection;

[assembly: AssemblyTitle("MyAssembly")]
[assembly: AssemblyCompany("MyCompany")]
[assembly: AssemblyCopyright("MyProduct")]