Skip to content

HotUpdateModule 热更新

HotUpdateModule 负责启动阶段的 HotUpdate 资源组更新、启动更新界面、启动多语言以及 HybridCLR 程序集加载。它不是业务随时调用的下载器,而是 Module 初始化链中的一道强制启动关卡:只有整个资源组准备完成、代码加载成功后,后续 Table、Localization、UI、Entity 和 Procedure 等 Module 才会继续初始化。

子功能

用途

  • 从 Builtin 资源组加载 HotUpdateCfg、启动多语言和更新界面。
  • 准备并检查完整 HotUpdate Package 组。
  • 汇总所有待更新 Package 的总文件数和总字节数,只向玩家确认一次。
  • 顺序下载并激活整个资源组。
  • 在 Player 中加载 HybridCLR AOT 补充元数据和热更程序集。
  • 热更新主流程结束后,在后台更新 Builtin 资源组,供下次启动使用。

使用方式

正常项目不需要手动启动 HotUpdateModule。在 Cfg_Module.asset 中启用并设置正确优先级后,SuperCore 会自动调用它的初始化流程。

如果需要查看当前启动热更新资源组,可以读取只读集合:

csharp
HotUpdateModule module = HotUpdateModule.Get();
if (module == null)
    return;

foreach (ResourcePackageHandle package in module.HotUpdatePackages)
{
    Log.Info($"{package.PackageName}: {package.State}, {package.ActiveVersion}");
}

业务不应对 HotUpdatePackages 中的 Handle 调用 BeginDeactivateDeactivateClearCache。这些 Package 是启动常驻资源,由 HotUpdateModule 持有到框架退出。

设计思路

HotUpdateModule 的核心原则是“资源组一致性高于单包完成”:

  • Builtin 提供能够启动更新流程的最小闭环。
  • Core 与业务启动 Package 作为同一个 HotUpdate 组更新,避免跨包版本组合不可控。
  • 底层 ResourcePackageHandle 只报告操作结果;用户确认、重试、回退和失败界面由 HotUpdateModule 编排。
  • 后续 Module 串在 CompleteInit() 之后,天然避免表格、UI 或业务代码在资源版本未确定时开始加载。
  • HybridCLR 与资源清单属于同一启动事务,资源组未完全 Active 时不会加载新代码。

注意事项与限制

  • HotUpdatePackageNames 不能为空、不能重复,也不能与 Builtin 组包含同名 Package。
  • 列表顺序同时决定准备、检查、下载和激活顺序。
  • UI、启动多语言、Cfg_HotUpdateCfg_Localization 必须能从 Builtin 全局 Address 加载。
  • 有更新时玩家必须显式确认;是否显示取消/使用本地按钮由整组回退条件决定。
  • HotUpdatePackages 是只读观察入口,不是玩法生命周期 API。
  • HybridCLR 资源新增或程序集依赖变化后,要同步生成、收集、构建和发布对应 Package;只改 Address 数组不会产生字节资源。
  • WebGL Player 当前不支持这套 Host 热更新闭环,只支持 Offline 资源模式。
  • Module 初始化失败会停住后续链,这是有意的错误边界;不要在失败时调用 CompleteInit() 伪装成功。

SuperCore 使用 MIT License 开源