195 lines
5.2 KiB
C#
195 lines
5.2 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using System.Collections;
|
||
using System.IO;
|
||
using System.Collections.Generic;
|
||
using GameCore;
|
||
public class ImageDownloader
|
||
{
|
||
public int code;
|
||
public Sprite sprite;
|
||
}
|
||
|
||
public class ImageDownloadRequest
|
||
{
|
||
public string address;
|
||
public Image imgTarget;
|
||
public bool isSelf;
|
||
}
|
||
namespace GameLogic {
|
||
public class ImageDownloadManager : UnitySingleton<ImageDownloadManager>
|
||
{
|
||
ImageDownloader selfImage = null;
|
||
List<ImageDownloader> picList = new List<ImageDownloader>();
|
||
Queue<ImageDownloadRequest> request = new Queue<ImageDownloadRequest>();
|
||
|
||
private static int maxCacheSpriteCount = 200;
|
||
private static int clearSpriteCount = 5;
|
||
private static bool isDownloading = false;
|
||
|
||
|
||
public void Reset()
|
||
{
|
||
StopAllCoroutines();
|
||
ClearAllSpriteCache();
|
||
|
||
isDownloading = false;
|
||
request.Clear();
|
||
}
|
||
|
||
public void SetImage_GameObject(string url, GameObject obj, bool isSelf = false)
|
||
{
|
||
if (string.IsNullOrEmpty(url))
|
||
{
|
||
Debug.LogWarning("ImageDownload Url is Empty");
|
||
return;
|
||
}
|
||
|
||
if (obj == null)
|
||
{
|
||
Debug.LogWarning("ImageDownload GameObject is Empty");
|
||
return;
|
||
}
|
||
|
||
var image = obj.GetComponent<Image>();
|
||
if (image == null)
|
||
return;
|
||
|
||
SetImage_Image(url, image, isSelf);
|
||
}
|
||
|
||
public void SetImage_Image(string url, Image image, bool isSelfImg = false)
|
||
{
|
||
if (string.IsNullOrEmpty(url))
|
||
{
|
||
Debug.LogWarning("ImageDownload Url is Empty");
|
||
return;
|
||
}
|
||
|
||
if (image == null)
|
||
{
|
||
Debug.LogWarning("ImageDownload image is Empty");
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
//开始下载图片前,将UITexture的主图片设置为占位图
|
||
int code = url.GetHashCode();
|
||
var pic = GetImage(code);
|
||
if (pic != null)
|
||
{
|
||
image.sprite = pic.sprite;
|
||
return;
|
||
}
|
||
|
||
request.Enqueue(new ImageDownloadRequest() { address = url, imgTarget = image, isSelf = isSelfImg });
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
if (isDownloading)
|
||
return;
|
||
|
||
if (request.Count <= 0)
|
||
return;
|
||
|
||
var temp = request.Dequeue();
|
||
|
||
if (picList.Count >= maxCacheSpriteCount)
|
||
ClearSpriteCache();
|
||
|
||
StartCoroutine(DownloadImage(temp.address, temp.imgTarget, temp.address.GetHashCode(), temp.isSelf));
|
||
}
|
||
|
||
|
||
IEnumerator DownloadImage(string url, Image image, int code, bool isSelf)
|
||
{
|
||
while (isDownloading)
|
||
{
|
||
yield return new WaitForSeconds(0.1f);
|
||
}
|
||
|
||
isDownloading = true;
|
||
Debug.LogWarning("Image Download Url: " + url);
|
||
WWW www = new WWW(url);
|
||
yield return www;
|
||
if (!string.IsNullOrEmpty(www.error))
|
||
{
|
||
Debug.LogWarning(www.url + " Image Download Error: " + www.error);
|
||
isDownloading = false;
|
||
yield break;
|
||
}
|
||
Texture2D tex2d = www.texture;
|
||
//将图片保存至缓存路径
|
||
// byte[] pngData = tex2d.EncodeToPNG(); 不存图片了..
|
||
// File.WriteAllBytes(path + url.GetHashCode(), pngData);
|
||
|
||
Sprite m_sprite = Sprite.Create(tex2d, new Rect(0, 0, tex2d.width, tex2d.height), new Vector2(0, 0));
|
||
|
||
if (image != null)
|
||
{
|
||
image.sprite = m_sprite;
|
||
}
|
||
|
||
var temp = new ImageDownloader();
|
||
temp.code = code;
|
||
temp.sprite = m_sprite;
|
||
|
||
if (isSelf)
|
||
selfImage = temp;
|
||
else
|
||
picList.Add(temp);
|
||
|
||
isDownloading = false;
|
||
//www.Dispose();
|
||
}
|
||
|
||
void ClearSpriteCache()
|
||
{
|
||
if (picList.Count <= 0)
|
||
return;
|
||
|
||
Destroy(picList[0].sprite);
|
||
//picList[0].sprite = null;
|
||
picList.RemoveAt(0);
|
||
}
|
||
|
||
void ClearAllSpriteCache()
|
||
{
|
||
if (selfImage != null)
|
||
{
|
||
Destroy(selfImage.sprite);
|
||
selfImage = null;
|
||
//selfImage.sprite = null;
|
||
}
|
||
|
||
for (int i = 0; i < picList.Count; i++)
|
||
{
|
||
//Resources.UnloadAsset(picList[i].sprite);
|
||
Destroy(picList[i].sprite);
|
||
//picList[0].sprite = null;
|
||
}
|
||
|
||
picList.Clear();
|
||
}
|
||
|
||
ImageDownloader GetImage(int code)
|
||
{
|
||
if (selfImage != null)
|
||
{
|
||
if (selfImage.code == code)
|
||
return selfImage;
|
||
}
|
||
|
||
for (int i = 0; i < picList.Count; i++)
|
||
{
|
||
if (picList[i].code == code)
|
||
return picList[i];
|
||
}
|
||
|
||
return null;
|
||
}
|
||
}
|
||
}
|