UH1L3——AB包依赖

本章代码关键字

1
2
AssetBundleManifest                            //主包的依赖文件
assetBundleManifest.GetAllDependencies() //传入包名,得到该包依赖的所有的包名

AB包依赖

当某个资源使用了另外一个AB包内的资源,则可以说该资源对那个AB包存在依赖

假设我们创建了一个红色材质球,让modelAB包中的Cube使用它,而不将这个材质球打包进AB包中
则下次进行AB包打包时,该材质球将被默认的打包到modelAB包内

image

而如果将这个红色材质球打入到其他AB包诸如head内,而只加载model包,在加载Cube将会导致Cube的材质丢失
因为model内并不存在Cube的材质

image

可见,一个资源身上用到了别的AB包中的资源
如果只加载这时自己的AB包,通过它创建对象,将会出现资源丢失的情况
这种时候需要把依赖包一起加载了才能正常

1
2
3
4
5
6
7
//加载AB包
AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//加载AB包中的资源
GameObject obj = assetBundle.LoadAsset<GameObject>("Cube");
//obj = assetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;
Instantiate(obj);
AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "head");

使用主包获取依赖信息

当一个游戏项目很大时,很难理清楚哪些AB包依赖着哪些包,因此很少会手动将某个资源所有的依赖包一起加载出来
这时我们需要利用主包获取依赖信息

首先将主包,也就是和存储AB包的目录名一样的包加载出来
然后将主包的AssetBundleManifest​文件加载出来,AssetBundleManifest​文件的名字就是固定的"AssetBundleManifest"
然后将调用assetBundleManifest.GetAllDependencies​方法,传入包名,得到其所有的依赖的包名
通过这些包名加载即可加载所有的依赖包

1
2
3
4
5
6
7
8
9
10
11
//加载主包
AssetBundle abMain = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "PC");
//加载主包中的固定文件
AssetBundleManifest assetBundleManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//从固定文件中,得到依赖信息
string[] strs = assetBundleManifest.GetAllDependencies("model");
//得到依赖包的名字,将它们全部加载出来
for (int i = 0; i < strs.Length; i++)
{
AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + strs[i]);
}

缺点:假设包A依赖包B,包C,包D,而资源a只依赖包B,即使只需要加载资源a仍然会把包C与包D加载出来