12 在Unity中使用AssetBundle

主要介绍什么是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在创建时为每个资源取名字。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值