官方推荐的下载AssetBundles方式是使用WWW.LoadFromCacheOrDownload(),它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,举个例子,同一下载地址版本号为1的时候已经下载到本地,此时将版本号的参数改成2 那么它又会重新下载,如果还保持版本号为1那么它会从本地读取,因为本地已经有版本号为1的这个Assetbundle了。你不用担心你的资源本地下载过多,也不用自己手动删除他们,这一切的一切Unity会帮我们自动完成,它会自动删除掉下载后最不常用的Assetbundle ,如果下次需要使用的话只要提供下载地址和版本后它会重新下载。脚本例子如下:using System;
using UnityEngine;
using System.Collections;class NonCachingLoadExample : MonoBehaviour {
public string BundleURL; //下载地址
public string AssetName; //资源名
IEnumerator Start() {
// 从URl地址下载文件,它会被临时保存在缓存中
using (WWW www = new WWW(BundleURL)) {
yield return www;
if (www.error != null)
throw new Exception("WWW download had an error:" + www.error);
AssetBundle bundle = www.assetBundle;
if (AssetName == "")
Instantiate(bundle.mainAsset); //创建主要的资源
else
Instantiate(bundle.LoadAsset(AssetName));//创建资源名为AssetName的资源
// 记得要从缓存中清除(Unload)bundle.Unload(false);
} // 自动从Web流中释放内存(使用using()会隐式WWW.Dispose()进行释放)
}
}
请注意:当使用WWW.LoadFromCacheOrDownload下载时,每一帧最多只有一个Assetbundle完成下载。using System;
using UnityEngine;
using System.Collections;
public class CachingLoadExample : MonoBehaviour {
public string BundleURL; //下载地址
public string AssetName; //资源名
public int version; //版本号,只要版本号改变(无论增大还是减小),就会重新下载
void Start() {
StartCoroutine (DownloadAndCache());
}
IEnumerator DownloadAndCache (){
//等待缓存系统完成缓存准备while (!Caching.ready)
yield return null;
//如果本地缓存中存在相同版本号的Assetbundle资源,就会从本次返回对象//否则会根据版本号从BundleURL下载资源并保存在缓存中
using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){
yield return www;
if (www.error != null)
throw new Exception("WWW download had an error:" + www.error);
AssetBundle bundle = www.assetBundle;
if (AssetName == "")
Instantiate(bundle.mainAsset); //创建资源对象
else
Instantiate(bundle.LoadAsset(AssetName));
// 记得要从缓存中清除(Unload)
bundle.Unload(false);
} // 自动从Web流中释放内存(使用using()会隐式WWW.Dispose()进行释放)
}
}