AssetBundle(简称AB包)打包方式:
[@MenuItem("AB/Build AB")]
public static void BuildAB()
{
BuildPipeline.BuildAssetBundles(Application.dataPath, BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.StandaloneWindows64);
}
AssetBundle的三种压缩方式:
- LZMA(一种序列化流文件):U3D默认压缩格式,使用前需解压,高压缩比但是需要时间
- LZ4:压缩比一般但是解压时间快,Option是ChunckBasedCompression
- 不压缩:速度最快,Option是UncompressdAssetBundle(自己的compress)
通俗理解依赖: 当一个AB包package1里面的资源引用了其他AB包package2里面的资源时,我们称package1依赖于package2,也就是说没有package2的话,package1会出错。
为什么要理解依赖:
- 平时使用AB包开发时,如果一个包依赖于其他包,则必须先把依赖包先加载后才能正常加载这个包里面的资源,如果依赖关系混乱,很容易导致材质丢失等现象。
- 如果多个AB包packageX都引用了一个未打包AB的资源UnPackage,那么packageX包都会保留一份UnPackage资源的备份,这样就导致了资源的冗余。
测试案例:
- AB包引用未打包资源和引用已打包资源的对比:
- 多个引用未打包资源和引用打包资源的对比:
Unity判断是否产生副本的逻辑:
foreach(包名)
{
//-----对所有包进行遍历-----
name:packageNameAB
foreach(packageNameAB下所有资源的路径assetPath)
{
checkNonBundleNameDpendencies:
//-----对包下所有资源进行遍历-----
foreach(assetPath对应的资源所依赖的资源路径dependencyPath)
{
//-----对依赖路径下所有的依赖对象进行判断-----
if(依赖路径下资源没有设置打包AB)
{
copy一份该资源入当前packageNameAB
goto checkNonBundleNameDpendencies 再对这一个资源进行相同的遍历处理
}
}
}
}
结论: 总得来说,只要是AB包里面的资源直接引用了(判断是否直接引用可以通过用文本方式打开资源查看里面是否有引用资源的GUID)未打包资源,那么就会在本包内添加一个副本,而如果这个引用的资源是打了AB包的,那么就不存在这个问题。