主要介绍什么是AssetBundle,如何在开发阶段创建AssetBundle文件,如何在运行阶段下载AssetBundle文件等
一、什么是AssetBundle
上一节已经讲过了,AssetBundle是一种二进制文件,它可以将模型、贴图、音乐、场景以及开发者自己定义的二进制文件(但是必须是.byte的后缀名)打包。用于在应用运行时加载远程或本地的资源。
二、创建AssetBundle文件
在Unity3D编辑器中不能直接右键创建AssetBundle文件,创建需要通过脚本。
主要思路是通过脚本在编辑器的菜单上创建两个菜单项,选中物体,点击菜单选项调用函数创建(如何创建菜单以及调用函数已经在定制特性中讲过),或者选中要被打包的素材,右键选择菜单创建。
与创建AssetBundle相关的类是BuildPipeline,它有三个静态函数:
1. BuildAssetBundle:将任意资源打包成BuildPipeline文件。
2. BuildStreamedSceneAssetBundle:该方法用来编译场景资源包,允许编译多个场景和它所依赖的压缩资源包。
3.BuildAssetBundleExplicitAssetNames:该方法与BuildAssetBundle相似,但是可以指定每个资源对象的名称。
在脚本中创建主要代码:
//打包对象与引用的资源
string path = "Assets/myAssetBundle.unity3d";
if(path.length !=0){
Object[] selection=Selection.GetFiltered(typeof(object),SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies);
Selection.objects=selection;
}
//打包对象
string path = "Assets/myAssetBundle.unity3d";
if(path.length !=0){
BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path);
}
三、加载AssetBundle文件
1. 运行时下载AssetBundle
a. 无需缓存:这种方式无需将下载的AssetBundle文件保存到本地磁盘中,通过创建一个WWW对象实现。
b. 需要缓存(推荐):这种方式会将通过下载得到的AssetBundle保存在本地磁盘中。但是磁盘并不是无限大,pc.mac.ios.android为4G,WebPlayer 为50M。通过WWW.LoadFromCacheOrDownload静态方法实现,需要参数url,version(上一节有介绍哦)。
然后通过AssetBundle ab=www.assetBundle;获得AssetBundle。
c. 当AssetBundle(未被压缩) 在本地磁盘的StreamAssets中,可以通过AssetBundle .CreateFromFile静态方法加载。
2. 解析AssetBundle中的资源
通过AssetBundle的三个方法实现:
AssetBundle.LoadAsset(string name)或者AssetBundle.LoadAsset(string name,Type type);
AssetBundle.LoadAssetAsync,参数同上,不同的是异步加载,不会阻塞主线程,当要加载的资源很大时,建议使用。
AssetBundle.LoadAllAssets,参数同上,读取所有文件。
除了加载,也有卸载函数:
AssetBundle.Unload(bool):当参数值为false时,未被解压的资源会被删除,当参数值为true时,解压与未解压的资源都会被删除。
使用例子:
//下载AssetBundle
WWW www = WWW.LoadFromCacheOrDownload(url,0);
yield return www;
//获取AssetBundle
AssetBundle ab = www.assetBundle;
//异步加载资源
assetBundleRequest request = ab.LoadAssetAsync("myObject",typeof(GameObject));
yield return request ;
GameObject obj=request .asset as GameObject;
//释放未解压的资源
ab.Unload(false);
www.Dispose();
AssetBundle文件的平台兼容性问题,在不同的平台上创建的AssetBundle文件,换到其他平台可能无法运行,一般在编辑器中创建的可以在所有平台运行(本文也就只介绍了在编辑器创建)
从AssetBundle中读取资源只会考虑名字,而不考虑路径与扩展名。但是可以用之前提到的函数BuildAssetBundleExplicitAssetNames在创建时为每个资源取名字。