【Unity】场景管理/切换:SceneManager、GetScene、LoadScene、MoveGameObjectToScene等

SceneManager

SceneManager,顾名思义就是场景管理器,包含多个与场景管理相关的函数,将这些函数结合使用将能实现多种场景切换方式,并提高游戏性能。

 

LoadScene + GetSceneByBuildIndex + LoadSceneMode

首先是 LoadScene() 函数的常用形式:

需要注意的是,在大多数情况下,为了避免在加载时出现暂停或性能问题,应该使用该函数的异步版本:LoadSceneAsync() 

使用 LoadScene() 时,加载不会立即发生,它会在下一帧中完成。这种半异步行为可能导致帧断续,并且可能会造成混乱。

GetSceneByBuildIndex() 的作用也是顾名思义了,获取 Build Settings 中场景的下标。

【Unity】场景管理/切换:SceneManager、GetScene、LoadScene、MoveGameObjectToScene等_第1张图片

场景是先加载,后激活的,LoadSceneMode(加载模式)有两种:

使用Single模式,关闭已经加载的所有场景(不是卸载,卸载是另一个函数 —— UnloadSceneAsync()),只加载一个新场景,新场景被添加到SceneManager的目录中。

使用Additive模式,其他已加载场景仍保持激活状态,同时加载一个新场景。

 

SetActiveScene + GetActiveScene

SetActiveScene() 激活已加载的场景,如果场景未加载,返回false。

GetActiveScene() 获取已激活的场景。

 

CreateScene + MergeScenes

CreateScene() 运行时创建一个新场景。

MergeScenes() 将源场景的内容合并到目标场景中,并删除源场景。 源场景根目录下的所有游戏对象都将移动到目标场景的根目录。需要注意的是,该函数具有破坏性 —— 合并完成后,源场景将被销毁。

 

MoveGameObjectToScene

将GameObject从其当前场景移动到新场景。

只能将根游戏对象从一个场景移动到另一个场景。 这意味着要移动的GameObject不能是其场景中任何其他GameObject的子对象。 这仅适用于将GameObjects移动到已加载的场景(LoadSceneMode.Additive)。 如果要加载单个场景,请确保在要移动到新场景的GameObject上使用DontDestroyOnLoad,否则Unity会在加载新场景时删除它。

 

UnloadSceneAsync

销毁与给定场景关联的所有GameObject,并从SceneManager中移除场景。

给定的场景名称可以是完整的场景路径,“构建设置”窗口中显示的路径,也可以是场景名称。 如果仅给出场景名称,则将卸载匹配列表中的第一个场景。 如果您有多个具有相同名称但路径不同的场景,则应使用完整的场景路径。

需要注意:

1. 不区分大小写,并且由于它是异步的,因此无法保证完成时间。
2. 资产目前尚未卸载。 为了释放资产内存,可以调用 Resources.UnloadUnusedAssets() 
3. 如果没有要加载的场景,则无法使用 UnloadSceneAsync() 。 例如,只有单个场景的项目无法使用此函数。

你可能感兴趣的:(Unity,Note)