默认情况下启用场景重新加载。这意味着,进入播放模式时,Unity 会销毁所有现有的场景游戏对象并从磁盘重新加载场景。Unity 执行此操作所需的时间随场景复杂性而增加,这意味着随着项目日益复杂,在按下 Play 按钮到场景完全载入编辑器之间必须等待更长的时间。
禁用场景重新加载后,该过程将花费的时间更少。这使您可以更快地迭代项目的开发。Unity 不会从磁盘重新加载场景,而是仅重置场景的已修改内容。这样可避免卸载和重新加载场景所造成的时间和性能影响。Unity 仍然会调用相同的初始化函数(例如 OnEnable、OnDisable 和 OnDestroy),就像刚加载时一样。
在禁用场景重新加载时,在编辑器中启动应用程序所花费的时间不再表示在所构建版本中的启动时间。因此,如果想对项目启动期间发生的情况进行准确调试或性能分析,应当启用场景重新加载以便更准确地表示所构建应用程序版本中的真实加载时间和过程。
有关更多信息,请参阅如何配置播放模式。
要禁用场景重新加载:
禁用场景重新加载应该对项目产生最小的副作用。然而,因为场景重新加载与域重新加载紧密相连,所以有一些重要区别:
未序列化的 ScriptableObject 和 MonoBehaviour 字段在返回到编辑模式时会保留播放模式下分配给它们的值。这是因为 Unity 不会重新创建现有对象或调用构造函数。要了解在不同情况下,什么是序列化和什么不是未序列化,请参阅 Unity 如何使用序列化。注意,私有字段不会作为常规构建管线的一部分序列化,而是在编辑器的脚本热重载时被序列化。这就是为什么在播放模式下修改的私有字段可能会在退出播放模式时重置为其原始值的原因,即使进入播放模式时的场景和域重新加载被禁用也是如此。
Unity 在域重新加载期间将数组/列表类型的 null 私有和内部字段转换为空数组/列表对象,对于运行时(非编辑器)脚本,它们保持非 null。
使用 ExecuteInEditMode 的脚本或 ExecuteAlways 脚本不会接收 OnDestroy 或 Awake 调用。Unity 不会调用 Awake,仅在播放模式更改时 EditorApplication.isPlaying 已设置为 true 的情况下,才使用检查 EditorApplication.isPlaying 属性的 Awake/OnEnable 方法调用 OnEnable。运行时(非编辑器)脚本的非序列化字段应该不是问题,因为这些字段在编辑模式下不处于活动状态,但是标记为 ExecuteInEditMode 或 ExecuteAlways 的脚本可能会更改自身或接触其他运行时脚本的字段。要解决此问题,请在 OnEnable 回调中自行初始化所有受影响的字段。