AssetBundle的原理和使用方法

发表于2016-05-26
评论1 5.1k浏览
AssetBundle的原理和使用方法
一、    AssetBundle的简述
       想必作为一名开发者,大家都有一个共同的思路和思想,就是希望能够把工程中的资源以及功能进行灵活的调用,这就涉及到在Unity中制作游戏过程时,对资源进行动态的下载和加载了。为此,Unity中就有了我们今天要说的AssetBundle,然而也不是所有版本都具有这个功能,只有Unity Pro才提供的。
        AssetBundle是—种用于封装资源的文件格式, 可以把多个游戏对象或者资源、二进制文件等封装到Assetbundle里,这就可以封装很多东西了,小到图片,音频,模型,大到整个场景,可以多个资源一起封装,也可以每个资源单独封装,它有自己的封装与解包的方法,用起来也非常方便。
       在这里我想强调一下,除了封装整个场景外,其他的游戏对象想要封装成AssetBundle我比较推荐先将其做成Prefab后再进行封装,因为Prefab可以将游戏对象身上带的组件、贴图、脚本都封装在一起,这样解包后加载进入场景直接实例化就可以了。

二、AssetBundle的整体工作流程
       第一步,开发者先把需要打包的资源根据自己调用的平台(后面实现的地方会具体讲解)封装成一个个AssetBundle,然后把这些AssetBundle上传到服务器(也可以放在本地),从而使游戏通过访问服务器(或本地)来获取所需的资源。


       第二步,开发者在游戏运行时,利用客户端根据实际需求从服务器(或本地)将对应的AssetBundle下载到本地,再通过加载方法将其资源加载到游戏中。


三、    如何封装资源
       前面强调过,我还是推荐把游戏对象先做成Prefab后再封装,如果要单独封装贴图材质等资源,方法是一样的,所以这里我就拿Prefab来示例,接下来可以根据下面的步骤和主要代码来实现对游戏对象资源的封装。
       关于Prefab的制作我在这里就不细讲了,不管是游戏对象也好,还是UI资源也好,可以尽情的往Prefab上添加你需要的组件,材质,脚本等,这里值得注意的是如果这个Prefab含有脚本,并且要被封装后在移动平台上使用在工程中创建脚本封装资源,就必须在本地也保留相同的脚本,不然加载后脚本不会执行。
1、封装脚本中核心的方法
       这是API里面提供的方法:BuildPipeline.BuildAssetBundle(obj:object, null:Object[], targetPath: string, abOptions:BuildAssetBundleOptions.CollectDependencies,tarqetPlatform:BiuldTarget.Android)
  参数说明表:

参数

说明

obj

需要封装的单个资源,封装后可通过AssetBundle.mainAsset来直接进行读取

null

这是一个资源数组,包含这个AssetBundle中的所有资源

targetPath

这个AssetBundle创建的地址

abOptions

创建AssetBundle的选项,默认是CollectDependencies,表示包含每个资源依赖的所有其他资源

tarqetPlatform

指定AssetBundle所需使用的平台

根据说明表,我们可以知道开发者在封装资源的时候根据不同的使用平台,方法中的最后一个参数会进行相应的改变,下面是上述方法根据不同平台所对应的参数表:

平台

参数

PC

默认是PC平台,可以忽略此参数

Android

BiuldTarget.Android

IOS

BuildTarget.iPhone

WebPlayer

BuildTarget.WebPlayer

 

2、创建封装脚本
      我们打包的时候可以把多个Prefab一起封装到一个AssetBundle中,也可以把每一个Prefab都封装成独立的AssetBundle,根据自己的需求来更改核心方法中的第一和第二个参数,以及封装的脚本,下面我会把两种方式的脚本都给大家。
       在Unity工程中”Peoject”面板里看看是否有“Editor”和“StreamingAssets”文件夹,如果没有就自己新建吧,找到”Editor”文件夹,然后在此文件夹下面创建脚本;              
       把多个Prefab一起封装到一个AssetBundle中的代码如下图:


       把多个Prefab各自封装成独立的AssetBundle中的代码如下图:

                    

3、成功封装
     脚本创建好了下面就是选择自己需要封装的资源,就可以“一键封装”,这就是我们把脚本创建在“Editor”文件夹下的好处。


        现在可以在StreamingAssets文件夹下面找到你打包好的AssetBundle文件了,成功看到几个已经封装好的AssetBundle文件:


四、 如何下载和加载AssetBundle资源
     根据前面讲过的流程是先从服务器下载到本地,然后再加载到场景中,这里我们是用WWW类的方法来实现的,如果对这个类不熟悉的童鞋都可以去查API的;不管AssetBundle是从服务器下载还是本地读取的方式都是一样的,测试的时候可以放在本地测试,如果需要上传服务器直接改加载路径就可以了。
1、如果打包资源的时候是打包成独立的资源,就用以下代码:


2、如果是全部打包到一起的情况:


3、方法写好了,然后在就你需要的地方调用:
StartCoroutine (LoadAssetBundle(path,name));
StartCoroutine (LoadAllGameObject(path,name));

 五、资源的安全问题
       我们对资源也有很多种加密的方式,我们可以将打包好的AssetBundle转化成一串字符数据流,然后再加上自己的一串字符串进行加密,加载的时候客户端用相同的字符串进行解密即可使用;


 

六、    移动平台上的使用总结

1、 在移动平台上使用AssetBundle的注意事项
      注意封装方法中根据需要的平台改变参数;
      如果被打包的Prefab上有脚本,那么要同时把脚本放在本地,这样加载后就会更好的执行脚本;
      如果加载的AssetBundle文件是本地的,需把AssetBundle文件放在StreamingAssets文件夹下面,因为移动平台只能读取这个路径。
      建议把资源都采取这样的方式封装了再加载,不管AssetBundle文件是放在服务器还是本地,都会大大的减少对于移动平台的占用量。
2、如何去更新我们的AssetBundle中的资源
      如果只更新除脚本外的资源,是可以通过自己的服务器进行更新的,可以将需要更新的资源重新封装好上传到和原始资源的同一个路径里覆盖,客户端运行时就会自动从你的服务器下载更新了;
      如果要更新脚本就需要通过APP Store这样的商店更新了,更新我们的主程序中的脚本,这时就要更改WWW类用到的“LoadFromCacheOrDownload(path,5)”这个方法中的第二个参数,使其对应现在新版本的数字。
      再AssetBundle的用法中除了对整体场景打包加载没有说,其他的都再上面了,有什么问题都可以留言的,如果大家希望了解整体场景打包加载的问题,我想我在下一篇文章中会来讲解。由于排版问题,所有的代码都是截图的,不能直接复制,望各位童鞋见谅;

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引