Caching
класс в UnityEngine
Выполнено в:UnityEngine.CoreModule
Описание
Класс Caching позволяет управлять кэшированными AssetBundle, загруженными с помощью UnityWebRequestAssetBundle.GetAssetBundle.
Примечание: Кэш API не поддерживается в WebGL, потому что AssetBundles хранятся в кэше браузера для платформы WebGL.
Дополнительные ресурсы: DownloadHandlerAssetBundle.
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 = UnityWebRequestAssetBundle.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 = UnityWebRequestAssetBundle.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 }
manifestBundle.Unload(true); bundle.Unload(true);
}
bool AssetBundleContainsAssetIWantToLoad(AssetBundle bundle) { return (bundle.LoadAsset<GameObject>("MyAsset") != null); //this could be any conditional } }
Чтобы хранить до пяти кэшированных версий одного и того же пакета и использовать предыдущие кэши в случае, если последний кэш становится недействительным или загруженный пакет ассетов не работает, используйте следующую настройку.
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 = UnityWebRequestAssetBundle.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...
//Unload the AssetBundle manifestBundle.Unload(true); }
IEnumerator StartDownloadHigherResolutionBundles(AssetBundleManifest manifest) { CacheWithPriority.SetResolutionCacheForWriting(CacheWithPriority.ResolutionType.Medium); UnityWebRequest medRequest = UnityWebRequestAssetBundle.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 = UnityWebRequestAssetBundle.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); currentTextureAssetBundle.Unload(true); } }
Возможность использования нескольких кэш-памятей позволяет хранить несколько кэшированных версий определенного Asset Bundle. Вы можете использовать их для таких целей, как резервные копии и резервные копии.
В этом примере показана загрузка текстур среднего и высокого разрешения после запуска и их кэширование в соответствующих кэш-памятях.
Статические свойства
| Свойство | Описание |
|---|---|
| cacheCount | Возвращает число кэшей в списке кэшей. |
| compressionEnabled | Контролирует сжатие данных кэша. Включено по умолчанию. |
| currentCacheForWriting | Получает или устанавливает текущий кэш, в котором должен кэшироваться AssetBundles. |
| defaultCache | Возвращает кэш по умолчанию, который добавляется Unity внутренне. |
| ready | Возвращает true, если система Кэширования готова к использованию. |
Статические методы
| Метод | Описание |
|---|---|
| AddCache | Добавить кэш с указанным путем. |
| ClearAllCachedVersions | Удаляет все кэшируемые версии заданного AssetBundle из кэша. |
| ClearCache | Удаляет все содержимое AssetBundle, которое было кэшировано текущим приложением. |
| ClearCachedVersion | Удаляет указанную версию AssetBundle. |
| ClearOtherCachedVersions | Удаляет из кэша все кэшированные версии AssetBundle, за исключением указанной версии. |
| GetAllCachePaths | Возвращает все пути к кэшу в списке кэширования. |
| GetCacheAt | Возвращает Кэш на указанной позиции в списке кэш-памяти. |
| GetCacheByPath | Возвращает Кэш, имеющий указанный путь к кэшу. |
| GetCachedVersions | Возвращает все кэшированные версии заданного AssetBundle. |
| IsVersionCached | Проверяет, кэшируется ли AssetBundle. |
| MarkAsUsed | Заменяет метку времени кэшируемого файла на текущее время. |
| MoveCacheAfter | Перемещает исходный Кэш после конечного Кэша в списке кэшей. |
| MoveCacheBefore | Перемещает исходный Кэш перед Кэшом назначения в списке кэшей. |
| RemoveCache | Удаляет Кэш из списка кэша. |