目录
AB包基础知识与操作
1.AB包理论基础
AB包是AssetBundle的缩写,是Unity提供的资源压缩包,用于存储各种资源,比如模型、贴图、预制体等(不包括C#脚本)
2.AB包相较于Resources的优势:
2.1资源管理更加灵活
使用AB包进行资源管理,资源可分布在多个AB包中,按需加载,减少运行时内存压力,且其存储路径可自定义(如可读写路径);而使用Resources进行资源管理,所有资源必须集中存放在Resources
目录下,打包后资源只读且无法动态更新。
2.2支持多样压缩格式
AB包:
- 持多种压缩方式:
- LZMA:高压缩率,适合网络传输,但解压需全包加载。
- LZ4:按需解压,内存占用低,推荐高频使用场景。
- 初始包体更小,非核心资源可后期动态加载
Resources:
资源统一压缩为二进制,无法灵活选择压缩方式。
2.3支持热更新
AB包:
支持动态更新,可将新资源上传至服务器,运行时下载并加载。
Resources:
打包后资源不可修改,无法实现热更新。
3.AB包资源打包
3.1给资源设置对应的AB包
以材质为例
3.2打包
切换到打包工具Build页签。
主要设置参数:
BuildTarget:选择需要打包到的平台。
OutputPath:目标输出路径。
Clear Folders:每次打包是否清空文件夹重新打包。
Copy to StreamingAssets:如其名,是否拷贝到StreamingAssets文件夹下。
Compression为选择打包方式,可选择"不进行压缩"(解压快,内存占用高)、“LZMA压缩”(高压缩率,但解压需全包加载,解压慢)、“LZ4压缩”(按需解压,内存占用低,推荐高频使用场景)三种方式。
点击Build按钮进行打包。
打包后,可以在与Asset同级目录下找到输出路径对应的文件夹。
PC为主包,其中记载了AB包之间的依赖关系。
没有后缀的为资源文件。
.manifest后缀的为对应资源文件的配置信息文件。
4.AB包资源加载
这里以上述material举例,从AB包中加载得到Material替换场景上Cube的默认材质。
4.1AB包同步加载:
先加载资源所在AB包,再加载AB包中的资源,这里推荐使用指定类型的资源加载(不同类型之间可能重名导致冲突),再将场景上的Cube更改材质
注意:这里我打包时勾选了Copy to StreamingAssets,所以我可以直接在该文件夹下找到AB包。
运行结果:
4.2AB包异步加载:
也是先加载AB包再加载资源,这里借助协程搭配AB包异步加载API来实现上述同样效果。
运行结果:
AB包被加载后,其中所有资源都可以被加载出来,也就是说,假设我们“material”包中有多个资源,我们可以只加载一次该包,通过该包获取其中所有资源。
注意:同一个AB包不能被重复加载,否则会报错。
5.AB包卸载
5.1卸载所有AB包资源
参数为true时,卸载会把AB包加载出来的资源也一起卸载。
示例:
当我点击鼠标左键时,Cube上替换的材质也会被卸载。
5.2卸载单个AB包
对于每个AB包,其都可以通过Unload的API自行卸载。
其后面bool参数跟上述同理。
6.AB包之间的依赖关系
6.1依赖关系
上面我们谈到了AB包的加载,AB包的加载与其依赖关系往往是密不可分的。
假设我们打包了一个Cube预制体到cube包中,该Cube使用到了上述material包的"Material"材质,那么现在我们只加载Cube包,将其中的Cube资源加载并创建出来,会不会出现什么问题呢?
我们写段代码来测试一下
结果:
可以看到其材质资源发生了丢失。
这是因为我们没有加载material包,而cube包中的cube材质是依赖与material包中相关资源的。
解决方案:
1.将相关资源都打包到一个包中
2.将其所依赖的包也一起加载出来
这里我们以第二种解决方案为例,进行演示。
将material包也一起加载出来
可以看到丢失材质得以解决。
那么如果出现一个AB包依赖于几十个甚至上百个其他AB包,难道我们都要手动去加载相关AB包么?
6.2借助主包获取依赖信息
根据主包的abManifest文件(这里主包指我们上述的PC包)可以获得每一个AB包的依赖关系。
步骤:加载主包->加载主包的abManifest文件->根据文件得到指定AB包的依赖信息->加载依赖的所有包
简单示例:
注意:通过主包得到的是包与包之间的依赖关系,无法精准得到资源与资源之间的依赖关系。