代码保护
Starter、Indie 和 Pro 版本以已编译的 DLL 形式把引擎放在
.unitypackage 中交付,而不是 C# 源码。在这些 DLL 中,我对引擎的内部
名称做了混淆,因此无法直接打开软件包并把它还原成源码阅读。
Source 和 Studio 版本直接附带 C# 源码,所以这些内容不适用于它们 。
本页说明这在实际中意味着什么:你能否针对引擎编写脚本、你的预制体和场景是否安全, 以及哪些内容被有意保持可读。
各版本的情况
| 版本 | 引擎交付形式 | 公开 API | XML 文档 | 调试符号 |
|---|---|---|---|---|
| Starter | 已编译的 DLL | 封闭 | 无 | 无 |
| Indie | 已编译的 DLL | 可读 | 有 | 无 |
| Pro | 已编译的 DLL | 可读 | 有 | 无 |
| Source | C# 源码 | 源码 | 直接阅读源码 | 不适用 |
| Studio | C# 源码 | 源码 | 直接阅读源码 | 不适用 |
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 项目中,以检查保护措施 是否会妨碍软件包干净地导入, 并且每个版本我都做了两次。