运行时模块
SuperCore 的通用运行能力由 Module 提供。Module 按 Cfg_Module.asset 的优先级串行初始化、按同一顺序更新,并在框架退出时反向清理。
模块列表
| Module | 适合解决的问题 | 关键入口 |
|---|---|---|
| ResModule | 加载资源/场景,准备和更新 YooAsset Package。 | ResModule.Get()、UtilFunc.Load |
| DebugModule | Player 内日志、设备信息、GM 和自定义调试页。 | DebugModule.Get() |
| EventModule | 全局帧式事件和局部立即事件。 | Subscribe、Fire |
| HotUpdateModule | 启动热更资源组、启动 UI、多语言和 HybridCLR。 | 通常由启动流程自动驱动 |
| TimerModule | 一次性和重复计时。 | Once、Repeat |
| UpdateModule | 可暂停、缩放、分层的 Update 树。 | CreateNode、Register |
| TableModule | 二进制配置表、分区和生命周期组。 | LoadGroup、GetTable |
| LocalizationModule | 多语言文本、表组、切换语言和运行时字体。 | UtilFunc.Loc、SetLanguage |
| AudioModule | 音乐、音效、UI、语音和环境声。 | PlayMusic、PlaySfx |
| UIModule | 窗口、分组、队列、动画、Widget 和循环视图。 | ShowUI、HideUI |
| EntityModule | 资源驱动实体、对象池、Agent、Part 和 FSM。 | SpawnEntity、PreLoad |
| ProcedureModule | 流程切换、GameSystem 作用域和依赖调度。 | Switch<T>、GameSystem.Get<T> |
获取 Module
csharp
ResModule res = ResModule.Get();
if (res == null)
return;Get() 在 Module 不可用时记录错误并返回 null。这通常表示 Module 未启用、优先级/调用时机错误或框架已清理;调用方应停止当前操作,不把缺失 Module 当作正常可选状态。
高频入口可以使用 UtilFunc,例如资源加载、UI、音频和实体。短入口不会改变对应 Module 的所有权和失败语义。
异步初始化
Module 初始化可以跨帧:
csharp
public sealed class ProfileModule : Module<ProfileModule>
{
private AssetHandle m_ConfigHandle;
protected override void OnInit()
{
ResModule res = ResModule.Get();
if (res == null)
return;
m_ConfigHandle = res.LoadAsync<TextAsset>("Cfg_Profile", config =>
{
if (config == null)
return;
CompleteInit();
});
}
protected override void OnClear()
{
if (m_ConfigHandle.IsValid)
m_ConfigHandle.Release();
m_ConfigHandle = default;
}
}必需资源失败时不要调用 CompleteInit()。框架不会跳过失败 Module 后继续伪造完整启动。
Module 还是 GameSystem
优先使用 GameSystem 的情况:
- 只在菜单、战斗或某个玩法流程中存在。
- 持有流程场景、玩法 Package、战斗表组或临时 UI。
- 需要通过依赖图等待其他业务系统 Ready。
- 离开流程时应一次性卸载。
只有跨流程通用、生命周期等同框架的能力才适合 Module。详细关系见 框架架构。
