补充知识
关键文件说明
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)}");
// 更新catalog
var 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);
}