Unity Addressable使用之检测更新流程
补充知识
关键文件说明
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);
}