AssetPatcher
Coding Style wiki
AssetPatcher 是 AssetLoader 模块的更新补丁统一入口(Facade),底层由 YooAsset 驱动,涵盖补丁流程控制(检查、修复、暂停、恢复、取消)、Package 生命周期管理(初始化、更新、卸载、默认 Package 切换)、下载器创建与多 Package 合并下载,以及版本、状态与路径查询。
| 命名空间 | OxGFrame.AssetLoader |
| 类型 | public static class |
| 源码 | AssetPatcher.cs |
using OxGFrame.AssetLoader;
using OxGFrame.AssetLoader.Bundle; // PackageInfoWithBuild、BundleConfig.PlayMode 等类型
注意 使用前须在启动场景中创建 PatchLauncher(负责设置 PlayMode、Preset Packages 与下载选项),相关设置请参考 AssetLoader 介绍。
快速上手
// 启动补丁检查流程(版本对比 → 清单更新 → 创建主下载器 → 下载)
AssetPatcher.Check();
// 等待补丁流程完成后,即可开始加载资源
while (!AssetPatcher.IsDone())
await UniTask.Yield();
// 初始化 DLC Package 并更新版本与清单
bool success = await AssetPatcher.InitDlcPackage(new DlcPackageInfoWithBuild()
{
packageName = "Dlc01Package",
dlcVersion = "v1.0"
}, updatePackage: true);
// 切换默认 Package(AssetLoaders 未指定 packageName 时使用)
AssetPatcher.SwitchDefaultPackage("Dlc01Package");
// 查询当前资源版本
string patchVersion = AssetPatcher.GetPatchVersion();
通用规则
Package 概念
OxGFrame 以 Package 为资源管理单位(对应 YooAsset 的 ResourcePackage):
| 类型 | 说明 |
|---|---|
| App Package | 主要资源包,远端路径跟随主程序版本号(App Version)。 |
| DLC Package | 扩展资源包,具有独立版本号路径(dlcVersion),可按需动态初始化与卸载。 |
- Preset Packages:在
PatchLauncherInspector 配置的默认 Package 列表(App 与 DLC),启动时(Awake)自动初始化,并合并纳入补丁流程的主下载;列表中首个 App Package 会被设为默认 Package。 - 默认 Package:AssetLoaders 各加载方法未指定
packageName时,一律使用默认 Package(可通过 SetDefaultPackage/SwitchDefaultPackage 变更)。 - Package 信息基类
PackageInfoWithBuild字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| buildMode | BundleConfig.BuildMode | 构建管线(仅 EditorSimulateMode 使用):ScriptableBuildPipeline/BuiltinBuildPipeline/RawFileBuildPipeline。 |
| packageName | string | Package 名称。 |
| hostServer | string | 自定义资源服务器 URL(空值时依配置自动组合)。 |
| fallbackHostServer | string | 自定义备用资源服务器 URL(空值时依配置自动组合)。 |
| initializeParameters | InitializeParameters | YooAsset 初始化参数(CustomMode 使用)。 |
AppPackageInfoWithBuild 直接继承上表;DlcPackageInfoWithBuild 额外增加:
| 字段 | 类型 | 说明 |
|---|---|---|
| withoutPlatform | bool | DLC 远端路径是否略过平台层级。 默认值: false |
| dlcVersion | string | DLC 版本。空值时自动使用最新(依日期)版本。 |
PlayMode 运行模式
由 PatchLauncher 设置的 BundleConfig.PlayMode 决定资源系统的运行方式:
| 值 | 说明 |
|---|---|
EditorSimulateMode | 编辑器模拟模式:无需实际构建 AssetBundle,在编辑器中模拟运行。 |
OfflineMode | 离线模式:仅使用内置(StreamingAssets)资源,不进行远端更新。 |
HostMode | 主机模式:连接资源服务器进行版本检查、清单更新与下载。 |
WeakHostMode | 弱联网主机模式:同 HostMode,但断网时可改用上次记录的本地版本继续运行(本地资源需完整)。 |
WebGLMode | WebGL 模式:仅使用 Web 平台内置资源(WebGL 平台限定)。 |
WebGLRemoteMode | WebGL 远程模式:内置资源搭配远端资源服务器(WebGL 平台限定)。 |
CustomMode | 自定义模式:自行提供 YooAsset InitializeParameters;Preset Packages 需通过 SetPresetPackages 手动配置。 |
提醒 打包后可通过 Scripting Define Symbols(OXGFRAME_OFFLINE_MODE、OXGFRAME_HOST_MODE、OXGFRAME_WEAK_HOST_MODE、OXGFRAME_WEBGL_MODE、OXGFRAME_WEBGL_REMOTE_MODE、OXGFRAME_CUSTOM_MODE)强制覆盖 PlayMode。
YooAsset 版本兼容性
自 v3.7.0 起,同时支持 YooAsset 2.x(验证 2.3.18~2.3.19)与 YooAsset 3.x(验证 3.0.3-beta~3.0.5,建议 3.0.5+):
- 依安装的
com.tuyoogame.yooasset包版本,自动定义YOOASSET_2(2.x)或YOOASSET_3(3.x),无需手动设置宏。 - 公开 API 签名在两个版本下完全一致,项目代码无需修改,版本差异由框架内部分支处理。
- 自定义解密实现接口的
IDecryptInitialize.CheckIsIntialized()已更名为CheckIsInitialized()(仅影响自定义 解密实现)。
| 项目 | YooAsset 2.x | YooAsset 3.x |
|---|---|---|
| 初始化与文件系统 | 传统 InitializeParameters | v3 原生 Options API 与新版文件系统(内部处理) |
BundleConfig 的 BuildMode.ArchiveFileBuildPipeline | 不支持 | 支持(含 EditorSimulateMode 归档包模拟) |
| 内置 8 种加解密服务 | 支持 | 支持(实现 v3 拆分式解密接口;Editor 端另实现 IBundleEncryptor / IManifestEncryptor) |
下载失败回调 onDownloadError 类型 | DownloaderOperation.DownloadError | 同签名别名 Action<DownloadErrorEventArgs>(用法不变) |
| 原生文件(RawFile)加载 | RawFileHandle | RawFileObject / EnsureBundleFileAsync(行为一致) |
补丁流程与主下载器
- Check/Repair 会启动内部状态机驱动的补丁流程(版本对比 → 清单更新 → 创建下载器 → 下载 → 完成),流程各阶段通过
PatchEvents发送事件,供 UI 显示进度与交互。 - Pause/Resume/Cancel 仅作用于补丁流程创建的主下载器;通过 GetPackageDownloader 等方法自行创建的下载器不受影响。
- 流程完成后 IsDone 返回
true,即可开始通过 AssetLoaders 加载资源。
DownloadInfo 结构
public struct DownloadInfo
GetDownloadInfoWithCombinePackages 系列方法的返回类型,用于预先统计待下载内容:
| 字段 | 类型 | 说明 |
|---|---|---|
| totalCount | int | 待下载的文件总数。 |
| totalBytes | ulong | 待下载的总字节数。 |
补丁状态查询
查询补丁与资源系统的当前状态。
方法总览
| 方法 | 说明 |
|---|---|
| IsInitialized | 资源系统(Preset Packages)是否已完成初始化。 |
| IsReleased | 资源系统是否已释放(调用过 Release)。 |
| IsCheck | 是否正在执行补丁检查流程。 |
| IsRepair | 是否正在执行修复流程。 |
| IsDone | 补丁流程是否已全部完成。 |
IsInitialized
public static bool IsInitialized()
返回值
bool — Preset Packages 是否已全部初始化完成。
说明
判断资源系统是否已完成初始化(PatchLauncher 启动时的 Preset Packages 初始化,或手动调用 InitSetupPresetPackages 成功后为 true)。
IsReleased
public static bool IsReleased()
返回值
bool — 是否已调用过 Release 释放资源系统。
说明
判断资源系统(YooAsset)是否已释放。释放后 AssetLoaders 的 Bundle 卸载相关操作将被跳过。
IsCheck
public static bool IsCheck()
返回值
bool — 是否正在执行补丁检查流程。
说明
判断是否正在执行 Check 启动的补丁检查流程(流程完成或取消后为 false)。
IsRepair
public static bool IsRepair()
返回值
bool — 是否正在执行修复流程。
说明
判断是否正在执行 Repair 启动的修复流程。
IsDone
public static bool IsDone()
返回值
bool — 补丁流程是否已全部完成。
说明
判断补丁流程是否已完成且可开始加载资源。启动 Check/Repair 时会重置为 false,流程结束后为 true。
示例
AssetPatcher.Check();
while (!AssetPatcher.IsDone())
await UniTask.Yield();
// 补丁完成,开始加载资源
补丁流程操作
控制补丁流程与主下载器的行为。
方法总览
流程启动
| 方法 | 说明 |
|---|---|
| SetPresetPackages | 在运行时自定义 Preset App/DLC Packages(CustomMode 用)。 |
| InitSetupPresetPackages | 手动初始化 Preset Packages。 |
| Check | 启动补丁检查流程。 |
| Repair | 启动修复流程(清除本地缓存后重新下载)。 |
主下载器控制
| 方法 | 说明 |
|---|---|
| Pause | 暂停主下载器。 |
| Resume | 恢复主下载器。 |
| Cancel | 取消主下载器的下载。 |
SetPresetPackages
public static void SetPresetPackages(List<AppPackageInfoWithBuild> appPackages, List<DlcPackageInfoWithBuild> dlcPackages)
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| appPackages | List<AppPackageInfoWithBuild> | Preset App Packages 列表(首个为默认 Package)。 |
| dlcPackages | List<DlcPackageInfoWithBuild> | Preset DLC Packages 列表。 |
说明
在运行时自定义 Preset Packages 配置( 覆盖 PatchLauncher 的列表设置)。
提醒 在 PatchLauncher 尚未唤醒(Awake)前调用时,将改写入 BundleConfig 并输出警告,不会抛出异常。
注意 主要供 CustomMode 使用——CustomMode 下 PatchLauncher Inspector 的 Preset 列表不生效,须以此方法手动配置,再调用 InitSetupPresetPackages 初始化。
示例
AssetPatcher.SetPresetPackages(
new List<AppPackageInfoWithBuild>()
{
new AppPackageInfoWithBuild() { packageName = "DefaultPackage" }
},
new List<DlcPackageInfoWithBuild>());
await AssetPatcher.InitSetupPresetPackages();
InitSetupPresetPackages
public static async UniTask InitSetupPresetPackages()
返回值
UniTask — 可等待的异步操作。
说明
初始化并设置所有 Preset Packages(App 与 DLC),完成后将列表首个 App Package 设为默认 Package,并更新 IsInitialized 状态。
提醒 一般情况下 PatchLauncher 在 Awake 会自动执行;仅在 CustomMode 或关闭 initializePresetPackages 选项时需手动调用。
Check
public static void Check()
说明
启动补丁检查流程:进行主程序版本对比、Package 版本与资源清单更新、创建主下载器并下载更新内容,流程各阶段通过 PatchEvents 发送事件。
注意 若补丁检查或修复流程正在执行中,重复调用将被忽略(输出警告日志)。
示例
// 启动补丁流程
AssetPatcher.Check();
// 以轮询(或订阅 PatchEvents 事件)等待完成
while (!AssetPatcher.IsDone())
await UniTask.Yield();
Repair
public static void Repair()
说明
启动修复流程:**清除本地的补丁缓存数据与配置文件(清空下载目录)**后,重新执行完整的补丁流程,可用于修复损坏或不完整的本地资源。
重要 修复会删除已下载的本地资源,执行后需重新下载全部更新内容。
Pause
public static void Pause()
说明
暂停补丁流程主下载器的所有下载任务。未执行补丁流程(主下载器不存在)时调用无效果。
Resume
public static void Resume()
说明
恢复补丁流程主下载器的所有下载任务。
Cancel
public static void Cancel()
说明
取消主下载器的下载任务,发送下载取消事件(PatchEvents.PatchDownloadCanceled),并结束 Check/Repair 状态。