AssetBundle-Unity资源管理的核心技术_unity addressable和assetbundle
在我刚接触AssetBundle的时候,总是搞不明白AssetBundle到底是什么,AssetBundleBrowser跟他的关系是怎样的,而Addressables又是什么玩意。所以这里先讲明白他们之间的关系,以及他们到底是什么。
一、AssetBundle Browser和AssetBundle的关系
AssetBundle本质是是一个压缩文件,包含序列化的资源及其依赖关系,用于动态加载游戏资源,是Unity资源管理的核心技术
而AssetBundle Browser是Unity官方提供的一个可视化工具,用于创建、管理和调试AssetBundle
前者是操作后者的界面,后者是实际的数据载体
AssetBundle 的核心作用
- 资源动态加载:无需在安装时包含所有资源,可按需下载
- 减少初始安装包体积:将非必要资源外置
- 资源共享:多个场景或项目可共享同一 AssetBundle
- 优化内存:可卸载不再使用的资源包
AssetBundle Browser 的核心功能
- 可视化界面:直观查看 AssetBundle 的内容和依赖关系
- 批量创建:通过拖放快速将资源分组到不同的 AssetBundle
- 依赖分析:显示资源间的引用关系,帮助优化包大小
- 构建与测试:直接在编辑器中构建并测试 AssetBundle 的加载
- 内容预览:无需运行游戏即可查看 AssetBundle 中的资源
二、Unity Addressables 是什么
Addressables 是 Unity 官方推出的高级资源管理系统,用于简化 AssetBundle,提供更直观的资源寻址、加载和生命周期管理。通过抽象底层实现细节,让开发者专注于资源管理逻辑
核心概念
1. 可寻址资源(Addressable Assets)
- 无需硬编码路径:通过自定义名称(Address)而非文件路径加载资源,无需手动管理路径和依赖关系
- 动态映射:Address 与实际资源的映射关系可在运行时动态调整
2. 组(Groups)
- 逻辑分组:将相关资源组织到同一组,便于管理和加载
- 构建模板:每个组可配置不同的打包策略
3. 加载操作(Operations)
- 异步加载:所有加载操作均为异步,避免游戏卡顿
- 自动引用计数:自动管理资源的生命周期,无需手动卸载
4. 配置文件(Addressables Settings)
- 中央管理:集中配置资源分组、加载位置、远程更新等策略
三、AssetBundle工作流程
1. 创建 AssetBundle
-
标记资源:在 Inspector 窗口中为资源设置 AssetBundle 名称
-
编写构建脚本:使用
BuildPipeline.BuildAssetBundles
API 生成 AssetBundle 文件 -
构建输出:生成的文件通常包括:
- 主 AssetBundle 文件(如
xxx
) - 对应的
.manifest
文件(包含依赖信息) - 主清单文件(如
AssetBundles.manifest
)
- 主 AssetBundle 文件(如
2. 加载 AssetBundle
-
从文件系统加载:
AssetBundle bundle = AssetBundle.LoadFromFile(\"Assets/AssetBundles/xxx\");
-
从网络加载:
using var request = UnityWebRequestAssetBundle.GetAssetBundle(\"https://xxx.com/\");await request.SendWebRequest();AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
3. 加载资源
GameObject prefab = bundle.LoadAsset<GameObject>(\"xxxPrefab\");Instantiate(prefab);
4. 卸载资源
// 卸载单个资源(仅释放未实例化的资源)bundle.Unload(false);// 卸载所有资源(包括已实例化的)bundle.Unload(true);
四、注意事项
1. 依赖管理
- 自动分析依赖:Unity 会自动分析资源间的依赖关系,例如:
- 如果
xxxPrefab
引用了xxxMaterial
,则两者会被正确打包
- 如果
- 手动控制依赖:通过
AssetDatabase.GetDependencies
API 获取并管理依赖
2. 压缩选项
-
LZMA 压缩:
- 压缩率高,但加载时需完全解压,适合下载但不适合频繁加载
-
LZ4 压缩(推荐):
- 压缩率较低,但支持部分解压,加载速度很快,适合频繁加载的资源,是Unity的主推
BuildAssetBundleOptions.ChunkBasedCompression
-
不压缩:
- 加载最快,但文件体积最大,适合需要立即加载的关键资源
3. 命名规范
- 避免路径分隔符:AssetBundle 名称中不要使用
/
或\\
(Unity 会自动处理路径) - 使用小写:部分平台(如 iOS)对文件名大小写敏感