禁用 Domain Reload 和 Scene Reload 的详细信息
禁用 Domain Reload 和 Scene Reload 时,Unity 会跳过什么
从较高的角度看,进入播放模式包括以下主要阶段:
-
备份当前场景 (Backup current scenes)。这仅会在场景被修改后发生。这样当退出播放模式时,Unity 会将场景恢复为播放模式开始前的状态。
-
重新加载域 (Domain Reload)。通过重新加载脚本域来重置脚本状态。
-
重新加载场景 (Scene Reload)。通过重新加载场景重置场景状态。
-
更新场景 (Update Scene)。这会发生两次;一次没有渲染,一次有渲染。
Domain Reload 和 Scene Reload 的组合任务会重置脚本域并模拟应用程序在播放器中运行时的启动行为。如果在 Project Settings 中禁用这些步骤,Unity 会跳过这些步骤。
下图提供了有关禁用 Domain Reload 和 Scene Reload 时 Unity 跳过的确切事件的详细信息。蓝色表示禁用 Domain Reload 时 Unity 跳过的事件,绿色表示禁用 Scene Reload 时 Unity 跳过的事件。
当 Scene Reloading 和 Domain Reloading 都启用时 Unity 执行什么
启用 Scene Reloading 和 Domain Reloading 后,以下是 Unity 进入播放模式时执行的所有进程和事件的完整列表:
- 引发 AssemblyReloadEvent
beforeAssemblyReload事件。
- C# 域停止:
a. 为所有 ScriptableObject 和 MonoBehaviour 调用 OnDisable()。
b.b. Unity 等待所有异步操作完成。
- 所有 MonoBehaviour 和 ScriptableObject 的状态都将被序列化。
a. 调用 OnBeforeSerialize()。
b.所有公共字段和私有字段的值都会被序列化,标有 [NonSerialized] 的值除外。
- 托管的包装器与原生 Unity 对象断开连接。
- 重新加载 Unity 子域:
a.卸载 Mono 域:
i.引发 AppDomain.DomainUnload 事件。
ii.销毁 Unity 子域
1.调用 GC 和终结器。
2.终止线程。
3.删除所有 JIT 信息。
b.创建新的 Unity 子域。
- 加载程序集:
a.加载系统程序集。
b.加载 Unity 程序集。
c.加载用户程序集。
- 初始化同步上下文。
- 恢复脚本状态。
a.重新创建所有 Unity 对象的可编程部分。
i.调用构造函数,并为统计信息分配默认值。
b.反序列化所有 Unity 对象的状态:
i.恢复所有 Unity 对象的序列化状态。
1.引发 OnAfterDeserialize 事件。
ii. 调用 OnValidate()。
iii.对于使用 [ExecuteInEditMode] 属性的脚本:
1. 调用 OnEnable()。
2. 调用 OnDisable()。
3. 调用 OnDestroy()。
- 调用具有 InitializeOnLoad 和 InitializeOnLoadMethod 的方法。
- 调用 AssemblyReloadEvent
afterAssemblyReload。
其他资源