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 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君3 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子3 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
心前阳光4 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光4 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯4 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案4 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔4 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
玉夏4 天前
【Shader基础】UV 与纹理采样 Part1
unity·着色器·uv
zdr尽职尽责4 天前
Unity录像功能
学习·ui·unity·游戏引擎