这一篇主要讲解一些和依赖相关的。根据前面内容打好包之后,我们会发现除了我们需要的AB文件以外,每个AB文件都会有一个对应的.manifest文本文件。并且在根目录有一个和根目录名对应的.manifest文件,如图:

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_文本文件


Demo中,我建立了一个Panel1的UI界面,里面包含两张Sprite和一张Texture的图,并将Panel1设为一个预设。将这些资源进行了设置assetBundleName,打包成上图的AB文件:

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_文本文件_02

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_txt文件_03

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_Unity_04

这些文件我们用文本编辑器就可以打开查看里面的内容啦,首先我们看看,panel1对应的manifest文件内容:

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_AssetBundle_05

可以看见,这里面包含了AB包里面的资源,以及相关的引用,因为我们的panel1里面使用到了icon包里面的Sprite和bg1里面的Texture,所有unity自动的帮我们关联起来了。

而主的manifest文件即StreamingAssets.manifest就是记录了我们所有AB的资源和引用:

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_根目录_06

你会发现除了StreamingAssets.manifest外还有一个无扩展名的StreamingAssets文件,这个其实就是一个AB包,里面存放了一个类型为AssetBundleManifest的资源。而这个资源即记录了所有的ab包以及相关的引用。(这个在后面读取使用AB包的时候会讲解到)。所有真正要用的到的其实是StreamingAssets文件,而所有的.manifest文件只是给我们用户看的(为了节省空间,.manifest后期打包时可以全部删除)


还有一点不得不提的事。unity的相关依赖只有在所有用到的资源一同打包的时候才会创建(即执行BuildPipeline.BuildAssetBundles函数的时候),不然则不会,这样就会造成我们常说的资源冗余。

下面举个例子:

正常情况下(即demo中sprite,texture,prefab一起设置了assetBundleName打包)可以看如上面所述的资源都关联好。其中panel1的AB包的大小如图只有22k:

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_Unity_07

但是当我们去了sprite和texture的abname后,在执行打包,即执行BuildPipeline.BuildAssetBundles函数时,只有一个panel1.prefab需要打包,这个时候会发现打出来的AB包大小达到了567kb:

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_根目录_08

而其对应的manifest文件也可以发现,相关的引用也消失了。

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_AssetBundle_09

从包体大小的变化不难猜到,这个新的panel1的AB里面包含了使用到了三张图片的资源,那么如果我们要是这些图片都没有与panel一起打包的话,那么假设有10个panel都用到了这些图片,那么这十个panel的ab都会包含这些图片,这就造成了冗余。

这在边推荐一个工具AssetBundleExtractor.exe,可以查看AB里面的相关信息,网上就可以下载到。

下载好后如图操作:

第一步:点击File->Open,打开你要查看的AB资源

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_Unity_10

第二步:选择好资源后,成功会弹出如下对话框,然后点击“是”,这个时候会让你再次选择一个文件,你随便找个地方创建一个txt文件指向它即可。

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_AssetBundle_11

第三步:选好指定的txt文件后,点击Info即可看见ab的信息了。

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_Unity_12

在这里我贴出两个panel1的信息,对比会发现,没有关联的时候,ab包占用空间变大确实是包含了所用到图片所造成的。

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_文本文件_13

unity gradle assets bin 含有unity那些资源 unity assetbundle manifest_根目录_14


同时还需要注意的是,StreamingAssets.manifest文件与对应的StreamingAssets文件里面只会记录你最近执行BuildPipeline.BuildAssetBundles打包时所包含的资源信息,即第一次你打包了A,B,C三个资源,这个时候StreamingAssets会包含A,B,C三个文件的相关信息,然后你后面比如只有C文件发生了修改,然后你只打包了C文件,不打包AB,那这时候StreamingAssets里面只会包含C的信息。如果A,B,C相互有所引用,也会同时消失。对只会的读取AB会造成很大影响

这些概念在你需要打差异包的时候很重要,后续就会提到。