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);
}
相关推荐
小贺儿开发4 小时前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com5 小时前
Unity UniText笔记
unity·unitext
鼎艺创新科技17 小时前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui36120 小时前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎
五仁烧饼20 小时前
Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略
unity·游戏引擎
新手unity自用笔记1 天前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
心前阳光1 天前
Unity之XR Interaction Toolkit | IPointerDownHandler问题
unity·游戏引擎·xr
帅_shuai_2 天前
unity 静态字段内存查找工具
unity·游戏引擎
鹿野素材屋3 天前
Unity超轻量级中文语音播报,仅5兆大小,无需联网即可使用,适用于弹幕、提示等动态语音播出
unity·游戏引擎
玖玥拾4 天前
Unity3D RPG 入门项目(八)游戏设置面板、帧率控制、快捷技能药品栏、技能解锁系统
游戏·3d·unity·游戏引擎