遇到一个问题,就是在网页上下载了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会从本地直接取,并且加载相应的文件返回。
 

这个的答案经过测试他是不会覆盖的会生成两个文件

unity 项目缓存 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_工程名字 这个是网上看到的, 本人没有验证过.