Unity5.4 Assetbundles官方说明五(从AssetBundles的加载和卸载资源对象)

转载请注明出处!

  之前已经说明了如何创建AssetBundle资源包,以及如何下载的加载AssetBundle资源包对象。在此 假设我们已经从下载的资源数据中创建了AssetBundle资源包对象,现在要从AssetBundle资源包中读取资源对象,官方提供了以下三种方法:
1、 Object LoadAsset(string name) :这种方式是使用资源名称作为参数来加载需要的资源,例如AssetBundle包含了一个名为CubeObj的立方体,那么就可以使用AssetBundle.LoadAsset(“CubeObj”)来返回资源。还有一种重载的方法是Object LoadAsset(string name, Type type) ,使用type作为参数指定特定类型对象的加载。
2、 Object AssetBundle.LoadAssetAsync(string name) :这种方式与上述的加载方式基本一致,但是这种加载资源的方式是异步的,不会阻塞主线程。一般用在加载较大的资源或者一次性加载较多的资源时,这样会避免应用程序的卡顿。同样有一种重载方法来 指定特定类型对象的加载: Object LoadAssetAsync(string name, Type type)。
3、 Object[] AssetBundle.LoadAllAssets将加载AssetBundle中包含的所有对象,也可以用重载的 方法 来指定特定类型的对象: Object[] LoadAllAssets(Type type)。
  要从AssetBundle中卸载资源( 即释放内存中资源 ),需要使用 AssetBundle.Unload(bool unloadAllLoadedObjects) 方法。这个方法包含一个bool类型的参数,告诉Unity是否卸载所有资源数据(包括从Assetbundle中加载的资源)还是只卸载从下载的Assetbundle资源包中压缩的数据。如果目前正在使用从这个AssetBundle中加载的资源,那么用AssetBundle.Unload(false)方法来卸载没用的资源数据,从而释放一定的内存;如果想要释放这个AssetBundle中所有的资源,那么可以使用 AssetBundle.Unload(true)方法来销毁这个Assetbundle中所有的资源。

以上具体使用方法不再进一步赘述,可以参考官方文档。下面列举一个使用异步加载资源的脚本例子。

IEnumerator LoadAssetAsync(string url, int version)
{
while (!Caching.ready)
yield return null;
using (WWW www = WWW.LoadFromCacheOrDownload(url, version))
{
yield return www;

AssetBundle bundle = www.assetBundle;

//异步加载名为myObject的GameObject对象,返回AssetBundleRequest
AssetBundleRequest request = bundle.LoadAssetAsync("myObject", typeof(GameObject));
yield return request;

//获取加载的对象,并创建出来
GameObject obj = request.asset as GameObject;
Instantiate(obj);

bundle.Unload(false); //切记释放没用资源
}
}

  以上是官方文档的说明,下面我详细说一下关于AssetBundle加载资源的过程:
当我们打包资源后,每个资源包的所在目录都有与资源包名称一致的两个文件,同时生成AssetBundle的主文件夹中会有两个与主文件夹名称一样的文件,其中一个扩展名为.manifest,另一个文件没有扩展名。扩展名为.manifest的文件可以用文本编辑器打开,是供我们查看打包的资源信息的,加载时并无其他用处(个人感觉这个文件除了让我们看没有其他用处了),而我们的资源信息就是保存在另一个无扩展名的文件中,这个是真正的manifest文件(也是资源真正保存的文件)。
当我们要加载资源时,需要先将总的manifest加载进来,即主文件夹中与文件夹名称一致却无扩展名的那个文件(使用的是www.assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest")函数,其中字符串"AssetBundleManifest"是定死的),然后根据这个总manifest来获取所需资源的依赖资源(使用AssetBundleManifest.GetAllDependencies(string assetBundleName)函数,注意这个 assetBundleName是打包时设置的名称,而非路径 ),然后将所有的依赖资源加载到内存中,最后再将真正需要的资源加载进来。注意:获取到需要的资源后,要把加载到内存的AssetBundle进行释放,使用的方法是 AssetBundle. UnLoad(false)。具体的实现代码如下:

//需要加载的资源名称,注意这个名称是打包时设置的AssetBundle名称

public string assetName;

//打包Assetbundle的主路径

public string localPath;

//打包时在主路径中生成的总的Manifest文件

public string manifestName;


//先加载总的AssetBundleManifest文件

WWW www = new WWW("file://" + localPath + manifestName); //加载主路径的Manifest

yield return www;

if (!string.IsNullOrEmpty(www.error))
{
Debug.LogError(www.error);
}else
{
AssetBundle bundle = www.assetBundle; //获取AssetBundle

AssetBundleManifest manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //获取总的AssetBundleManifest
bundle.Unload(false);
}

//然后获取所需资源的依赖资源

. string[] dps = manifest.GetAllDependencies(assetName.ToLower()); //assetName转换为小写,因为设置的AssetBundle名称自动转换成小写

Debug.Log("依赖资源的数目:"+ dps.Length);
AssetBundle[] dpsBundle = new AssetBundle[dps.Length]; //用于保存加载的依赖资源包AssetBundle
for (int i = 0; i < dpsBundle.Length; i++)
{
Debug.Log(dps[i]);
string dUrl = "file://" + localPath + dps[i];
using (WWW www = new WWW(dUrl))
{
yield return www;
if (!string.IsNullOrEmpty(www.error))
Debug.LogError(www.error);
else
dpsBundle[i] = www.assetBundle;
}
}


//然后加载所需的资源

using (WWW www = new WWW("file://" + localPath + fileName.ToLower()))

{
yield return www;
if (!string.IsNullOrEmpty(www.error))
Debug.LogError(www.error);
else
{
AssetBundle bundle = www.assetBundle;

//然后就可以通过资源包中所需的资源真正名称来获取资源对象了,例如获取名为Cube的游戏对象如下:
GameObject obj = bundle.LoadAsset<GameObject>("Cube");
if (obj != null)
{
Instantiate(obj); //创建对象
}

//如果资源包中存在场景,加载资源包中的场景方法如下:
//SceneManager.LoadScene("MyScene");

bundle.Unload(false);
}

}
//获取到所需的资源后,记得要释放掉内存中的依赖资源的AssetBundle
foreach (AssetBundle item in dpsBundles)
{
item.Unload(false);
}
    至于其他的使用方法大家可以问度娘的,网上有好多, 我将在第十一篇中给出完整的项目源码(包括资源的打包、下载资源包、加载资源包、获取资源几依赖资源、使用资源等)。 下一篇将讲解关于AssetBundle的存储和使用。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值