| name | f8-features-hotupdatemanager-workflow |
| description | Use when implementing or troubleshooting HotUpdate feature workflows — version management, hot update, sub-package loading in F8Framework. |
HotUpdateManager Feature Workflow
⚠️ IMPORTANT: Before using this feature, you MUST formally initialize F8Framework in the launch sequence. Ensure ModuleCenter.Initialize(this); has run first, then create the required module, for example FF8.HotUpdate = ModuleCenter.CreateModule<HotUpdateManager>();.
Use this skill when
- The task is about hot update version management, resource patching, or sub-packages.
- The user asks about CDN deployment, version checking, or asset hot update flow.
Path resolution
- Prefer project source at Assets/F8Framework.
- For usage docs, read: Assets/F8Framework/Tests/HotUpdateManager/README.md
Sources of truth
- Runtime module: Assets/F8Framework/Runtime/HotUpdateManager
- Editor module: Assets/F8Framework/Editor/Build
- Test docs: Assets/F8Framework/Tests/HotUpdateManager
Key classes and interfaces
| Class | Role |
|---|
HotUpdateManager | Core module. Access via FF8.HotUpdate. |
GameConfig | Holds version info including LocalGameVersion. |
GameConfig.SetAssetRemoteBaseAddressGetter | Optional runtime CDN base URL provider. Appends Remote/platform. |
GameConfig.SetAssetRemoteFinalAddressGetter | Optional runtime final remote asset root provider. Does not append suffix. |
API quick reference
static string GetHotfixUrl()
{
#if TEST_VERSION
return "https://cdn-test.xxx.com/hotfix/";
#else
return "https://cdn-prod.xxx.com/hotfix/";
#endif
}
FF8.HotUpdate = ModuleCenter.CreateModule<HotUpdateManager>();
FF8.Asset = ModuleCenter.CreateModule<AssetManager>();
FF8.Download = ModuleCenter.CreateModule<DownloadManager>();
yield return AssetBundleManager.Instance.LoadAssetBundleManifest();
FF8.HotUpdate.InitLocalVersion();
GameConfig.SetAssetRemoteBaseAddressGetter(GetHotfixUrl);
yield return FF8.HotUpdate.InitRemoteVersion();
yield return FF8.HotUpdate.InitAssetVersion();
var (downloadInfos, allSize) = FF8.HotUpdate.CheckHotUpdate();
FF8.HotUpdate.StartHotUpdate(downloadInfos,
() => { LogF8.Log("Success"); },
() => { LogF8.Log("Failed"); },
(eventArgs) =>
{
long downloaded = eventArgs.TotalDownloadedLength;
double speed = eventArgs.DownloadInfo.DownloadedLength / eventArgs.DownloadInfo.DownloadTimeSpan.TotalSeconds;
LogF8.Log($"Progress: {downloaded/(1024.0*1024.0):F2}MB/{allSize/(1024.0*1024.0):F2}MB, Speed: {speed/(1024.0*1024.0):F2}MB/s");
});
var (packageDownloadTasks, packageAllSize) = FF8.HotUpdate.CheckPackageUpdate(GameConfig.LocalGameVersion.SubPackage);
FF8.HotUpdate.StartPackageUpdate(packageDownloadTasks,
() => { LogF8.Log("Success"); },
() => { LogF8.Log("Failed"); },
(eventArgs) => { });
Workflow
- Initialize modules in strict order: HotUpdate → Asset → Download → LoadManifest.
- Initialize local version. If the remote URL should be selected by code, call
GameConfig.SetAssetRemoteBaseAddressGetter(...) before remote version initialization.
- Initialize remote version, then asset version.
- Call
CheckHotUpdate() to get prepared download infos and the actual remaining download size.
- Show update dialog with size info to user.
- Call
StartHotUpdate() directly with the returned downloadInfos and success/failure/progress callbacks.
- Read overall downloaded bytes from
eventArgs.TotalDownloadedLength; eventArgs.DownloadInfo.DownloadedLength is only for the current file.
- For sub-packages (DLC), use
CheckPackageUpdate(GameConfig.LocalGameVersion.SubPackage) to prepare DownloadTaskInfo items and pass them directly to StartPackageUpdate().
Common error handling
| Error | Cause | Solution |
|---|
| Remote version check fails | CDN unreachable or remote URL provider not registered early enough | Check remote URL config in F5 build tool, or call GameConfig.SetAssetRemoteBaseAddressGetter(...) before InitRemoteVersion() |
| Module init order crash | Wrong initialization order | Must be HotUpdate → Asset → Download → Manifest |
| Sub-package not found | Package naming wrong | Use Package_ + identifier folder naming |
| Progress only shows current file | Read wrong field | Use eventArgs.TotalDownloadedLength for overall progress |
| Local sandbox stale files | Previous test data | Clear sandbox directory before testing |
Cross-module dependencies
- AssetManager: Hot update downloads and reloads asset bundles.
- Download: File download infrastructure.
Output checklist
- Module initialization order verified.
- Hot update flow configured with callbacks.
- CDN deployment path documented.
- Validation status and remaining risks.