遇到一个问题,就是在网页上下载了AB文件之后如果没有清除缓存或者没有更新的话,下一次打开这个项目的时候unity会发现这个网站上有这个缓存他就不去下载了!
使用WWW.LoadFromCacheOrDownload接口。AssetBundles将保存在本地设备的Unity的缓存文件夹中。WebPlayer 有50MB的缓存上限,PC/Mac/Android/IOS应有有4 GB的缓存上限。这种方式也是加载AssetBundle推荐的方式。我们使用这种方式来实践一下。在Scripts文件夹中新建脚本
解决办法如下:
using System;
using UnityEngine;
using System.Collections;
public class CacheBundle : MonoBehaviour
{
public static readonly string BundleURL =
#if UNITY_ANDROID
"jar:file://" + Application.dataPath + "!/assets/MyAssetBundles/shape/cube";
#elif UNITY_IPHONE
Application.dataPath + "/Raw/MyAssetBundles/shape/cube";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
//我们将加载以前打包好的cube
"file://" + Application.dataPath + "/MyAssetBundles/shape/cube";//由于是编辑器下,我们使用这个路径。
#else
string.Empty;
#endif
//还记得吗?在cube这个AssetBundle中有两个资源,Cube1和Cube2
private string AssetName = "Cube2";
//版本号
public int version;
void Start()
{
StartCoroutine(DownloadAndCache());
}
IEnumerator DownloadAndCache()
{
// 需要等待缓存准备好
while (!Caching.ready)
yield return null;
// 有相同版本号的AssetBundle就从缓存中获取,否则下载进缓存。
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;
GameObject cube = Instantiate(bundle.LoadAsset(AssetName)) as GameObject;
cube.transform.position = new Vector3(1.5f, 0f, 0f);
// 卸载加载完之后的AssetBundle,节省内存。
bundle.Unload(false);
} //由于使用using语法,www.Dispose将在加载完成后调用,释放内存
}
}
博主注:版本号可按天来,比如
int version;
version = DateTime.dayOfYears;
这个里面参考了 这位老哥
里面的加载方式和卸载写的也很明白
另外说一下
通过WWW.LoadFromCacheOrDownload加载AssetBundle的机制?
1.Unity会先判断本地有无"url"的文件,如果没有,就会根据URL去下载相应的文件。然后在本地存储一下文件,并记录相应的版本号。
2.Unity会先判断本地有"url"的文件,本地的版本号<API传入的版本号,此时Unity也会去下载最新的文件,然后覆盖本地的此文件,然后记录下最新的版本号。
3.Unity会先判断本地有"url"的文件,本地的版本号>=API传入的版本号,此时Unity会从本地直接取,并且加载相应的文件返回。
这个的答案经过测试他是不会覆盖的会生成两个文件
通过WWW.LoadFromCacheOrDownload下载的缓存文件在哪里呢?
对应路径:C:\Documents and Settings\Administrator\AppData\LocalLow\Unity\WebPlayer\Cache\DefaultCompany_XX
XX是工程的名字。
删除WWW.LoadFromCacheOrDownload下载的缓存文件?
Caching.CleanCache();
AssetBundle 使用 WWW.LoadFromCacheOrDownload 下载资源, 在第一次下载时会将资源缓存到本地, 路径如下.
Mac: ~/Library/Caches/Unity
在这个目录下会看到类似DefaultCompany_你的工程的名称
这样的文件夹, 里面就是缓存的资源
PC: C:\Documents and Settings\Administrator\Local Settings\Application Data\Unity\WebPlayer\Cache
通用会看到类似DefaultCompany_你的工程的名称或者C:\Users\Administrator\AppData\LocalLow\Unity\DefaultCompany_工程名字
这个是网上看到的, 本人没有验证过.