using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
/// <summary>图片加载</summary>
public class ImageLoader : MonoBehaviour
{
[SerializeField]
private string url;
public string URL
{
get { return url; }
set
{
url = value;
loadFinish = false;
Load();
}
}
[SerializeField]
private GameObject stage;
private Texture2D texture2D;
private bool loadFinish = false;
private bool enable = false;
private void Awake()
{
Init();
}
private void OnEnable()
{
enable = true;
if (!loadFinish && !string.IsNullOrEmpty(url)) Load();
}
private void OnDisable()
{
enable = false;
}
private void OnDestroy()
{
if (texture2D != null) Destroy(texture2D);
}
private void Load()
{
StopCoroutine("GetImage");
Init();
if (string.IsNullOrEmpty(url))
{
Error("url is null!");
return;
}
if (texture2D != null) Destroy(texture2D);
SetTexture();
if (!url.StartsWith("https://") && !url.StartsWith("http://"))
{
if (!url.StartsWith("file://")) url = "file://" + url;
}
if (enable) StartCoroutine(GetImage(url));
}
private IEnumerator GetImage(string url)
{
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
{
www.SendWebRequest();
while (!www.isDone)
{
#if UNITY_EDITOR
yield return 0;
#else
yield return new WaitForEndOfFrame();
#endif
LoadProgress(www.downloadProgress);
yield return null;
}
LoadFinish();
if (www.result != UnityWebRequest.Result.Success)
{
Error(www.error);
}
else
{
texture2D = DownloadHandlerTexture.GetContent(www);
SetTexture();
}
}
}
private void SetTexture()
{
if (stage == null) return;
Material material = new Material(Shader.Find("UI/Default"));
MeshRenderer renderer = stage.GetComponent<MeshRenderer>();
if (renderer != null) renderer.material = material;
if (texture2D == null) return;
float quadSize = 1f;
stage.transform.localScale = new Vector3(quadSize, quadSize, 1f);
float aspectRatio = (float)texture2D.width / texture2D.height;
if (aspectRatio > 1f)
{
stage.transform.localScale = new Vector3(1f, 1f / aspectRatio, 1f) * quadSize;
}
else
{
stage.transform.localScale = new Vector3(aspectRatio, 1f, 1f) * quadSize;
}
material.SetTexture("_MainTex", texture2D);
}
private void Init()
{
//初始化,
}
private void LoadProgress(float progress)
{
//Debug.Log("Loading progress: " + (progress * 100).ToString("F2") + "%");
}
private void Error(string error)
{
Debug.LogWarning("error:" + error);
//加载图片错误
}
private void LoadFinish()
{
loadFinish = true;
//加载完成
}
}
Unity Quad 加载图片
于 2024-02-29 17:23:59 首次发布