当前位置: 首页 > news >正文

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 文件。

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)}");// 更新catalogvar 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);
}

相关文章:

  • 从 Cluely 融资看“AI 协同开发”认证:软件考试应该怎么升级?
  • PaddleOCR + Flask 构建 Web OCR 服务实战
  • 论文笔记:Large language model augmented narrative driven recommendations
  • es向量检索里的efSearchc参数是干嘛用的
  • 装配体镜像阵列与爆炸视图-装配体设计技能(2)
  • Hologres的Table Group和Shard简介
  • 秘塔AI搜索:国产无广告智能搜索引擎,重塑高效信息获取体验
  • c# .netCreateLinkedTokenSource链接令牌,取消信号异步执行
  • 使用模板创建uniapp提示未关联uniCloud问题
  • 考研408《计算机组成原理》复习笔记,第三章(1)——存储系统概念
  • leetcode:面试题 08.06. 汉诺塔问题
  • Linux->进程概念(精讲)
  • Golang 中接口嵌套的详细说明和使用示例
  • K8s入门指南:架构解析浓缩版与服务间调用实战演示
  • GetX 实现 MVVM 架构, 高效 路由管理 和 状态管理
  • Maven生命周期,测试
  • Oracle导入导出 exp命令和imp命令 expdp命令和impdp命令 19c导出兼容11g版本的dmp然后使用11g导入dmp
  • 算法-动态规划-钢条切割问题
  • Python商务数据分析——Python 入门基础知识学习笔记
  • 零基础学习Redis(14) -- Spring中使用Redis
  • 带数据库的网站怎么建/免费推广的方式有哪些
  • 网站建设技术服务费怎么入账/软文广告经典案例800字
  • 没有网站备案可以做诚信认证嘛/百度搜索什么关键词能搜到网站
  • 深圳做网站的大公司/企业培训系统
  • 网站建设 浏览器兼容/网站搜什么关键词好
  • wordpress图片无法居中/标题seo是什么意思