> 技术文档 > AssetBundle-Unity资源管理的核心技术_unity addressable和assetbundle

AssetBundle-Unity资源管理的核心技术_unity addressable和assetbundle

在我刚接触AssetBundle的时候,总是搞不明白AssetBundle到底是什么,AssetBundleBrowser跟他的关系是怎样的,而Addressables又是什么玩意。所以这里先讲明白他们之间的关系,以及他们到底是什么。

一、AssetBundle Browser和AssetBundle的关系

AssetBundle本质是是一个压缩文件,包含序列化的资源及其依赖关系,用于动态加载游戏资源,是Unity资源管理的核心技术
而AssetBundle Browser是Unity官方提供的一个可视化工具,用于创建、管理和调试AssetBundle
前者是操作后者的界面,后者是实际的数据载体

AssetBundle 的核心作用

  1. 资源动态加载:无需在安装时包含所有资源,可按需下载
  2. 减少初始安装包体积:将非必要资源外置
  3. 资源共享:多个场景或项目可共享同一 AssetBundle
  4. 优化内存:可卸载不再使用的资源包

AssetBundle Browser 的核心功能

  1. 可视化界面:直观查看 AssetBundle 的内容和依赖关系
  2. 批量创建:通过拖放快速将资源分组到不同的 AssetBundle
  3. 依赖分析:显示资源间的引用关系,帮助优化包大小
  4. 构建与测试:直接在编辑器中构建并测试 AssetBundle 的加载
  5. 内容预览:无需运行游戏即可查看 AssetBundle 中的资源

二、Unity Addressables 是什么

Addressables 是 Unity 官方推出的高级资源管理系统,用于简化 AssetBundle,提供更直观的资源寻址、加载和生命周期管理。通过抽象底层实现细节,让开发者专注于资源管理逻辑

核心概念

1. 可寻址资源(Addressable Assets)
  • 无需硬编码路径:通过自定义名称(Address)而非文件路径加载资源,无需手动管理路径和依赖关系
  • 动态映射:Address 与实际资源的映射关系可在运行时动态调整
2. 组(Groups)
  • 逻辑分组:将相关资源组织到同一组,便于管理和加载
  • 构建模板:每个组可配置不同的打包策略
3. 加载操作(Operations)
  • 异步加载:所有加载操作均为异步,避免游戏卡顿
  • 自动引用计数:自动管理资源的生命周期,无需手动卸载
4. 配置文件(Addressables Settings)
  • 中央管理:集中配置资源分组、加载位置、远程更新等策略

三、AssetBundle工作流程

1. 创建 AssetBundle

  1. 标记资源:在 Inspector 窗口中为资源设置 AssetBundle 名称

  2. 编写构建脚本:使用BuildPipeline.BuildAssetBundles API 生成 AssetBundle 文件

  3. 构建输出:生成的文件通常包括:

    • 主 AssetBundle 文件(如xxx
    • 对应的.manifest文件(包含依赖信息)
    • 主清单文件(如AssetBundles.manifest

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)对文件名大小写敏感