场景切换模块SceneManager
场景切换模块SceneManager
背景
不同于常规资源加载,unity进行场景的切换,有多种切换方式,甚至多个场景可以共存,并且涉及到更多额外特殊操作。特别是在Single模式下,新的场景会替换当前正在运行的场景,成为活跃的场景。在Single模式下,场景切换的核心是,确保新场景加载完成前,旧场景感知不到场景的切换,在新的场景异步加载完成后,能够被正确激活并替换当前场景,以达到平滑切换场景的目的。
为此,在AssetManager中,场景加载部分被独立处理,将这一系列特殊操作进行封装,所以与其他资源的加载方式相区分。配合AssetManager使用,通过AssetManager实现场景的异步加载和卸载。同时,对已加载的场景进行缓存处理和统一管理。
卸载场景时,如果场景中有Dotween动画时,需要进行额外处理,避免内存泄漏。
使用
切换场景
scenePath按需 可以配合数据配表使用。
1 | yield return SceneManager.Instance.ChangeSceneAsync(scenePath); |
注意事项
- 如果不需要Dotween插件,请移除相关Dotween代码
1
2
3
4
5
6
7
8// using DG.Tweening; // 注释或移除DOTween插件引用
public IEnumerator ChangeSceneAsync(string scenePath)
{
// ……
// DOTween.KillAll(); // 注释或移除DOTween代码
// ……
}
内部实现
- 外部进行场景切换时,更关心的是场景是否加载或切换完毕,对场景实例SceneInstance其实并不关心,所以将 场景资源文件的加载 与 场景切换 的逻辑进行封装,外部等待协程执行完毕,场景也就加载好了。
1
2
3
4
5
6
7
8
9
10
11
12// 以single模式切换场景
public IEnumerator ChangeSceneAsync(string scenePath)
{
// 读取场景资源文件
yield return AssetManager.Instance.LoadSceneSync(scenePath, (sceneInstance) =>
{
// ……
// 激活加载的场景
UnityEngine.SceneManagement.SceneManager.SetActiveScene(sceneInstance.Scene);
// ……
});
}
评论