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 文件并加载。
  • 可以按需下载,减少初始包体大小。

文件之间的关系

  1. .hash → 告诉客户端是否需要更新。
  2. .json → 告诉客户端资源在哪里、如何加载。
  3. .bundle → 实际存储资源数据。

这些文件共同构成了 Addressables 的 资源管理机制 ,使得 热更新(Hot Update)按需加载 成为可能。

检测更新流程

1、初始化 Addressables 系统

2、检查内容更新状态

3、获取需要下载的大小

4、执行资源下载

5、完成更新

细节流程

  1. 客户端启动,检查 catalog.hash 是否与服务器一致。
  2. 如果不一致,下载新的 catalog.json
  3. 对比新旧 catalog.json,找出需要更新的 .bundle 文件。
  4. 下载新增或修改的 .bundle 文件。
cs 复制代码
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);
}
相关推荐
一只一只1 天前
Unity之协程
unity·游戏引擎·协程·coroutine·startcoroutine
NIKITAshao2 天前
Unity 跨项目稳定迁移资源
unity·游戏引擎
sindyra2 天前
Unity资源内存管理与释放
unity·游戏引擎·资源管理·资源释放·内存释放
CreasyChan2 天前
Unity FairyGUI高斯模糊实现方法
unity·游戏引擎·fgui
avi91112 天前
Unity半官方的AssetBundleBrowser插件说明+修复+Reporter插件
unity·游戏引擎·打包·assetbundle·游戏资源
郝学胜-神的一滴2 天前
深入理解Mipmap:原理、实现与应用
c++·程序人生·unity·游戏程序·图形渲染·unreal engine
nnsix2 天前
Unity PicoVR开发 实时预览Unity场景 在Pico设备中(串流)
unity·游戏引擎
一只一只2 天前
Unity之UGUI Button按钮组件详细使用教程
unity·游戏引擎·ugui·button·ugui button
WarPigs3 天前
Unity阴影
unity·游戏引擎
一只一只3 天前
Unity之Invoke
unity·游戏引擎·invoke