Skip to content

运行时模块

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

模块列表

Module适合解决的问题关键入口
ResModule加载资源/场景,准备和更新 YooAsset Package。ResModule.Get()UtilFunc.Load
DebugModulePlayer 内日志、设备信息、GM 和自定义调试页。DebugModule.Get()
EventModule全局帧式事件和局部立即事件。SubscribeFire
HotUpdateModule启动热更资源组、启动 UI、多语言和 HybridCLR。通常由启动流程自动驱动
TimerModule一次性和重复计时。OnceRepeat
UpdateModule可暂停、缩放、分层的 Update 树。CreateNodeRegister
TableModule二进制配置表、分区和生命周期组。LoadGroupGetTable
LocalizationModule多语言文本、表组、切换语言和运行时字体。UtilFunc.LocSetLanguage
AudioModule音乐、音效、UI、语音和环境声。PlayMusicPlaySfx
UIModule窗口、分组、队列、动画、Widget 和循环视图。ShowUIHideUI
EntityModule资源驱动实体、对象池、Agent、Part 和 FSM。SpawnEntityPreLoad
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 开源