常见的四种程序集

下面是 Unity 中的预定义程序集(Predefined Assemblies)、默认创建的程序集(Default Assemblies)、自定义程序集(Custom Assemblies)和 预编译程序集(Precompiled Assemblies)四者的关系与区别的对比表格:

特性 预定义程序集 (Predefined Assemblies) 默认创建的程序集 (Default Assemblies) 自定义程序集 (Custom Assemblies) 预编译程序集 (Precompiled Assemblies)
定义 Unity 引擎提供的核心程序集,包含 Unity 引擎功能 Unity 自动创建的程序集,包含项目的用户代码 开发者手动创建和管理的程序集,通常通过 .asmdef 文件创建 编译后的程序集文件,用于加速编译,减少重新编译时间
主要内容 UnityEngine.dllUnityEditor.dllmscorlib.dll Assembly-CSharp.dllAssembly-CSharp-Editor.dll 开发者编写的代码,按模块划分,如游戏逻辑、编辑器扩展等 已编译的 .dll 文件,可能是游戏逻辑、工具或者其他功能模块的代码
创建方式 自动创建,由 Unity 提供 自动创建,由 Unity 生成 开发者手动创建,通过 .asmdef 文件配置 由编译工具(例如 Visual Studio)创建,供编译优化使用
是否由开发者管理 否(由 Unity 自动管理) 否(由 Unity 自动管理) 是(开发者手动管理) 是(开发者在编译时控制)
是否支持程序集依赖管理 是(可以设置程序集间的依赖关系) 是(通过编译工具设置,便于引用和依赖管理)
是否影响编译性能 是(合理的程序集划分可以提高编译效率) 是(预编译可减少编译时间,提升开发效率)
是否包含 Unity 引擎功能
典型例子 UnityEngine.dllUnityEditor.dll Assembly-CSharp.dllAssembly-CSharp-Editor.dll 自定义的 Assembly-MyGame.dllAssembly-Utils.dll 编译后的 GameLogic.dll 或者 MyUtils.dll
是否能修改 是(可以通过 .asmdef 修改) 否(预编译后不可修改,需要重新编译源代码)
引用方式 自动引入,无需手动管理,Unity 会默认引用 自动引入,无需手动管理,Unity 会默认引用 通过 .asmdef 文件引用,可以手动配置引用关系 需要手动引用已编译的 .dll 文件,通常通过项目配置或 Assembly-CSharp.csproj 引用
引用范围 全局有效,任何脚本都可以直接使用 全局有效,任何脚本都可以直接使用 .asmdef 文件设置的依赖关系范围引用 只在编译后生成的程序集文件中引用,引用方式类似于外部 DLL
如何引用 自动引入,无需手动引用,Unity 引擎自动加载 自动引入,无需手动引用,Unity 自动加载 必须在 .asmdef 文件中显式配置依赖的程序集,或者手动在代码中通过 using 引用 通过 using 引用预编译后的 DLL,通常需要手动将 .dll 文件添加到项目中并配置引用
修改后需要重新编译 不需要(Unity 会自动包含) 不需要(Unity 会自动包含) 需要重新编译相关程序集,或修改 .asmdef 文件 需要重新编译源代码并生成新的 .dll 文件

说明:

  1. 预定义程序集:这些程序集由 Unity 提供,包含了 Unity 引擎的核心功能,开发者不需要管理。它们自动被 Unity 项目引用并编译。

  2. 默认创建的程序集:这些是 Unity 自动为你创建的程序集,包含了项目中的基本脚本代码。默认情况下,Unity 会把代码放在 Assembly-CSharp.dll 等文件中,并为编辑器扩展创建 Assembly-CSharp-Editor.dll

  3. 自定义程序集:开发者通过 .asmdef 文件来划分和管理自己的代码。这些程序集允许开发者按功能模块组织代码,设置依赖关系,从而提高代码的可维护性和编译效率。

  4. 预编译程序集:这是已经编译好的程序集文件,通常是为了加速编译过程而使用的。开发者可以通过编译工具生成预编译的 .dll 文件,它们在项目中作为模块或工具库使用。

