857 lines
25 KiB
C#
857 lines
25 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using System.Collections;
|
||
using System.IO;
|
||
using System.Collections.Generic;
|
||
using System.Security.Policy;
|
||
using System;
|
||
using UnityEngine.Networking;
|
||
using System.Security.Cryptography;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using TEngine;
|
||
using WebP;
|
||
|
||
public class AsyncImageDownload : MonoBehaviour
|
||
{
|
||
private Dictionary<int, Sprite> sprites = new Dictionary<int, Sprite>();
|
||
public Dictionary<string, Texture2D> textures = new Dictionary<string, Texture2D>();
|
||
private Sprite myWXPic;
|
||
|
||
private static AsyncImageDownload _instance = null;
|
||
public static AsyncImageDownload GetInstance() { return Instance; }
|
||
public static AsyncImageDownload Instance
|
||
{
|
||
get
|
||
{
|
||
if (_instance == null)
|
||
{
|
||
GameObject obj = new GameObject("AsyncImageDownload");
|
||
_instance = obj.AddComponent<AsyncImageDownload>();
|
||
DontDestroyOnLoad(obj);
|
||
_instance.Init();
|
||
}
|
||
return _instance;
|
||
}
|
||
}
|
||
|
||
public void CleanMemory()
|
||
{
|
||
this.sprites.Clear();
|
||
this.textures.Clear();
|
||
}
|
||
|
||
public bool Init()
|
||
{
|
||
if (!Directory.Exists(Application.persistentDataPath + "/ImageCache/"))
|
||
{
|
||
Directory.CreateDirectory(Application.persistentDataPath + "/ImageCache/");
|
||
}
|
||
myWXPic = null;
|
||
return true;
|
||
|
||
}
|
||
|
||
public static string GetBigMd5(string str)
|
||
{
|
||
string cl = str;
|
||
string pwd = "";
|
||
var md5 = MD5.Create();
|
||
|
||
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
|
||
|
||
for (int i = 0; i < s.Length; i++)
|
||
{
|
||
pwd = pwd + s[i].ToString("X2");
|
||
}
|
||
|
||
return pwd;
|
||
}
|
||
|
||
|
||
public async Task SetAsyncImage(string url, RawImage image)
|
||
{
|
||
// 神秘人头像不缓存
|
||
if (url == "smr")
|
||
{
|
||
GameModule.Resource.LoadAsset<Texture2D>("smr", (tex) =>
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = tex;
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
|
||
var id = GetBigMd5(url);
|
||
if (textures.ContainsKey(id))
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = textures[id];
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (!File.Exists(path + id))
|
||
{
|
||
await DownloadImageRaw(id, url, image);
|
||
}
|
||
else
|
||
{
|
||
await LoadLocalImageRaw(id, url, image);
|
||
}
|
||
}
|
||
|
||
public async Task SetAsyncImage(string url, SpriteRenderer spriteRenderer)
|
||
{
|
||
// Check if the URL is for a special case
|
||
if (url == "smr")
|
||
{
|
||
GameModule.Resource.LoadAsset<Texture2D>("smr", (tex) =>
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
spriteRenderer.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
|
||
var id = GetBigMd5(url);
|
||
if (textures.ContainsKey(id))
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
var tex = textures[id];
|
||
var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id;
|
||
spriteRenderer.sprite = sprite;
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (!File.Exists(path + id))
|
||
{
|
||
await DownloadImageSprite(id, url, spriteRenderer);
|
||
}
|
||
else
|
||
{
|
||
await LoadLocalImageSprite(id, url, spriteRenderer);
|
||
}
|
||
}
|
||
|
||
public async Task SetAsyncImage(string url, Image image)
|
||
{
|
||
// Check if the URL is for a special case
|
||
if (url == "smr")
|
||
{
|
||
GameModule.Resource.LoadAsset<Texture2D>("smr", (tex) =>
|
||
{
|
||
if (image != null)
|
||
{
|
||
var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||
image.sprite = sprite;
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
|
||
var id = GetBigMd5(url);
|
||
if (textures.ContainsKey(id))
|
||
{
|
||
if (image != null)
|
||
{
|
||
var tex = textures[id];
|
||
var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id; // 设置Sprite的名称
|
||
image.sprite = sprite;
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (!File.Exists(GetFilePath(id)))
|
||
{
|
||
await DownloadImageForImage(id, url, image);
|
||
}
|
||
else
|
||
{
|
||
await LoadLocalImageForImage(id, url, image);
|
||
}
|
||
}
|
||
|
||
//int index,Action<int,Texture2D> act
|
||
IEnumerator DownloadImageRaw2(string id, string url, RawImage image, int index, Action<int, string, Texture2D> act)
|
||
{
|
||
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
|
||
{
|
||
yield return www.SendWebRequest();
|
||
if (www.result != UnityWebRequest.Result.Success)
|
||
{
|
||
//Debug.LogError(url+" "+www.result);
|
||
act?.Invoke(index, url, null);
|
||
}
|
||
else
|
||
{
|
||
Texture2D tex2d = DownloadHandlerTexture.GetContent(www); //www.texture;
|
||
if (tex2d != null)
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = tex2d;
|
||
}
|
||
textures[id] = tex2d;
|
||
//将图片保存至缓存路径
|
||
byte[] pngData = tex2d.EncodeToPNG();//将材质压缩成byte流
|
||
File.WriteAllBytes(path + id, pngData);
|
||
}
|
||
act?.Invoke(index, url, tex2d);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
private async Task DownloadImageRaw(string id, string url, RawImage image)
|
||
{
|
||
using (UnityWebRequest www = UnityWebRequest.Get(url))
|
||
{
|
||
var asyncOp = www.SendWebRequest();
|
||
while (!asyncOp.isDone)
|
||
{
|
||
await Task.Yield();
|
||
}
|
||
|
||
if (www.result != UnityWebRequest.Result.Success)
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = null;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
byte[] data = www.downloadHandler.data;
|
||
|
||
// 在解码前获取图片尺寸
|
||
var (originalWidth, originalHeight) = GetImageSize(data);
|
||
|
||
// 计算限制大小后的尺寸
|
||
var (targetWidth, targetHeight) = CalculateTargetSize(originalWidth, originalHeight, 100, 100);
|
||
// Debug.Log($"Image size before decode: {originalWidth}x{originalHeight}, target size: {targetWidth}x{targetHeight} from URL: {url}");
|
||
|
||
Texture2D tex2d = null;
|
||
if (IsWebP(data))
|
||
{
|
||
tex2d = DecodeWebP(data, targetWidth, targetHeight);
|
||
}
|
||
else
|
||
{
|
||
tex2d = new Texture2D(targetWidth, targetHeight);
|
||
tex2d.LoadImage(data);
|
||
}
|
||
|
||
if (tex2d != null)
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = tex2d;
|
||
}
|
||
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = tex2d;
|
||
}
|
||
|
||
byte[] pngData = tex2d.EncodeToPNG();
|
||
File.WriteAllBytes(path + id, pngData);
|
||
}
|
||
else
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 计算目标尺寸,保持宽高比并限制最大尺寸
|
||
private (int width, int height) CalculateTargetSize(int originalWidth, int originalHeight, int maxWidth, int maxHeight)
|
||
{
|
||
if (originalWidth <= 0 || originalHeight <= 0)
|
||
return (2, 2); // 默认最小尺寸
|
||
|
||
if (originalWidth <= maxWidth && originalHeight <= maxHeight)
|
||
return (originalWidth, originalHeight); // 如果原始尺寸已经在限制范围内,直接使用
|
||
|
||
float ratio = Mathf.Min(
|
||
maxWidth / (float)originalWidth,
|
||
maxHeight / (float)originalHeight
|
||
);
|
||
|
||
int targetWidth = Mathf.Max(2, Mathf.RoundToInt(originalWidth * ratio));
|
||
int targetHeight = Mathf.Max(2, Mathf.RoundToInt(originalHeight * ratio));
|
||
|
||
return (targetWidth, targetHeight);
|
||
}
|
||
|
||
// 检查是否是WebP格式
|
||
private bool IsWebP(byte[] data)
|
||
{
|
||
if (data.Length < 12) return false;
|
||
|
||
// WebP文件头标识:"RIFF" + 4字节 + "WEBP"
|
||
return data[0] == 'R' && data[1] == 'I' && data[2] == 'F' && data[3] == 'F'
|
||
&& data[8] == 'W' && data[9] == 'E' && data[10] == 'B' && data[11] == 'P';
|
||
}
|
||
|
||
// 使用SimpleWebP解码WebP图片
|
||
private Texture2D DecodeWebP(byte[] data, int width, int height)
|
||
{
|
||
try
|
||
{
|
||
// 使用SimpleWebP插件解码
|
||
// Texture2D texture = SimpleWebP.Load(data);
|
||
// var texutre = Texture2DExt.CreateTexture2DFromWebP(data,false,false,(e)=>{});
|
||
Texture2D texture = new Texture2D(width, height);
|
||
texture.LoadWebP(data, out Error error);
|
||
return texture;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
Debug.LogError($"WebP decode error: {e.Message}");
|
||
return null;
|
||
}
|
||
}
|
||
|
||
// 这里有很大的GC隐患,概率卡顿的问题在这
|
||
IEnumerator LoadLocalImageRaw2(string id, string url, RawImage image, int index, Action<int, string, Texture2D> act)
|
||
{
|
||
string filePath = "file:///" + path + id;
|
||
//Debug.LogError(filePath);
|
||
//WWW www = new WWW(filePath);
|
||
//yield return www;
|
||
//Texture2D texture = www.texture;
|
||
//textures[id] = texture;
|
||
////image.texture = texture;
|
||
//act?.Invoke(index, url, texture);
|
||
//www.Dispose();
|
||
|
||
//string filePath = path + url.GetHashCode();
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(filePath))
|
||
{
|
||
yield return www.SendWebRequest();
|
||
Texture2D texture = DownloadHandlerTexture.GetContent(www);
|
||
textures[id] = texture;
|
||
//image.texture = texture;
|
||
act?.Invoke(index, url, texture);
|
||
}
|
||
}
|
||
|
||
// 这里有很大的GC隐患,概率卡顿的问题在这
|
||
private async Task LoadLocalImageRaw(string id, string url, RawImage image)
|
||
{
|
||
string filePath = "file:///" + path + id;
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(filePath))
|
||
{
|
||
var asyncOp = www.SendWebRequest();
|
||
while (!asyncOp.isDone)
|
||
{
|
||
await Task.Yield();
|
||
}
|
||
|
||
Texture2D texture = DownloadHandlerTexture.GetContent(www);
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = texture;
|
||
}
|
||
|
||
if (image != null)
|
||
{
|
||
image.texture = texture;
|
||
}
|
||
}
|
||
}
|
||
|
||
public string path
|
||
{
|
||
get
|
||
{
|
||
//pc,ios //android :jar:file//
|
||
return Application.persistentDataPath + "/ImageCache/";
|
||
|
||
}
|
||
}
|
||
|
||
public async Task PreCacheImage(string url)
|
||
{
|
||
// 神秘人头像不缓存
|
||
if (url == "smr")
|
||
{
|
||
return;
|
||
}
|
||
|
||
var id = GetBigMd5(url);
|
||
if (textures.ContainsKey(id))
|
||
{
|
||
// 图像已经缓存,无需再次下载
|
||
return;
|
||
}
|
||
|
||
if (!File.Exists(path + id))
|
||
{
|
||
await DownloadImageRaw(id, url, null);
|
||
}
|
||
else
|
||
{
|
||
await LoadLocalImageRaw(id, url, null);
|
||
}
|
||
}
|
||
|
||
private (int width, int height) GetImageSize(byte[] data)
|
||
{
|
||
if (IsWebP(data))
|
||
{
|
||
return GetWebPSize(data);
|
||
}
|
||
else if (IsPNG(data))
|
||
{
|
||
return GetPNGSize(data);
|
||
}
|
||
else if (IsJPG(data))
|
||
{
|
||
return GetJPGSize(data);
|
||
}
|
||
|
||
return (0, 0);
|
||
}
|
||
|
||
private bool IsPNG(byte[] data)
|
||
{
|
||
if (data.Length < 8) return false;
|
||
return data[0] == 0x89 && data[1] == 0x50 && data[2] == 0x4E && data[3] == 0x47;
|
||
}
|
||
|
||
private (int width, int height) GetPNGSize(byte[] data)
|
||
{
|
||
if (data.Length < 24) return (0, 0);
|
||
|
||
int width = (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];
|
||
int height = (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];
|
||
|
||
return (width, height);
|
||
}
|
||
|
||
private bool IsJPG(byte[] data)
|
||
{
|
||
if (data.Length < 2) return false;
|
||
return data[0] == 0xFF && data[1] == 0xD8;
|
||
}
|
||
|
||
private (int width, int height) GetJPGSize(byte[] data)
|
||
{
|
||
int pos = 2;
|
||
while (pos < data.Length - 2)
|
||
{
|
||
if (data[pos] != 0xFF) return (0, 0);
|
||
|
||
if (data[pos + 1] == 0xC0 || data[pos + 1] == 0xC2)
|
||
{
|
||
int height = (data[pos + 5] << 8) | data[pos + 6];
|
||
int width = (data[pos + 7] << 8) | data[pos + 8];
|
||
return (width, height);
|
||
}
|
||
|
||
pos += 2 + ((data[pos + 2] << 8) | data[pos + 3]);
|
||
}
|
||
|
||
return (0, 0);
|
||
}
|
||
|
||
private (int width, int height) GetWebPSize(byte[] data)
|
||
{
|
||
if (data.Length < 30) return (0, 0);
|
||
|
||
// WebP VP8
|
||
if (data[12] == 'V' && data[13] == 'P' && data[14] == '8')
|
||
{
|
||
int width = (data[26] | (data[27] << 8)) & 0x3FFF;
|
||
int height = (data[28] | (data[29] << 8)) & 0x3FFF;
|
||
return (width, height);
|
||
}
|
||
|
||
return (0, 0);
|
||
}
|
||
|
||
private async Task DownloadImageSprite(string id, string url, SpriteRenderer spriteRenderer)
|
||
{
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
|
||
{
|
||
var asyncOp = www.SendWebRequest();
|
||
while (!asyncOp.isDone)
|
||
{
|
||
await Task.Yield();
|
||
}
|
||
|
||
if (www.result != UnityWebRequest.Result.Success)
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
spriteRenderer.sprite = null;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
byte[] data = www.downloadHandler.data;
|
||
Texture2D tex2d = new Texture2D(2, 2);
|
||
tex2d.LoadImage(data);
|
||
|
||
if (tex2d != null)
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
var sprite = Sprite.Create(tex2d, new Rect(0, 0, tex2d.width, tex2d.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id;
|
||
spriteRenderer.sprite = sprite;
|
||
}
|
||
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = tex2d;
|
||
}
|
||
|
||
byte[] pngData = tex2d.EncodeToPNG();
|
||
File.WriteAllBytes(path + id, pngData);
|
||
}
|
||
else
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
spriteRenderer.sprite = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private async Task LoadLocalImageSprite(string id, string url, SpriteRenderer spriteRenderer)
|
||
{
|
||
string filePath = "file:///" + path + id;
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(filePath))
|
||
{
|
||
var asyncOp = www.SendWebRequest();
|
||
while (!asyncOp.isDone)
|
||
{
|
||
await Task.Yield();
|
||
}
|
||
|
||
Texture2D texture = DownloadHandlerTexture.GetContent(www);
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = texture;
|
||
}
|
||
|
||
if (spriteRenderer != null)
|
||
{
|
||
var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id;
|
||
spriteRenderer.sprite = sprite;
|
||
}
|
||
}
|
||
}
|
||
|
||
public void SetSyncImage(string url, RawImage image)
|
||
{
|
||
if (url == "smr")
|
||
{
|
||
GameModule.Resource.LoadAsset<Texture2D>("smr", (tex) =>
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = tex;
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
|
||
var id = GetBigMd5(url);
|
||
if (textures.ContainsKey(id))
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = textures[id];
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (!File.Exists(path + id))
|
||
{
|
||
DownloadImageRawSync(id, url, image);
|
||
}
|
||
else
|
||
{
|
||
LoadLocalImageRawSync(id, url, image);
|
||
}
|
||
}
|
||
|
||
private void DownloadImageRawSync(string id, string url, RawImage image)
|
||
{
|
||
using (UnityWebRequest www = UnityWebRequest.Get(url))
|
||
{
|
||
www.SendWebRequest();
|
||
while (!www.isDone) { }
|
||
|
||
if (www.result != UnityWebRequest.Result.Success)
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = null;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
byte[] data = www.downloadHandler.data;
|
||
Texture2D tex2d = new Texture2D(2, 2);
|
||
tex2d.LoadImage(data);
|
||
|
||
if (tex2d != null)
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = tex2d;
|
||
}
|
||
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = tex2d;
|
||
}
|
||
|
||
byte[] pngData = tex2d.EncodeToPNG();
|
||
File.WriteAllBytes(path + id, pngData);
|
||
}
|
||
else
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.texture = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private void LoadLocalImageRawSync(string id, string url, RawImage image)
|
||
{
|
||
string filePath = "file:///" + path + id;
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(filePath))
|
||
{
|
||
www.SendWebRequest();
|
||
while (!www.isDone) { }
|
||
|
||
Texture2D texture = DownloadHandlerTexture.GetContent(www);
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = texture;
|
||
}
|
||
|
||
if (image != null)
|
||
{
|
||
image.texture = texture;
|
||
}
|
||
}
|
||
}
|
||
|
||
public void SetSyncImage(string url, SpriteRenderer spriteRenderer)
|
||
{
|
||
if (url == "smr")
|
||
{
|
||
GameModule.Resource.LoadAsset<Texture2D>("smr", (tex) =>
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
spriteRenderer.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||
}
|
||
});
|
||
return;
|
||
}
|
||
|
||
var id = GetBigMd5(url);
|
||
if (textures.ContainsKey(id))
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
var tex = textures[id];
|
||
var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id;
|
||
spriteRenderer.sprite = sprite;
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (!File.Exists(path + id))
|
||
{
|
||
DownloadImageSpriteSync(id, url, spriteRenderer);
|
||
}
|
||
else
|
||
{
|
||
LoadLocalImageSpriteSync(id, url, spriteRenderer);
|
||
}
|
||
}
|
||
|
||
private void DownloadImageSpriteSync(string id, string url, SpriteRenderer spriteRenderer)
|
||
{
|
||
using (UnityWebRequest www = UnityWebRequest.Get(url))
|
||
{
|
||
www.SendWebRequest();
|
||
while (!www.isDone) { }
|
||
|
||
if (www.result != UnityWebRequest.Result.Success)
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
spriteRenderer.sprite = null;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
byte[] data = www.downloadHandler.data;
|
||
Texture2D tex2d = new Texture2D(2, 2);
|
||
tex2d.LoadImage(data);
|
||
|
||
if (tex2d != null)
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
var sprite = Sprite.Create(tex2d, new Rect(0, 0, tex2d.width, tex2d.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id;
|
||
spriteRenderer.sprite = sprite;
|
||
}
|
||
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = tex2d;
|
||
}
|
||
|
||
byte[] pngData = tex2d.EncodeToPNG();
|
||
File.WriteAllBytes(path + id, pngData);
|
||
}
|
||
else
|
||
{
|
||
if (spriteRenderer != null)
|
||
{
|
||
spriteRenderer.sprite = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private void LoadLocalImageSpriteSync(string id, string url, SpriteRenderer spriteRenderer)
|
||
{
|
||
string filePath = "file:///" + path + id;
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(filePath))
|
||
{
|
||
www.SendWebRequest();
|
||
while (!www.isDone) { }
|
||
|
||
Texture2D texture = DownloadHandlerTexture.GetContent(www);
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = texture;
|
||
}
|
||
|
||
if (spriteRenderer != null)
|
||
{
|
||
var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id;
|
||
spriteRenderer.sprite = sprite;
|
||
}
|
||
}
|
||
}
|
||
|
||
private async Task DownloadImageForImage(string id, string url, Image image)
|
||
{
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
|
||
{
|
||
var asyncOp = www.SendWebRequest();
|
||
while (!asyncOp.isDone)
|
||
{
|
||
await Task.Yield();
|
||
}
|
||
|
||
if (www.result != UnityWebRequest.Result.Success)
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.sprite = null;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
byte[] data = www.downloadHandler.data;
|
||
Texture2D tex2d = new Texture2D(2, 2);
|
||
tex2d.LoadImage(data);
|
||
|
||
if (tex2d != null)
|
||
{
|
||
if (image != null)
|
||
{
|
||
var sprite = Sprite.Create(tex2d, new Rect(0, 0, tex2d.width, tex2d.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id; // 设置Sprite的名称
|
||
image.sprite = sprite;
|
||
}
|
||
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = tex2d;
|
||
}
|
||
|
||
byte[] pngData = tex2d.EncodeToPNG();
|
||
File.WriteAllBytes(GetFilePath(id), pngData);
|
||
}
|
||
else
|
||
{
|
||
if (image != null)
|
||
{
|
||
image.sprite = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private async Task LoadLocalImageForImage(string id, string url, Image image)
|
||
{
|
||
string filePath = "file:///" + GetFilePath(id);
|
||
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(filePath))
|
||
{
|
||
var asyncOp = www.SendWebRequest();
|
||
while (!asyncOp.isDone)
|
||
{
|
||
await Task.Yield();
|
||
}
|
||
|
||
Texture2D texture = DownloadHandlerTexture.GetContent(www);
|
||
if (!textures.ContainsKey(id))
|
||
{
|
||
textures[id] = texture;
|
||
}
|
||
|
||
if (image != null)
|
||
{
|
||
var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
|
||
sprite.name = id; // 设置Sprite的名称
|
||
image.sprite = sprite;
|
||
}
|
||
}
|
||
}
|
||
|
||
private string GetFilePath(string id)
|
||
{
|
||
return path + id;
|
||
}
|
||
} |