1. 引言
在 Unity 项目开发中,资源管理始终是一个绕不开的核心话题。从最初的Resources文件夹,到后来的AssetBundle,再到如今官方主推的 Addressables,资源管理方案一直在演进。本文将结合实战笔记,深入讲解 Unity 官方新一代资源管理框架——Addressable Asset System(可寻址资源系统,简称 Addressables 或 AA),帮助你理解它的核心思想、工作原理以及在不同平台上的落地实践。
2. 什么是 Addressables
Addressables 是 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,自动检测资源更新,增量下载变更的 Bundle |
| Profiler 内存分析 | 官方工具直接看哪些资源占内存、有没有泄漏 |
4. 为「远程资源加载」而生的 Addressables
Addressables 的资源组(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 的加载流程是这样的:
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 什么是 Provider
Provider 是 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 开发者深入掌握。