Skip to content

运行时模块 ​

SuperCore 的通用运行能力由 Module 提供。Module 按 Cfg_Module.asset 的优先级串行初始化、按同一顺序更新,并在框架退出时反向清理。

模块列表 ​

Module适合解决的问题关键入口
ResModule加载资源/场景,准备和更新 YooAsset Package。ResModule.Get()、UtilFunc.Load
DebugModulePlayer 内日志、设备信息、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。详细关系见 框架架构。

SuperCore 使用 MIT License 开源