123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- using System;
- using System.Threading.Tasks;
- using Best.HTTP.Caching;
- using Best.HTTP.Examples.Helpers;
- using Best.HTTP.Shared;
- using UnityEngine;
- namespace Best.HTTP.Examples
- {
- class StraightFromCacheSample : SampleBase
- {
- #pragma warning disable 0649, 0169
- [Header("Sample Fields")]
- /// <summary>
- /// GameObject that will be used as a root for new UI objects.
- /// </summary>
- [SerializeField]
- private RectTransform _contentRoot;
- /// <summary>
- /// Prefab of a UI object with two Text fields.
- /// </summary>
- [SerializeField]
- private MultiTextListItem _listItemPrefab;
- /// <summary>
- /// Prefab of a UI object with Text and (Raw)Image fields.
- /// </summary>
- [SerializeField]
- private TextWithImageListItem _listItemWithImagePrefab;
- #pragma warning restore
- /// <summary>
- /// Address of the used end point.
- /// </summary>
- #if UNITY_ANDROID && !UNITY_EDITOR
- private string _baseAddress = "https://besthttpwebgldemo.azurewebsites.net/AssetBundles/Android/demobundle.assetbundle";
- #else
- private string _baseAddress = "https://besthttpwebgldemo.azurewebsites.net/AssetBundles/WebGL/demobundle.assetbundle";
- #endif
- protected override async void Start()
- {
- base.Start();
- var uri = new Uri(this._baseAddress);
- CreateUIItem("Calling await LoadImageFromLocalCacheAsync");
- // Try load the bundle and texture from local cache
- var texture = await LoadImageFromLocalCacheAsync(uri);
- // If it fails, download
- if (texture == null)
- {
- CreateUIItem("Content isn't cached yet! Downloading....");
- await DownloadIntoLocalCache(uri);
- CreateUIItem("Done! Retrying LoadImageFromLocalCacheAsync");
- texture = await LoadImageFromLocalCacheAsync(uri);
- }
- if (texture == null)
- CreateUIItem("Couldn't load image!");
- else
- CreateUIItemWithImage("Image loaded!")
- .SetImage(texture);
- }
- async Task DownloadIntoLocalCache(Uri uri)
- {
- var request = HTTPRequest.CreateGet(uri);
- // No content will be stored in memory.
- request.DownloadSettings.CacheOnly = true;
- try
- {
- await request.GetHTTPResponseAsync();
- }
- catch (AsyncHTTPException ex)
- {
- Debug.LogException(ex);
- }
- }
- #if UNITY_2023_1_OR_NEWER
- async
- #endif
- Task<Texture2D> LoadImageFromLocalCacheAsync(Uri uri)
- {
- #if UNITY_2023_1_OR_NEWER
- // If Setup isn't called yet, HTTPManager.LocalCache isn't created yet either and would be null.
- HTTPManager.Setup();
- var hash = HTTPCache.CalculateHash(HTTPMethods.Get, uri);
- // Call BeginReadContent to try to acquire a Stream to the cached content
- var stream = HTTPManager.LocalCache.BeginReadContent(hash, null);
- if (stream == null)
- return null;
- try
- {
- var bundleLoadAsyncOp = AssetBundle.LoadFromStreamAsync(stream);
- // Unity's GetAwaiter extension is typeless, we can await it but can't await and return with the asset bundle.
- // See "Loading resources asynchronously" at https://docs.unity3d.com/2023.2/Documentation/Manual/AwaitSupport.html
- await Awaitable.FromAsyncOperation(bundleLoadAsyncOp);
- var assetBundle = bundleLoadAsyncOp.assetBundle;
- var resourceLoadAsyncOp = assetBundle.LoadAssetAsync<Texture2D>("9443182_orig");
- await Awaitable.FromAsyncOperation(resourceLoadAsyncOp);
- return resourceLoadAsyncOp.asset as Texture2D;
- }
- finally
- {
- // If we called BeginReadContent and it's returned with a non-null value, we have to call EndReadContent too!
- HTTPManager.LocalCache.EndReadContent(hash, null);
- // We are responsible disposing the stream!
- stream?.Dispose();
- }
- #else
- return null;
- #endif
- }
- private void OnDestroy()
- => AssetBundle.UnloadAllAssetBundles(true);
- MultiTextListItem CreateUIItem(string str)
- => Instantiate<MultiTextListItem>(this._listItemPrefab, this._contentRoot)
- .SetText(str) as MultiTextListItem;
- TextWithImageListItem CreateUIItemWithImage(string str)
- => Instantiate<TextWithImageListItem>(this._listItemWithImagePrefab, this._contentRoot)
- .SetText(str) as TextWithImageListItem;
- }
- }
|