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);
}
相关推荐
寂寞的船10 小时前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
寂寞的船1 天前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无2 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气3 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船4 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
寂寞的船6 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船7 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船7 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水7 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
寂寞的船7 天前
【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优
unity·性能优化·编辑器