场景切换系统
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、流程系统完全解耦
该设计避免了历史版本中过度封装导致的复杂时序与稳定性问题,适合作为框架长期维护的稳定基石。