总结:

  • 预定义程序集默认创建的程序集 是 Unity 自动生成并管理的,开发者无需关心其内部细节。
  • 自定义程序集 由开发者通过 .asmdef 文件进行划分和管理,可以根据需要配置依赖关系和模块划分。
  • 预编译程序集 是提前编译好的程序集文件,用于提高编译效率,减少每次修改后的重新编译时间。

通过合理管理这些程序集,可以优化项目结构,提升开发效率,尤其是在大型项目中。

自动引用属性

Unity 自定义程序集(Custom Assemblies)中,自动引用属性(Automatic Reference)是一个非常重要的功能,它帮助开发者自动引用其他程序集,无需手动配置依赖关系。下面是对这个功能的详细解释:

1. 定义与作用

  • 自动引用属性(Automatic Reference) 是在 .asmdef 文件中配置的一项功能。
  • 它的作用是:当你创建自定义程序集(.asmdef 文件)时,Unity 会自动添加与当前程序集相关的其他程序集引用,减少开发者手动添加引用的麻烦。
  • 通过启用这个属性,Unity 会根据程序集的内容和依赖情况,自动处理该程序集的引用。

2. 为什么需要自动引用?

在复杂的 Unity 项目中,可能会有多个程序集相互依赖。例如,UI 逻辑、游戏逻辑、编辑器扩展等通常会被拆分到不同的程序集中。在这种情况下,如果每个程序集都需要手动添加引用,管理起来会非常繁琐且容易出错。

自动引用属性 可以根据程序集的依赖自动完成引用配置,减轻开发者的工作量,确保依赖关系正确。

3. 自动引用的工作原理

  • 当你为某个程序集(例如 Assembly-UI)创建了 .asmdef 文件,并启用了自动引用属性,Unity 会自动检查与该程序集相关的其他程序集,并为你自动添加引用。
  • 比如,当你在 Assembly-UI 中使用了 UnityEngine 或者 UnityEditor 中的 API,Unity 会自动为该程序集添加对这些程序集的引用。

4. 使用场景

  • 简化程序集管理:在大型项目中,当多个程序集之间有复杂的依赖关系时,自动引用可以确保相关依赖得到正确配置,而不必手动去每个 .asmdef 文件中显式添加引用。
  • 减少错误:如果手动添加引用,可能会出现漏掉某些依赖或引入错误的程序集版本的问题。自动引用可以减少此类错误,确保引用的程序集始终是正确的。
  • 快速迭代:自动引用可以加速开发过程中,新的自定义程序集被创建或修改时,依赖关系可以自动处理,而不需要每次都手动配置。

5. 如何启用自动引用属性

  • 在 Unity 编辑器中,选择你的 .asmdef 文件,打开 Inspector 面板。
  • Inspector 面板中,可以找到 “Automatic References”“Auto References” 属性(具体名称可能会根据版本有所不同)。
  • 启用该选项后,Unity 会自动处理与其他程序集的依赖关系,无需手动添加引用。

6. 限制与注意事项

  • 手动控制优先:如果某个自定义程序集的引用依赖关系需要精确控制(例如,避免引入某些不必要的程序集),你仍然可以手动添加或移除某些程序集的引用。自动引用只是提供一个默认的行为,手动配置会覆盖默认行为。
  • 递归引用:自动引用会在当前程序集的依赖树中查找并自动添加引用,但如果存在循环依赖(例如 A 引用 B,B 又引用 A),可能会导致问题。此时仍需要手动处理依赖关系。

7. 总结

自动引用属性 是一种便捷的方式,使得 Unity 能够自动管理和引用自定义程序集之间的依赖关系,减少开发者手动添加引用的工作。它有助于避免手动配置过程中可能出现的错误,尤其在大型项目中,能够显著提高效率。

然而,在某些情况下,开发者仍然需要手动配置或精确控制引用的程序集,特别是当涉及到特殊的依赖或避免循环引用时。

No Engine References

Unity 中,**No Engine References** 是指在 Assembly Definition (.asmdef) 文件中,可以为特定程序集设置的一个属性。启用这个属性后,Unity 将会禁用该程序集对 Unity 引擎相关程序集(如 UnityEngine.dllUnityEditor.dll)的引用。

1. No Engine References 的作用

启用 No Engine References 属性后,Unity 会确保该程序集不会自动引用任何 Unity 引擎相关的程序集。具体来说,这意味着:

  • No Engine References 会移除该程序集对 UnityEngineUnityEditor 等核心 Unity 引擎程序集的引用。
  • 程序集内部不能直接使用 Unity 引擎提供的类和 API,比如 TransformGameObjectMonoBehaviour 等。

