補充知識
關鍵文件說明
Addressable打包后會生成多種文件,主要包括?.hash
、.json
?和?.bundle
?文件,它們各自有不同的作用。
.hash
文件(哈希文件)
作用:
- 用于 版本對比,檢查資源是否有更新。
- 存儲的是 資源目錄(Catalog)的哈希值,客戶端在初始化時對比本地和遠程的
.hash
文件,判斷是否需要更新資源。
特點:
- 文件很小,只包含一個哈希字符串(如
SHA-256
)。 - 每次構建 Addressables 時都會重新生成,確保唯一性。
- 用于 增量更新,避免重復下載未變化的資源。
.json
文件(資源目錄文件)
作用:
- 存儲 資源的元數據,包括:
-
- 所有可尋址資源的 Key(如 "Assets/Prefabs/Player.prefab")
- 資源的 依賴關系
- 資源所在的 AssetBundle 名稱
- 資源的 加載路徑(遠程 URL 或本地路徑)文件名示例:
特點:
- 是 Addressables 系統的 核心索引文件,客戶端必須先加載它才能正確加載資源。
- 如果遠程
.hash
不同,客戶端會下載新的.json
文件,并對比哪些資源需要更新。
.bundle
文件(AssetBundle 文件)
作用:
- 存儲 實際的資源數據(如 Prefab、Texture、Scene 等)。
- 每個
.bundle
文件可能包含 多個資源(取決于 Addressables 的打包策略)。
特點:
- 采用 Unity 的 AssetBundle 壓縮格式(LZMA/LZ4/Uncompressed)。
- 客戶端在加載資源時,會根據
.json
文件的索引找到對應的.bundle
文件并加載。 - 可以按需下載,減少初始包體大小。
文件之間的關系
.hash
→ 告訴客戶端是否需要更新。.json
→ 告訴客戶端資源在哪里、如何加載。.bundle
→ 實際存儲資源數據。
這些文件共同構成了 Addressables 的 資源管理機制,使得 熱更新(Hot Update) 和 按需加載 成為可能。
檢測更新流程
1、初始化 Addressables 系統
2、檢查內容更新狀態
3、獲取需要下載的大小
4、執行資源下載
5、完成更新
細節流程:
- 客戶端啟動,檢查
catalog.hash
是否與服務器一致。 - 如果不一致,下載新的
catalog.json
。 - 對比新舊
catalog.json
,找出需要更新的.bundle
文件。 - 下載新增或修改的
.bundle
文件。
void Start()
{keys = new List<object>();StartCoroutine(AAInit());
}IEnumerator AAInit()
{//第一步 Addressable模塊初始化var initialLogic = Addressables.InitializeAsync(false);yield return initialLogic;//第二步 檢查Catalog是否有更新var catalogLogic = Addressables.CheckForCatalogUpdates(false);yield return catalogLogic;if (catalogLogic.Status == AsyncOperationStatus.Succeeded){var catalogs = catalogLogic.Result;if(catalogs != null && catalogs.Count > 0){Debug.Log($"發現{catalogs.Count}個更新 更新內容:{string.Join("\n",catalogs)}");// 更新catalogvar updateHandle = Addressables.UpdateCatalogs(catalogs,false);yield return updateHandle;var locatorList = updateHandle.Result;//待下載列表foreach(var locator in locatorList){keys.Clear();keys.AddRange(locator.Keys);//獲取需要下載的內容大小var getDownLoadSize = Addressables.GetDownloadSizeAsync(keys);Debug.Log(getDownLoadSize.Result);if (getDownLoadSize.Result > 0){// 執行資源下載var downLoadData =Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, false);while (!downLoadData.IsDone){Debug.Log($"下載進度: {downLoadData.PercentComplete * 100}%");yield return null;}yield return downLoadData;if (downLoadData.Status == AsyncOperationStatus.Succeeded){Debug.Log("下載成功!");}else{Debug.Log("下載失敗!");}Addressables.Release(downLoadData);}}Addressables.Release(updateHandle);}else{Debug.Log("catalog沒有需要更新的數據!");}Debug.Log("檢測完成");}else{Debug.Log("檢測資源失敗.....");}//最后一步 釋放資源 Addressables.Release(initialLogic);//釋放操作句柄,避免內存泄漏Addressables.Release(catalogLogic);
}