Unity AssetBundle 完全手册:从入门到精通的资源管理圣经
📦 Unity AssetBundle 完全手册:从入门到精通的资源管理圣经
💡 AssetBundle 的价值:
- 如何实现游戏的热更新,避免每次更新都要重新审核?
- 资源加载太慢、内存占用过高,怎么优化?
- 依赖关系混乱、循环依赖、包体过大怎么办?
- 如何构建一个稳定高效的资源管理系统?
完全指南!从概念到实践,从打包到加载,从热更新到内存管理,一文搞懂 Unity AssetBundle!
一、AssetBundle 概念
1.1 什么是 AssetBundle
| 特性 | 说明 |
|---|---|
| 定义 | 一个存档文件,包含可在运行时加载的特定于平台的资源 |
| 包含内容 | 模型、纹理、预制件、音频剪辑甚至整个场景 |
| 依赖关系 | 可以表达彼此之间的依赖关系 |
| 压缩方式 | 目前一般采用 LZ4 压缩(ChunkBasedCompression) |
1.2 AssetBundle 内部结构
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
1.3 打包分类
| 类型 | 说明 | 用途 |
|---|---|---|
| 随包资源 | 跟随 APK/IPA 进行安装 | 基础资源,首次运行必需 |
| 增量包 | 上传到 CDN 服务器 | 热更新资源,按需下载 |
二、资源类型与依赖关系
2.1 各类资源打包策略
| 资源类型 | 打包策略 | 说明 |
|---|---|---|
| AnimationClip | 跟随 Prefab 或多个打包一个 AB | 动画片段,可单独或组合打包 |
| AudioClip | 跟随 Prefab 或多个打包一个 AB | 音频文件 |
| VideoClip | 建议随包安装或单独下载 | 文件较大,不建议 AB 方式 |
| Font | 一个 Font 单独打成一个 AB | UI 引用字体 |
| Mesh | 跟随 Prefab,作为子资源 | 网格数据 |
| Prefab | 一个 Prefab 一个 AB 包 | 最常见的打包单元 |
| Scene | 一个场景一个 AB 包 | 场景加载 |
| Shader | 所有 Shader 打成一个 AB | 初始化时加载预热 |
| Texture | 跟随 Prefab 或单独打包 | 图片资源 |
| SpriteAtlas | 一个图集一个 AB 包 | UI 图集打包 |
| Material | 一个 Material 一个 AB | 包含 Shader 与 Texture |
| FBX | 生成 Prefab 后打包 | 包含骨骼、蒙皮、图片等 |
| txt/json | 单独下载,不打进 AB | 文本配置文件 |
| zip | 单独下载 | 压缩文件 |
2.2 依赖关系查找
正向依赖查找(查找此对象依赖的资源)
1 | using UnityEditor; |
反向依赖查找(查找哪些资源依赖了此对象)
1 | using System; |
💡 重要提示:资源之间的依赖关系 ≠ AB 包之间的依赖关系。需要打出 AB 包后,根据
AssetBundleManifest来判断 AB 包之间的关系。
三、打包策略
3.1 推荐打包规则
在 Assets 文件夹下创建 BuildAssets 文件夹,按照以下规则进行打包:
1 | Assets/ |
3.2 文件类型映射
1 | public static readonly Dictionary<string, string[]> AllFileExtension = |
3.3 核心打包原则
| 原则 | 说明 |
|---|---|
| 最小颗粒度 | 每个资源一个 AB 包,不按文件夹打包 |
| 依赖单向 | BuildAssets 内资源依赖外部资源,而非互相依赖 |
| 重复检查 | 被依赖超过 5 次且大小超过 100KB 的资源应独立打包 |
| 依赖检查 | 每次打包后检查 AB 包依赖关系,避免循环依赖 |
3.4 打包代码
1 | using UnityEditor; |
四、热更新流程
4.1 版本对比流程
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
4.2 热更新代码示例
1 | using System.Collections; |
4.3 Lua 文件热更新
| 方案 | 适用场景 | 说明 |
|---|---|---|
| 整体打包 | Lua 文件不多 | 将所有 Lua 打成 zip,整体更新 |
| 增量更新 | 重度依赖 Lua | 与 AB 包更新逻辑一致 |
| AB 包方式 | 需要版本管理 | 将热更 Lua 文件打包成 AB |
五、AssetBundle 加载流程
5.1 内存层次结构
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
5.2 加载 AB 包
1 | using UnityEngine; |
⚠️ 重要规范:AB 加载方案应从磁盘加载,严禁从网络直接加载。
5.3 加载 AB 包内的资源
1 | using UnityEngine; |
六、内存管理
6.1 卸载 API 详解
| API | 作用范围 | 说明 |
|---|---|---|
AssetBundle.Unload(false) |
仅卸载镜像内存 | 保留已加载的资源 |
AssetBundle.Unload(true) |
卸载镜像+解压内存 | 同时卸载已加载的资源 |
Resources.UnloadAsset() |
卸载单个解压资源 | 卸载指定的资源对象 |
Resources.UnloadUnusedAssets() |
卸载未使用的解压资源 | 卸载所有未引用的资源 |
AssetBundle.UnloadAllAssetBundles(false) |
卸载所有镜像内存 | 保留已加载资源 |
AssetBundle.UnloadAllAssetBundles(true) |
卸载所有镜像+解压内存 | 完全清理 |
6.2 内存管理流程
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
6.3 内存管理最佳实践
1 | using UnityEngine; |
七、Prefab 实例化
7.1 Prefab 特性
| 特性 | 说明 |
|---|---|
| 文件类型 | Prefab 本质是文本文件,包含引用关系 |
| 类比 | Prefab 像类模板,实例化是创建对象 |
| 内存拷贝 | 实例化时会复制一份资源到 Hierarchy |
7.2 引用与复制
1 | using UnityEngine; |
7.3 内存存在形式
| 资源类型 | 内存份数 | 说明 |
|---|---|---|
| Prefab + 实例化 | 三份 | 磁盘压缩 → 镜像内存 → 实例化对象 |
| Shader/Texture | 两份 | 磁盘压缩 → 解压资源(实例化时引用) |
| Mesh/Material | 两份或三份 | 取决于使用 sharedMesh/Mesh 还是 sharedMaterial/Material |
八、工具推荐
| 工具 | 用途 | 链接 |
|---|---|---|
| AssetStudio | AB 包查看和分析 | https://github.com/Perfare/AssetStudio |
| AssetBundles-Browser | Unity 官方推荐工具 | Unity Package Manager |
九、总结
| 阶段 | 核心要点 |
|---|---|
| 概念 | AB 包含序列化文件和资源文件,支持依赖关系 |
| 依赖 | 正向依赖使用 AssetDatabase.GetDependencies() |
| 打包 | 按后缀分类,最小颗粒度,避免循环依赖 |
| 热更新 | 版本对比 → 下载差异 → MD5 校验 |
| 加载 | 从磁盘加载,严禁网络加载 |
| 内存 | 三层内存:磁盘 → 镜像 → 解压/实例化 |
| 卸载 | 先 Destroy 实例,再 UnloadAsset,最后 Unload AB |
💡 最佳实践:
- 建立统一的 AB 管理器,统一加载和卸载
- 定期检查 AB 包依赖关系,避免循环依赖
- 使用对象池减少频繁的加载卸载
- 大场景采用场景流加载策略
- 关键资源随包,非关键资源热更新
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1487842110@qq.com
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自新诸子
