AssetBundle是什么?它有什么用?大家在玩游戏的时候,一般都有加载游戏的过程把,在这个过程里面就有一部分时间是使用AssetBundle从服务器上下载数据的过程。
那么这个东西是来干什么的呢?答案是:更新。一款游戏,如果我要给我的游戏更换贴图、模型、场景、材质球等资源数据时,因为这些资源都被打成了Unity3D中的游戏包,你不可能找得到,然后替换掉。那么我怎么才能更新我的资源,将久的,不好的资源替换掉?让玩家重新下载整个游戏?也许我只是觉得后一个模型的贴图上有点瑕疵想换掉,为了这个几KB的文件,让玩家重新下载一个几十MB甚至几百MB的游戏?显然这是不科学的。
于是,要解决这个问题就需要我们使用AssetBundle来帮助我们下载并加载游戏资源。
AssetBundle是Unity3D提供的一个功能,用于打包外部文件。其中Unity4和Unity5的使用方式不一样,在Unity4中,你可以使用BuildPipeline下的:
public static bool BuildAssetBundle(Object mainAsset, Object[]assets, string pathName);方法来进行单个打包,也可以使用BuildPipeline下的:
publicstatic AssetBundleManifest BuildAssetBundles(string outputPath,BuildAssetBundleOptions assetBundleOptions,BuildTarget targetPlatform);方法来进行集体打包。
但是在Unity5中,官方为我们制作了依赖,不再需要我们自己手动依赖了,所以他给出的解决方案是我们只能够使用集体打包的方式进行打包。就是使用:BuildPipeline. BuildAssetBundles进行打包。
上面我好像提到了依赖,那么现在就说明一下依赖。
现在这样一个问题,我有4个预制体,他们使用的材质球是一样的,并且其中有两个预制体的模型相同的,如下图:
那么有人会问,为什么要做两个相同的预制体?因为我给这两个预制体挂的脚本不同,他们一个是怪物,一个是NPC,当然也有其他的原因,你可以放飞你的大脑。不管怎么样,他们的模型时一样的。
好了,现在我们可以这样做,我们dddd打包出去,那么我们得到的将会得到4个文件。如下图:
其中assetbundleprefab是我们的打包胡来的资源文件,注意,这个文件是没有后缀的。而另外两个StreamingAssets的文件名称会和你的文件夹名称一样,其中有一个有后缀StreamingAssets.manifest,这个文件就是依赖信息的文件,待会会讲。我们会发现assetbundleprefab也有一个带manifest后缀的文件,但是这个文件没有什么用。它主要是提示一些信息,待会会讲。
那么我们先看看刚才要说的,就是如果一次性打包的话,我们只会得到一个资源文件,那就是assetbundleprefab文件。里面包含在所有的东西,包括材质、模型、材质球、预制体等等所有的东西。问题是,如果我再打包dddd(1),那么就会有两份。
这个两份中包含了两份的材质、模型、材质球预制体。其中除了预制体意外,其他的东西都是相同的。而这些相同的资源我们一般称为“公共资源”,也就是可以被重复利用的东西。而这些东西应该只有一份,然后让所有其他要用到这些公共资源的资源知道他们需要加载哪个公共资源,这样我们能够省下许多的空间。而这个让其他资源知道要用到哪个公共资源的方式就叫做“依赖关系”,建立与公共资源的依赖关系就能够让那些打包出去的资源知道需要使用那些公共资源,而公共资源只需要有一份就可以了。当你需要修改东西时,只需要修改公共资源而不是要把整个Assetbundle包替换掉。
当然,你把所有的公共资源包打在一起,然后把其他资源分开打包还是不是很好。如果你要替换一些资源的话,你就需要替换整个公共资源包,而一般来说,公共资源包会很大。所以建议公共资源也按照不同的类型打包,比如材质球、材质、模型、shader都单独打成一个包。这样当你要替换资源的时候,只需要在服务器上替换掉对应Assetbundle文件,玩家在加载游戏时就会自动的下载新的Assetbundle,而且不会很大。
下一节,将会讲解手动分配AssetbundleName打包。我们主要讲解unity5的打包方式,关于unity4的打包会在之后的教程中讲解。