Unity 热更--AssetBundle学习笔记 0.8

AB包的依赖

接上一小结。

在这里我们新建一个红色材质球,赋值给Cube预制体。此时不对材质球进行AB包分类,再次进行打包。运行脚本,发现红色cube成功的从AB包中加载出来。尽管我们没有将cube所依赖的材质球进行打包分类,但是打包时候unity会自动将包中的物体相关依赖打入包中【图三所示】。对于所依赖的资源我们如果不进行打包设置,也可以正常使用。

如果还是这个红色的材质球,需要被其它AB包中的预制体所使用呢?每个AB包里会默认打入一个材质球显然有些浪费AB包的空间。

我们可以设置某个公共资源打入到具体的包中,而在加载使用AB包中的资源时候,把此AB包相关依赖的其它AB包也同时加载出来即可满足使用。也就是说我要加载A资源时候,会检查A资源依赖的其它资源包(可能是B、C),将ABC同样加载到内存中,这样在使用A的时候,不会造成资源丢失问题。

C# 复制代码
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包也加载到内存中。