在上一小节中,我们介绍了AB包的基本概念。在这里,我们将进一步探讨AB包的依赖关系以及加载过程。
首先,我们新建一个红色材质球,并将其赋值给Cube预制体。在不对材质球进行AB包分类的情况下,进行打包。运行脚本后,发现红色cube成功地从AB包中加载出来。尽管我们没有将cube所依赖的材质球进行打包分类,但是Unity在打包时会自动将包中的相关依赖打入包中。即使我们不对所依赖的资源进行打包设置,也可以正常使用。
然而,如果红色的材质球需要被其他AB包中的预制体所使用,每个AB包中都默认打入一个材质球显然会浪费AB包的空间。
为解决这一问题,我们可以将某个公共资源打入到具体的包中。在加载使用AB包中的资源时,将此AB包相关依赖的其他AB包也同时加载出来即可满足使用。换句话说,加载A资源时,会检查A资源依赖的其他资源包(可能是B、C),将ABC同样加载到内存中。这样在使用A的时候,不会造成资源丢失问题。
以下是相关加载脚本:
private void Awake()
{
//获取AB包,打包的文件已经拷贝到streamingAssets文件下,从此位置加载
//注意!AB包不能重复加载
ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath +"/"+"model");
_image = GameObject.Find("Canvas/Image").GetComponent<Image>();
//加载主包资源
mainAB = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "StandaloneWindows");
//获取主包中的存储的包和包之间的依赖关系
AssetBundleManifest manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//获取model资源相关的依赖
string[] dependencies = manifest.GetAllDependencies("model");
foreach (var dependency in dependencies)
{
//加载依赖的AB包
AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + dependency);
}
}
以上脚本加载的是AB主包资源中的mainfest文件,读取其中存储的model包的AB包资源依赖,从而将依赖资源所在的AB包也加载到内存中。
标签:游戏攻略