场景切换系统

ScenesManager 是 Fink Framework 内置的极简场景管理模块,用于统一触发场景切换并规范切换前后的生命周期行为。

当前版本仅提供最小、可靠的能力集合,避免过度封装与隐藏时序问题。

模块职责仅包含:

  • 同步切换场景
  • 异步切换场景(返回 Unity 官方 AsyncOperation)
  • 场景切换前统一清理
  • 场景切换生命周期事件(Before)

路径:Runtime/Scene/ScenesManager.cs


1. 设计目标

ScenesManager 的设计目标是:

  • 回归 Unity 官方 SceneManager 行为
  • 明确区分“开始切换”与“加载完成”的职责边界
  • 避免自定义进度、状态机与多重封装带来的不确定性
  • 为上层系统(UI / Loading / 流程控制)提供稳定、可预测的触发点

ScenesManager 不负责

  • 加载进度计算
  • 加载完成判断
  • 场景激活控制
  • 并发切换防护
  • 参数传递
  • UI 驱动逻辑

2. 同步切换场景

同步切换使用 Unity 的 SceneManager.LoadScene,适用于:

  • 编辑器工具
  • 轻量场景
  • 启动 / 菜单场景

2.1 通过场景名加载

ScenesManager.Instance.LoadScene("GameScene", () =>
{
    Debug.Log("Scene Loaded");
});

2.2 通过场景 ID 加载

ScenesManager.Instance.LoadScene(1, () =>
{
    Debug.Log("Scene Loaded");
});

同步切换调用前触发 OnBeforeSceneLoad,自动执行场景切换前清理。


3. 异步切换场景(推荐方式)

异步切换直接返回 Unity 官方的 AsyncOperation,不做任何额外封装。

3.1 通过场景名加载

AsyncOperation op = ScenesManager.Instance.LoadSceneAsync("GameScene");

3.2 通过场景 ID 加载

AsyncOperation op = ScenesManager.Instance.LoadSceneAsync(1);

行为说明

  • 调用时仅表示开始加载
  • ScenesManager 不监听进度、不判断完成
  • 是否加载完成应由调用方自行判断:
if (op.isDone)
{
    // 场景加载完成
}

4. 场景生命周期事件

ScenesManager 提供最小化的生命周期事件,用于插入场景切换前后的公共逻辑。

ScenesManager.Instance.OnBeforeSceneLoad += () =>
{
    Debug.Log("Before Scene Load");
};

ScenesManager.Instance.OnAfterSceneLoad += () =>
{
    Debug.Log("After Scene Load");
};

事件语义说明:

OnBeforeSceneLoad : 场景切换发起前(仍处于旧场景)


5. 场景切换前清理

每次切换场景前,ScenesManager 会自动执行统一清理流程:

PoolManager.Instance.CleanPool();
UIManager.Instance.ClearAllPanels();
ResManager.Instance.ClearDic();

#if !UNITY_EDITOR
System.GC.Collect();
#endif

若启用了音频模块,还会额外清理音频模块的缓存。

清理目标:

  • 防止旧场景对象残留
  • 清空对象池状态
  • 移除所有 UI 面板
  • 释放资源缓存
  • 降低跨场景内存与状态污染风险

该清理流程无需手动调用,所有切换接口已自动集成。


7. 总结

当前版本的 ScenesManager 是一个职责极度清晰的基础模块:

  • 只负责触发场景切换
  • 只提供必要的生命周期事件
  • 不引入额外状态与隐藏逻辑
  • 与 UI、Loading、流程系统完全解耦

该设计避免了历史版本中过度封装导致的复杂时序与稳定性问题,适合作为框架长期维护的稳定基石。