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 加载出来