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()
說明
啟動修復流程:**清除本地的補丁快取資料與配置檔(清空下載目錄)**後,重新執行完整的補丁流程,可用於修復損毀或不完整的本地資源。
重要 修復會刪除已下載的本地資源,執行後需重新下載全部更新內容。