using System;
using System.Collections.Generic;
using UnityEngine;
using BestHTTP;
namespace BestHTTP.Examples
{
public sealed class TextureDownloadSample : MonoBehaviour
{
///
/// The URL of the server that will serve the image resources
///
const string BaseURL = "https://besthttp.azurewebsites.net/Content/";
#region Private Fields
///
/// The downloadable images
///
string[] Images = new string[9] { "One.png", "Two.png", "Three.png", "Four.png", "Five.png", "Six.png", "Seven.png", "Eight.png", "Nine.png" };
///
/// The downloaded images will be stored as textures in this array
///
Texture2D[] Textures = new Texture2D[9];
#if !BESTHTTP_DISABLE_CACHING && (!UNITY_WEBGL || UNITY_EDITOR)
///
/// True if all images are loaded from the local cache instead of the server
///
bool allDownloadedFromLocalCache;
#endif
///
/// How many sent requests are finished
///
int finishedCount;
///
/// GUI scroll position
///
Vector2 scrollPos;
#endregion
#region Unity Events
void Awake()
{
// SaveLocal a well observable value
// This is how many concurrent requests can be made to a server
HTTPManager.MaxConnectionPerServer = 1;
// Create placeholder textures
for (int i = 0; i < Images.Length; ++i)
Textures[i] = new Texture2D(100, 150);
}
void OnDestroy()
{
// SaveLocal back to its defualt value.
HTTPManager.MaxConnectionPerServer = 4;
}
void OnGUI()
{
GUIHelper.DrawArea(GUIHelper.ClientArea, true, () =>
{
scrollPos = GUILayout.BeginScrollView(scrollPos);
// Draw out the textures
GUILayout.SelectionGrid(0, Textures, 3);
#if !BESTHTTP_DISABLE_CACHING && (!UNITY_WEBGL || UNITY_EDITOR)
if (finishedCount == Images.Length && allDownloadedFromLocalCache)
GUIHelper.DrawCenteredText("All images loaded from the local cache!");
#endif
GUILayout.FlexibleSpace();
GUILayout.BeginHorizontal();
GUILayout.Label("Max Connection/Server: ", GUILayout.Width(150));
GUILayout.Label(HTTPManager.MaxConnectionPerServer.ToString(), GUILayout.Width(20));
HTTPManager.MaxConnectionPerServer = (byte)GUILayout.HorizontalSlider(HTTPManager.MaxConnectionPerServer, 1, 10);
GUILayout.EndHorizontal();
if (GUILayout.Button("Start Download"))
DownloadImages();
GUILayout.EndScrollView();
});
}
#endregion
#region Private Helper Functions
void DownloadImages()
{
// SaveLocal these metadatas to its initial values
#if !BESTHTTP_DISABLE_CACHING && (!UNITY_WEBGL || UNITY_EDITOR)
allDownloadedFromLocalCache = true;
#endif
finishedCount = 0;
for (int i = 0; i < Images.Length; ++i)
{
// SaveLocal a blank placeholder texture, overriding previously downloaded texture
Textures[i] = new Texture2D(100, 150);
// Construct the request
var request = new HTTPRequest(new Uri(BaseURL + Images[i]), ImageDownloaded);
// SaveLocal the Tag property, we can use it as a general storage bound to the request
request.Tag = Textures[i];
// Send out the request
request.Send();
}
}
///
/// Callback function of the image download http requests
///
void ImageDownloaded(HTTPRequest req, HTTPResponse resp)
{
// Increase the finished count regardless of the state of our request
finishedCount++;
switch (req.State)
{
// The request finished without any problem.
case HTTPRequestStates.Finished:
if (resp.IsSuccess)
{
// Get the Texture from the Tag property
Texture2D tex = req.Tag as Texture2D;
// Load the texture
tex.LoadImage(resp.Data);
#if !BESTHTTP_DISABLE_CACHING && (!UNITY_WEBGL || UNITY_EDITOR)
// Update the cache-info variable
allDownloadedFromLocalCache = allDownloadedFromLocalCache && resp.IsFromCache;
#endif
}
else
{
Debug.LogWarning(string.Format("Request finished Successfully, but the server sent an error. Status Code: {0}-{1} Message: {2}",
resp.StatusCode,
resp.Message,
resp.DataAsText));
}
break;
// The request finished with an unexpected error. The request's Exception property may contain more info about the error.
case HTTPRequestStates.Error:
Debug.LogError("Request Finished with Error! " + (req.Exception != null ? (req.Exception.Message + "\n" + req.Exception.StackTrace) : "No Exception"));
break;
// The request aborted, initiated by the user.
case HTTPRequestStates.Aborted:
Debug.LogWarning("Request Aborted!");
break;
// Connecting to the server is timed out.
case HTTPRequestStates.ConnectionTimedOut:
Debug.LogError("Connection Timed Out!");
break;
// The request didn't finished in the given time.
case HTTPRequestStates.TimedOut:
Debug.LogError("Processing the request Timed Out!");
break;
}
}
#endregion
}
}