跳到主要内容

代码保护

Starter、Indie 和 Pro 版本以已编译的 DLL 形式把引擎放在 .unitypackage 中交付,而不是 C# 源码。在这些 DLL 中,我对引擎的内部 名称做了混淆,因此无法直接打开软件包并把它还原成源码阅读。 Source 和 Studio 版本直接附带 C# 源码,所以这些内容不适用于它们。

本页说明这在实际中意味着什么:你能否针对引擎编写脚本、你的预制体和场景是否安全, 以及哪些内容被有意保持可读。

各版本的情况​

版本引擎交付形式公开 APIXML 文档调试符号
Starter已编译的 DLL封闭无无
Indie已编译的 DLL可读有无
Pro已编译的 DLL可读有无
SourceC# 源码源码直接阅读源码不适用
StudioC# 源码源码直接阅读源码不适用

Indie 和 Pro:像平常一样针对引擎编程​

在 Indie 和 Pro 中,公开 API 保持可读。它的类型名和成员名不会 被重命名,软件包也附带它的 XML 文档。在你的 IDE 里,这意味着每个公开成员都有 自动补全、参数提示和悬停提示,与任何其他 C# 库完全一样。

所有不属于公开 API 的内容,即引擎的内部实现,都被混淆了。构建游戏并不需要 这些名称:公开接口面就是受支持的入口。它涵盖的内容请参见 公共 API。

Starter:API 是封闭的​

Starter 是评估版本,因此它的公开 API 是封闭的:名称被混淆, 也不附带 XML 文档。你不应针对它编写 C# 代码。

Inspector、Hub 和可视化脚本图所提供的一切,你依然可以使用, 而且组件和资产保留其正常名称(见下一节),因此你可以像往常一样把它们添加到场景和预制体中, 并在 Inspector 中看到它们。若要针对引擎编写自己的代码, 请升级到 Indie 或更高版本。各版本的对比见常见问题。

哪些内容永远不会被混淆,以及原因​

在每个版本中,有两类名称都保持原样,因为 Unity 本身需要它们:

  • 派生自 UnityEngine.Object 的类的名称:组件 (MonoBehaviour)和资产(ScriptableObject)。
  • 序列化字段的名称。

Unity 按名称查找它们。字段名称是写入你的预制体和场景文件中的键, 也是你在 Inspector 中看到的标签。如果我把它们重命名,存储在你的 预制体里的数据就找不到自己的字段,这些预制体就会损坏。

你的预制体和场景是安全的

由于组件名称、资产名称和序列化字段名称从不改变,你用引擎构建的预制体 和场景不会受到混淆的影响。

结论既坦率又简单:这些名称是可见的,因为 Unity 必须能够读取它们。 它们是引擎中必须保持可读的那一部分,否则引擎根本无法在你的项目中工作。

没有调试符号​

我打开了 Starter、Indie 和 Pro 的软件包,其中都不包含符号文件 (.pdb 或 .mdb)。已编译的版本中没有任何内容能让调试器逐行 单步执行引擎代码。如果你需要在引擎内部调试,那正是 Source 和 Studio 版本的用途。

导入不受影响​

我把每个已编译的版本都导入到一个新的 Unity 6 项目中,以检查保护措施 是否会妨碍软件包干净地导入,并且每个版本我都做了两次。