在Unity中,AssetBundle(资源包)是一种用于动态加载和管理资源的机制,其核心组成可分为以下部分:
1. 资源数据(Asset Data)
- 序列化资源:包含预制体(Prefab)、纹理(Texture)、材质(Material)、音频(AudioClip)等Unity资源的序列化数据。
- 场景文件:若包含场景(Scene),则存储场景的序列化信息。
- 数据以二进制格式存储,通过Unity引擎解析。
2. 资源索引表(Asset Index)
- 资源路径映射:记录包内每个资源的唯一标识(如GUID或路径名),例如:
"Assets/Textures/hero.png" → 二进制偏移地址
- 依赖关系:标记该资源包依赖的其他AssetBundle(如材质引用的贴图包)。
3. 头部信息(Header)
- 元数据:包含版本号、压缩算法标识(如LZMA/LZ4)、生成平台(如Windows/Android)。
- 数据段指针:指示资源数据块的起始位置和大小。
4. 压缩数据块(Compressed Data Block)
- 根据构建设置选择的压缩方式:
- LZMA:高压缩率,需整体解压。
- LZ4:分块压缩,支持按需加载。
- 未压缩:直接读取原始数据。
5. 清单文件(Manifest)
- 独立文件(扩展名为
.manifest
),与AssetBundle同名,包含:- 所有资源列表及其哈希值(用于版本校验)。
- 完整的依赖关系图,例如:
"character_bundle" 依赖 "texture_bundle" 和 "animation_bundle"
6. 资源包变体(Variant)
- 通过后缀名区分(如
ui_hd
和ui_sd
),允许同一资源不同分辨率/配置的版本共存。
示例结构
一个典型的AssetBundle文件(character_bundle.ab
)与其清单的关系:
AssetBundle文件:
[头部] → [索引表] → [LZ4压缩数据块]
关联清单文件 (character_bundle.ab.manifest):
Assets:
- "Assets/Prefabs/Hero.prefab" (哈希: 0x3A7F)
Dependencies:
- "textures_bundle.ab"
- "materials_bundle.ab"
关键特点
- 运行时动态加载:通过
AssetBundle.LoadAsset<T>(path)
按需读取资源。 - 依赖链解析:需先加载所有依赖包才能正确实例化资源。
- 内存管理:显式调用
AssetBundle.Unload(false)
释放资源,避免内存泄漏。
通过合理组织AssetBundle,开发者能实现资源热更新、减小安装包体积,并优化运行时内存使用。