默认情况下,场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您可以放置环境、障碍物和装饰,本质上是在对游戏进行分块设计和构建。 更多信息
参见 术语表重新加载已启用。这意味着当您进入播放模式时,Unity 会销毁所有现有的场景游戏对象Unity 场景中的基本对象,可以代表角色、道具、场景、相机、航点等。游戏对象的功能由附加在其上的组件定义。 更多信息
参见 术语表并从磁盘重新加载场景。Unity 执行此操作所需的时间会随着场景复杂度的增加而增加,这意味着随着项目变得越来越复杂,您必须在按下“播放”按钮后等待更长的时间才能使场景在编辑器中完全加载。
当您禁用场景重新加载时,此过程将花费更少的时间。这使您能够更快速地迭代项目的开发。Unity 不会从磁盘重新加载场景,而是只重置场景中已修改的内容。这避免了卸载和重新加载场景的时间和性能影响。Unity 仍然会调用相同的初始化函数(例如OnEnable
、OnDisable
和OnDestroy
),就好像它是新加载的一样。
当您禁用场景重新加载时,在编辑器中启动应用程序所需的时间不再代表构建版本中的启动时间。因此,如果您想调试或分析在项目启动期间发生的具体情况,则应启用场景重新加载,以便更准确地表示构建版本应用程序中发生的实际加载时间和过程。
有关更多信息,请参阅如何配置播放模式。
要禁用场景重新加载
禁用场景重新加载对项目的副作用应该很小。但是,由于场景重新加载与域重新加载紧密相关,因此存在一些重要的差异
在播放模式下返回编辑模式时,未序列化的 ScriptableObject 和 MonoBehaviour 字段会保留分配给它们的值。这是因为 Unity 不会重新创建现有对象或调用构造函数。要了解在不同上下文中什么是序列化和什么不是序列化,请参阅Unity 如何使用序列化。注意私有字段不会作为常规构建管道的部分进行序列化,但会作为编辑器脚本热重新加载的一部分进行序列化。这就是为什么您在播放模式下修改的私有字段在退出播放模式时可能会重置为原始值,即使在进入播放模式时禁用场景和域重新加载的原因。
Unity 在域重新加载期间将数组/列表类型的空私有和内部字段转换为空数组/列表对象,并且它们在运行时(非编辑器)脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以任何您喜欢的方式响应用户输入。 更多信息
参见 术语表保持非空。
使用ExecuteInEditMode
或ExecuteAlways
的脚本不会接收OnDestroy
或Awake
调用。Unity 不会调用 Awake,并且仅在EditorApplication.isPlaying
已经是真值的情况下,才会在播放模式更改时调用 OnEnable,其中 Awake/OnEnable 方法会检查EditorApplication.isPlaying
属性。运行时(非编辑器)脚本的非序列化字段不应该是一个问题,因为这些字段在编辑模式下不处于活动状态,但是标记为ExecuteInEditMode
或ExecuteAlways
的脚本可能会改变自身或触及其他运行时脚本的字段。为了解决这个问题,请在 OnEnable 回调中自行初始化任何受影响的字段。