为了提高可用性和性能,Unity 可能会更改类、函数和属性 (API) 的工作方式。有时,当从一个主要 Unity 版本转移到另一个主要 Unity 版本时,这些改进可能会引入破坏性更改。
为了最大限度减少破坏性更改的影响,API 更新程序会识别和更新脚本和程序集中的过时代码。
API 更新程序包括 ScriptUpdater 和 AssemblyUpdater,它们分别负责更新源代码(脚本)和程序集(dll 文件)。
注意:API 更新程序只能修复 API 中的某些错误和警告。这些在控制台消息中标记为 UnityUpgradable。您必须手动解决 API 更新程序无法处理的其他错误或警告。
触发脚本编译时,API 更新程序会自动运行。例如,当您执行以下操作时,将会发生这种情况:
API 更新程序提供更新其检测到的任何过时代码的功能。如果您接受,则会使用推荐的更新 API 版本覆盖任何过时的代码。
例如,API 更新程序会将以下过时语句从:
light.color = Color.red;
转换为:
GetComponent<Light>().color = Color.red;
以下步骤描述 Unity 触发脚本编译时的 API 更新程序工作流程:
如果具有过时代码的脚本落入不同的编译通道(例如编辑器脚本),则更新程序可能会运行多次。
如果您不允许 API 更新程序更新脚本,控制台会显示任何脚本错误或警告。API 更新程序可以解决的错误或警告会显示在消息中 (UnityUpgradable)。
如果您的脚本有其他错误阻止 API 更新程序成功运行,控制台会显示一条消息来通知您。必须先解决这些错误,然后 API 更新程序才能完成更新。
从命令行中以批处理模式运行 Unity 时,可以使用 -accept-apiupdate 选项来运行 API 更新程序。有关更多信息,请参阅命令行参数。
API 更新程序会将其对任何程序集所做的更改记录在 Editor.log 中。要控制记录的信息量,请将 UNITY_APIUPDATER_LOG_THRESHOLD 环境变量设置为所需的日志阈值并启动 Unity。例如:
Windows:
c:> set UNITY_APIUPDATER_LOG_THRESHOLD=Debug
c:> \path\to\unity\Unity.exe
在 Linux 上:
$ export UNITY_APIUPDATER_LOG_THRESHOLD=Debug
$ /path/to/unity/Unity
在 Mac 上:
$ export UNITY_APIUPDATER_LOG_THRESHOLD=Debug
$ /path/to/unity/Unity
注意:还可以使用版本控制来查看 API 更新程序对项目脚本所做的更改。
AssemblyUpdater 完成后,Editor.log 会显示更改。例如:
[AssemblyUpdater] Property access to 'UnityEngine.Rigidbody
UnityEngine.GameObject::get_rigidbody()' in 'System.Void
Test.ClassReferencingObsoleteUnityAPIThroughEditorAssembly::Run()' replaced with 'T
UnityEngine.GameObject::GetComponent<UnityEngine.Rigidbody>()'.
下表描述了 UNITY_APIUPDATER_LOG_THRESHOLD 环境变量的值:
| 日志阈值 | 描述 |
|---|---|
| Error(默认值) | AssemblyUpdater 仅记录__错误__消息。当 AssemblyUpdater 未能应用特定更新时,将记录错误消息,这种情况下需要您采取纠正措施(通常要求原始程序集作者提供程序集的更新版本)。 |
| Warning | API 更新程序会记录__警告__和__错误__消息。API 更新程序应用用户可能需要检查的更改时,会记录警告消息。 |
| Info | AssemblyUpdater 仅记录__信息、警告__和__错误__消息。信息消息包括 AssemblyUpdater 应用的更新。 |
| Debug | API 更新查程序记录所有消息。这对于故障排除很有用,例如,如果 API 更新程序出现要向 Unity 报告的问题。 |
API 更新程序无法更新所有过时的代码。如果更新程序无法保存其更改,例如用户对脚本具有只读权限,则会发生这种情况。
通过按照指示检查控制台中的前几行,应该能够看到更新过程中出现的问题。
2018–07–31
“accept-apiupdate” command line option added in Unity 2017.2
AssemblyUpdater logging improved in Unity 2018.3 NewIn20183