ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Unity笔记:Asset资源管理--Addressables 可寻址资源系统详解

Unity笔记:Asset资源管理--Addressables 可寻址资源系统详解 1. 引言在 Unity 项目开发中资源管理始终是一个绕不开的核心话题。从最初的Resources文件夹到后来的AssetBundle再到如今官方主推的 Addressables资源管理方案一直在演进。本文将结合实战笔记深入讲解 Unity 官方新一代资源管理框架——Addressable Asset System可寻址资源系统简称 Addressables 或 AA帮助你理解它的核心思想、工作原理以及在不同平台上的落地实践。2. 什么是 AddressablesAddressables 是 Unity 官方在 2018 年推出、2019 年正式发布的新一代资源管理框架。它的底层打包和加载仍然是 AssetBundle只是在 AB 之上封装了一层「地址映射 依赖管理 引用计数 下载缓存」的框架。你可以这样理解Addressables 高级版的 AssetBundle 管理框架它的核心思想是用「地址」替代「路径」。2.1 传统资源加载的痛点传统资源加载方式存在明显的弊端逻辑标识和物理位置强绑定// 方式一Resources 加载// 资源必须在 Resources 文件夹里路径不能改Resources.Load(UI/Icon/sword);// 方式二AssetBundle 加载// 你得自己记住这个资源在哪个 AB 包里、依赖关系谁来管AssetBundle.LoadFromFile(xxx.ab);2.2 Addressables 的本质改变Addressables 给每个资源分配一个唯一的字符串地址Address比如ui_icon_sword_01你只管调用Addressables.LoadAssetAsync(ui_icon_sword_01);至于这个资源到底在哪儿——是本地内置的、是 StreamingAssets 里的、还是 CDN 服务器上的——你完全不用管Addressables 自动帮你搞定。3. Addressables 的核心能力能力说明依赖自动管理加载一个 Prefab 时它依赖的材质、贴图、Shader 会自动全部加载好全部就绪才返回引用计数自动管理加载一次计数 1释放一次计数 -1归零自动卸载资源不会重复加载也不会误卸载内容打包自动化AB 包的命名、依赖拆分、资源映射全部自动处理不用写打包脚本本地/远程透明切换同一份资源开发时本地加载上线后改个配置就变成 CDN 远程加载代码不用动热更新内置支持Catalog 目录文件对比 Hash自动检测资源更新增量下载变更的 BundleProfiler 内存分析官方工具直接看哪些资源占内存、有没有泄漏4. 为「远程资源加载」而生的 AddressablesAddressables 的资源组Group有两种加载模式模式资源位置需不需要 CDN典型用途Local本地打进安装包 / StreamingAssets不需要首屏核心资源、基础框架Remote远程放在 HTTP/CDN 服务器上必须配置 CDN 地址大部分游戏资源、可热更资源配置 CDN 地址就是告诉 Addressables远程资源从哪儿下载。没有 CDN 地址Addressables 就不知道远程资源去哪里下载远程组的资源全部加载失败。CDN 小知识CDN 全称 Content Delivery Network内容分发网络是一套遍布全国甚至全球的边缘服务器分布式网络核心作用是让用户从「离自己最近的服务器」下载资源而不是从源站取。微信小游戏注意微信小游戏平台要求所有远程资源的域名必须提前在微信公众平台配置「request 合法域名」且必须是 HTTPS 协议。CDN 服务商提供的域名完全满足这个要求直接配置即可使用。4.1 Profile 配置字段在 Addressables 的 Profile 配置中有两个关键字段RemoteBuildPath构建时远程资源输出到本地的哪个目录比如ServerData/WebGL/RemoteLoadPath运行时从哪个 URL 加载远程资源比如https://your-cdn.com/wechat_minigame/构建完成后你需要把RemoteBuildPath目录下的所有.bundle文件、catalog.json、.hash文件完整上传到 CDN 服务器对应的目录下。4.2 运行时加载流程运行时Addressables 的加载流程是这样的启动游戏加载 Catalog资源目录请求资源 ui_icon_sword查 Catalog → 资源在 ui_icons_assets.bundle哈希 abc123拼接 URLRemoteLoadPath ui_icons_assets_abc123.bundle发起 HTTP 请求 → 下载 → 缓存到本地 → 加载资源返回给调用方5. Addressables 的核心使用场景——「最小首包 大量远程 CDN 资源」平台要不要配 CDN原因刚需程度微信小游戏必须配首包 4MB、总包 30MB 的硬性限制大部分资源只能放 CDN 远程加载⭐⭐⭐⭐⭐ 极高抖音/快手小游戏必须配同样有首包/总包限制各平台规则不同但都很小⭐⭐⭐⭐⭐ 极高WebGL/H5基本必须配浏览器环境没有本地安装包概念资源都靠网络下载⭐⭐⭐⭐ 高Android原生强烈推荐APK/AAB 虽然可以打几个 GB但包太大影响转化率热更新也需要 CDN⭐⭐⭐ 中高iOS原生强烈推荐App Store 审核周期长资源热更可以绕过审核快速修 bug、上活动⭐⭐⭐ 中高PC/Steam可选包体限制没那么严但热更新、DLC 分发仍然可以用⭐⭐ 中6. 不同平台的配置差异虽然所有平台都用 Addressables CDN但配置上有一些区别差异点微信小游戏Android/iOS 原生首包大小极端受限4MB相对宽松可以几十~几百 MB远程资源比例90% 的资源都走远程30%~70% 走远程看项目策略CDN 域名白名单必须在微信后台配置合法域名否则请求被拦截没有平台级限制任意 HTTP/HTTPS 地址都行本地缓存机制用微信小游戏的文件存储有配额可能被清理用 Unity 自带的缓存系统Application.persistentDataPath压缩方式LZ4 微信分包自带 gzip/br 压缩LZ4 / LZMA 任选Catalog 放置建议放远程方便不发版更新资源可以本地一份 远程一份灵活控制Provider 适配需要替换为 WXAssetBundleProvider 以节省内存默认的 AssetBundleProvider 就行7. Provider 适配7.1 什么是 ProviderProvider 是 Addressables/YooAsset 这类资源管理框架里的「资源加载底层提供者」它的职责是定义「资源从哪里来、怎么读、怎么加载成引擎可用的 AssetBundle」。原生 Unity 默认的 Provider 是AssetBundleProvider它的逻辑是从本地文件路径读取 AB 包 → 直接加载从 HTTP 地址下载 AB 包 → 下载到内存 → 加载但这套逻辑在微信小游戏平台上完全不适用所以你需要替换成平台专属的 Provider这个替换和改造的过程就叫Provider 适配。7.2 为什么微信小游戏必须做 Provider 适配微信小游戏的 WebGL 环境有几个原生 Unity 默认 Provider 处理不了的硬限制内存压力极大默认 Provider 把 AB 包整个下载到内存里再加载一个几十 MB 的 AB 包直接吃掉几十 MB 内存iOS 低端机直接 OOM 闪退文件系统特殊小游戏只有USER_DATA_PATH这一个合法持久化目录原生的持久化路径在 WebGL 环境下不存在缓存规则特殊微信小游戏有自己的 LRU 缓存清理机制默认 Provider 不认识这套规则缓存会失效XHR 下载限制小游戏的网络请求必须走微信封装的 XHR 接口原生 UnityWebRequest 在某些场景下有兼容性问题7.3 微信小游戏专属的 WXAssetBundleProvider微信官方专门提供了WXAssetBundleProvider来替换默认的AssetBundleProvider这是小游戏适配最核心的一步它不会把 AB 包完整下载到内存而是边下载边写入小游戏的USER_DATA_PATH文件系统下载完成后直接从文件路径加载 AB内存占用直接从「AB 包完整大小」降到几 KB 的缓冲级别iOS 端内存压力骤减完全适配微信小游戏的文件缓存规则自动利用平台内置的 LRU 缓存机制下载过的资源下次直接读本地文件不用重复请求自动处理微信小游戏的域名白名单、下载回调、错误重试等平台专属逻辑7.4 适配的具体操作步骤下载微信官方提供的WXAssetBundleProvider.cs脚本放到项目的 Runtime 目录下在 Addressables 的资源组设置里把默认的 Provider 类型替换成自定义的WXAssetBundleProvider给项目添加Unity.ResourceManager程序集引用解决依赖报错重新构建 Addressables 资源包再导出微信小游戏工程7.5 YooAsset 场景下的 Provider 适配如果你用的是 YooAsset 框架适配逻辑完全一致替换默认的「文件下载器」和「文件加载器」为微信小游戏专属实现下载资源时走微信小游戏的wx.downloadFile接口加载 AB 时从USER_DATA_PATH读取自动适配小游戏的缓存配额管理避免资源被系统意外清理8. 总结Addressables 作为 Unity 官方的新一代资源管理框架通过「地址映射 依赖管理 引用计数 下载缓存」的封装极大地简化了资源管理复杂度。尤其在微信小游戏、WebGL 等对包体有严格限制的平台Addressables CDN 的「最小首包 大量远程资源」方案几乎是必选之路。而 Provider 适配则是打通平台差异的关键一环值得每一位 Unity 开发者深入掌握。
返回列表