程序集(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 Definition
的 Inspector
窗口中,可以指定程序集的平台。在构建时,Unity 会根据目标平台编译程序集,只有该平台的程序集会被包含在构建结果中。
将平台设置为仅
Editor
时可以创建编辑器程序集。
宏定义
程序集还可以根据宏定义进行编译,只有符合宏定义的代码才会被编译到程序集中。在 Assembly Definition
的 Inspector
窗口中,可以指定程序集的宏定义。
通过以下方式可以获得或修改宏定义:
- Project Settings > Player > Other Settings > Scripting Define Symbols。
- Unity 内置宏,如
UNITY_EDITOR
、UNITY_2019
等。 - 在
Version Defines
定义宏。
程序集属性
在 Assembly Definition
的目录中创建 AssemblyInfo.cs
文件,可以设置程序集的属性,如程序集名称、版本号等。以下是一个示例:
using System.Reflection;
[assembly: AssemblyTitle("MyAssembly")]
[assembly: AssemblyCompany("MyCompany")]
[assembly: AssemblyCopyright("MyProduct")]