场景切换模块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);
    // ……
    });
    }