The Caching class lets you manage cached AssetBundles, downloaded using WWW.LoadFromCacheOrDownload.
See Also: WWW.LoadFromCacheOrDownload.
using System.Collections;
using UnityEngine;
using System.IO;
using System;
using UnityEngine.Networking;
using System.Collections.Generic;
public class Example : MonoBehaviour
{
IEnumerator DownloadAndCacheAssetBundle(string uri, string manifestBundlePath)
{
//Load the manifest
AssetBundle manifestBundle = AssetBundle.LoadFromFile(manifestBundlePath);
AssetBundleManifest manifest = manifestBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//Create new cache
string today = DateTime.Today.ToLongDateString();
Directory.CreateDirectory(today);
Cache newCache = Caching.AddCache(today);
//Set current cache for writing to the new cache if the cache is valid
if (newCache.valid)
Caching.currentCacheForWriting = newCache;
//Download the bundle
Hash128 hash = manifest.GetAssetBundleHash("bundleName");
UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri, hash, 0);
yield return request.SendWebRequest();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
//Get all the cached versions
List<Hash128> listOfCachedVersions = new List<Hash128>();
Caching.GetCachedVersions(bundle.name, listOfCachedVersions);
if (!AssetBundleContainsAssetIWantToLoad(bundle)) //Or any conditions you want to check on your new asset bundle
{
//If our criteria wasn't met, we can remove the new cache and revert back to the most recent one
Caching.currentCacheForWriting = Caching.GetCacheAt(Caching.cacheCount);
Caching.RemoveCache(newCache);
for (int i = listOfCachedVersions.Count - 1; i > 0; i--)
{
//Load a different bundle from a different cache
request = UnityWebRequest.GetAssetBundle(uri, listOfCachedVersions[i], 0);
yield return request.SendWebRequest();
bundle = DownloadHandlerAssetBundle.GetContent(request);
//Check and see if the newly loaded bundle from the cache meets your criteria
if (AssetBundleContainsAssetIWantToLoad(bundle))
break;
}
}
else
{
//This is if we only want to keep 5 local caches at any time
if (Caching.cacheCount > 5)
Caching.RemoveCache(Caching.GetCacheAt(1)); //Removes the oldest user created cache
}
}
bool AssetBundleContainsAssetIWantToLoad(AssetBundle bundle)
{
return (bundle.LoadAsset<GameObject>("MyAsset") != null); //this could be any conditional
}
}
如果您想存储一个捆绑包的最多 5 个缓存版本,并且在最近的缓存变为无效状态或下载的资源捆绑包出现问题时使用以前的缓存,可以像下面这样设置。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;
public class Example2 : MonoBehaviour
{
public static class CacheWithPriority
{
public enum ResolutionType
{
High,
Medium,
Low,
}
static readonly Dictionary<ResolutionType, Cache> ResolutionCaches = new Dictionary<ResolutionType, Cache>();
public static void InitResolutionCaches()
{
string highResPath = "HighRes";
string medResPath = "MedRes";
string lowResPath = Application.streamingAssetsPath;
//Create cache paths
Directory.CreateDirectory(highResPath);
Directory.CreateDirectory(medResPath);
//Create the caches and add them to a Dictionary
ResolutionCaches.Add(ResolutionType.High, Caching.AddCache(highResPath));
ResolutionCaches.Add(ResolutionType.Medium, Caching.AddCache(medResPath));
ResolutionCaches.Add(ResolutionType.Low, Caching.AddCache(lowResPath));
}
public static void PrioritizeCacheForLoading(ResolutionType resolutionToPrioritize)
{
//Move cache to the start of the queue
Caching.MoveCacheBefore(ResolutionCaches[resolutionToPrioritize], Caching.GetCacheAt(0));
}
public static void SetResolutionCacheForWriting(ResolutionType resolutionToWriteTo)
{
Caching.currentCacheForWriting = ResolutionCaches[resolutionToWriteTo];
}
}
AssetBundle currentTextureAssetBundle;
IEnumerator RearrangeCacheOrderExample(string manifestBundlePath)
{
CacheWithPriority.InitResolutionCaches();
//Load the manifest
AssetBundle manifestBundle = AssetBundle.LoadFromFile(manifestBundlePath);
AssetBundleManifest manifest = manifestBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//We know we want to start loading from the Low Resolution Cache
CacheWithPriority.PrioritizeCacheForLoading(CacheWithPriority.ResolutionType.Low);
//Load the low res bundle from StreamingAssets
UnityWebRequest lowRequest = UnityWebRequest.GetAssetBundle("lowResBundlePath",
manifest.GetAssetBundleHash("lowResBundle"), 0);
yield return lowRequest;
currentTextureAssetBundle = DownloadHandlerAssetBundle.GetContent(lowRequest);
//In the background we can start downloading our higher resolution bundles
StartCoroutine(StartDownloadHigherResolutionBundles(manifest));
//Do work with low res bundle while the higher resolutions download...
}
IEnumerator StartDownloadHigherResolutionBundles(AssetBundleManifest manifest)
{
CacheWithPriority.SetResolutionCacheForWriting(CacheWithPriority.ResolutionType.Medium);
UnityWebRequest medRequest = UnityWebRequest.GetAssetBundle("medResBundleUrl", manifest.GetAssetBundleHash("medResBundle"), 0);
medRequest.SendWebRequest();
while (!medRequest.isDone)
yield return null;
SwitchTextureBundleTo(CacheWithPriority.ResolutionType.Medium, medRequest);
//Now you'll be using the medium resolution bundle
CacheWithPriority.SetResolutionCacheForWriting(CacheWithPriority.ResolutionType.High);
UnityWebRequest highRequest = UnityWebRequest.GetAssetBundle("highResBundleUrl", manifest.GetAssetBundleHash("highResBundle"), 0);
highRequest.SendWebRequest();
while (!highRequest.isDone)
yield return null;
SwitchTextureBundleTo(CacheWithPriority.ResolutionType.High, highRequest);
//Do work with the high resolution bundle now...
}
void SwitchTextureBundleTo(CacheWithPriority.ResolutionType typeToSwitchTo, UnityWebRequest request)
{
//For performance, we tell the Caching system what cache we want it to search first
CacheWithPriority.PrioritizeCacheForLoading(typeToSwitchTo);
//Unload our current texture bundle
currentTextureAssetBundle.Unload(true);
//Load the new one from the passed in UnityWebRequest
currentTextureAssetBundle = DownloadHandlerAssetBundle.GetContent(request);
}
}
拥有多个缓存的功能让您能够保留特定资源捆绑包的多个缓存版本。您可以将它们用于备份和回退等操作。
本示例演示如何在启动后下载中分辨率和高分辨率纹理,并将它们缓存到各自的专用缓存中。
cacheCount | 返回缓存列表中的缓存数。 |
compressionEnabled | 控制缓存数据的压缩。默认启用。 |
currentCacheForWriting | 获取或设置应该用于缓存 AssetBundle 的当前缓存。 |
defaultCache | 返回 Unity 内部添加的默认缓存。 |
ready | 如果缓存系统已准备就绪,返回 true。 |
AddCache | 添加具有给定路径的缓存。 |
ClearAllCachedVersions | 从缓存中删除给定 AssetBundle 的所有缓存版本。 |
ClearCache | Removes all AssetBundle and Procedural Material content that has been cached by the current application. |
ClearCachedVersion | 删除 AssetBundle 的给定版本。 |
ClearOtherCachedVersions | 除了指定的版本以外,从缓存中删除 AssetBundle 的所有缓存版本。 |
GetAllCachePaths | 返回缓存列表中缓存的所有路径。 |
GetCacheAt | 返回缓存列表中给定位置的缓存。 |
GetCacheByPath | 返回具有给定缓存路径的缓存。 |
GetCachedVersions | 返回给定 AssetBundle 的所有缓存版本。 |
IsVersionCached | 检查是否缓存了某个 AssetBundle。 |
MarkAsUsed | 将某个缓存文件的时间戳更新为当前时间。 |
MoveCacheAfter | 在缓存列表中将源缓存移动到目标缓存之后。 |
MoveCacheBefore | 在缓存列表中将源缓存移动到目标缓存之前。 |
RemoveCache | 从缓存列表中删除该缓存。 |