2. 为什么要使用 No Engine References

这个属性的主要用途是确保某些程序集不会不小心引用 Unity 引擎的 API,通常这种做法会在以下情况下使用:

a) 优化依赖关系

如果你的代码不需要依赖 Unity 引擎的核心 API,启用该属性可以避免不必要的依赖。例如,某些逻辑代码仅仅是处理数据、算法或者一些工具类功能,这类代码不应该与 Unity 引擎的功能产生耦合。

b) 跨平台需求

某些平台可能不支持 Unity 引擎的全部功能(如 WebGL、iOS、Android 等),启用 No Engine References 可以避免不兼容的引用。例如,Unity 引擎的某些功能可能在 WebGL 上不可用,而启用该属性可以确保代码不会无意中引用这些不支持的功能。

c) 自定义功能模块

如果你想编写一个完全独立的、仅依赖于 .NET 标准库的程序集(例如一些数据处理、网络通信或业务逻辑),则 No Engine References 是一种很好的方式来确保你的程序集与 Unity 引擎的代码完全分离。这样,你的代码只依赖于标准的 C# 库,而不依赖于 Unity 引擎的特殊功能。

d) 避免代码依赖问题

在大型项目中,有时开发者希望避免无意中在某些工具或库中引用 Unity 引擎的 API。启用 No Engine References 可以作为一种防止开发人员在不应该引用引擎代码时发生错误的手段。

3. 使用场景

你可能会在以下情况下使用 No Engine References 属性:

  • 业务逻辑层:如果你希望将业务逻辑(例如玩家的分数计算、排行榜、数据处理等)与 Unity 引擎解耦,那么你可以创建一个没有 Unity 引擎引用的程序集,只处理业务逻辑。

  • 跨平台工具类:你有一些与平台无关的工具类,例如日志管理、网络请求、序列化工具等,这些工具类不应该依赖 Unity 引擎的任何功能。

  • 独立测试代码:如果你写了单元测试或独立模块,且这些测试/模块不需要依赖 Unity 引擎,你可以通过启用这个属性来确保它们不依赖 Unity 引擎。

4. 与默认程序集的区别

默认情况下,Unity 会为每个程序集自动添加 UnityEngineUnityEditor 等引擎程序集的引用。如果启用了 **No Engine References**,这些引用将被禁用,意味着你不能在该程序集内直接使用 Unity 引擎的 API。

5. 如何使用 No Engine References

在 Unity 中,你可以通过以下步骤为一个程序集启用 No Engine References 属性:

  1. Project 视图中,找到你希望设置的 .asmdef 文件
  2. 选中该 .asmdef 文件,然后在 Inspector 面板中查看该程序集的设置。
  3. 启用 No Engine References 选项。

6. 总结

No Engine References 属性在 Unity 中的主要作用是确保某个程序集不引用 Unity 引擎相关的程序集。它适用于需要与引擎代码解耦的场景,如独立的工具类、跨平台代码或业务逻辑模块。

通过启用这个属性,可以避免不必要的依赖,优化程序集的结构和性能,确保代码的独立性和跨平台性。

Override References

启用 Override References 设置可手动指定此程序集所依赖的预编译程序集。启用 Override References 后,检查器将显示“程序集引用”部分,您可以使用该部分指定引用。

预编译程序集是在 Unity 项目之外编译的库。默认情况下,您在项目中定义的程序集会引用您添加到项目的所有预编译程序集,这与预定义程序集引用所有预编译程序集的方式相匹配。启用 Override References 后,此程序集仅引用您在“程序集引用”下添加的预编译程序集。

注意:为防止项目程序集自动引用预编译程序集,您可以禁用其“自动引用”选项。有关更多信息,请参阅插件检查器。

Assembly References

仅当您启用 Override References 属性(在“常规”部分中)时,才会显示“程序集引用”部分。使用此区域指定此程序集所依赖的预编译程序集的任何引用。

Assembly Definition References

程序集定义引用 使用程序集定义资源指定对您创建的其他程序集的引用。Unity 使用这些引用来编译程序集并定义程序集之间的依赖关系。