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);
}
相关推荐
伽蓝_游戏3 小时前
UGUI源码剖析(15):Slider的运行时逻辑与编辑器实现
游戏·ui·unity·性能优化·c#·游戏引擎·.net
lrh302511 小时前
Custom SRP - Complex Maps
unity·srp·render pipeline
m0_4972141514 小时前
unity中通过拖拽,自定义scroll view中子物体顺序
unity·游戏引擎
地狱为王17 小时前
在Unity中实现DTLN-AEC处理音频文件的功能
unity·aec·降噪
SmalBox1 天前
【URP】Shader绘制棋盘格对比内置管线
unity·渲染
EQ-雪梨蛋花汤2 天前
【Unity笔记】Unity 编辑器扩展:打造一个可切换 Config.assets 的顶部菜单插件
unity·编辑器·游戏引擎
SmalBox2 天前
【URP】UnityHLSL顶点片元语义详解
unity·渲染
在路上看风景2 天前
9. Mono项目与Unity的关系
unity
在路上看风景3 天前
1.12 Memory Profiler Package - Summary
unity
SmalBox3 天前
【URP】Unity Shader Tags
unity·渲染