基于Unity UGUI RawImage的网络头像功能实现方案

实现类似排行版、社交模块的头像下载与管理的封装,使用者只需要对控件进行图片网络地址的设置就能完成图片刷新。为了方便,代码全写在一个脚本,需要的自己整合一下。

使用方法:将脚本挂载到RawImage控件,调用SetOnlineTexture方法,传入图片网路地址即可。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using System.Collections.Generic;

[RequireComponent(typeof(RawImage))]
public class ImageDownloader : MonoBehaviour
{
    private static Dictionary mImageCacheDict = new Dictionary();
    private RawImage mImage;

    void Awake()
    {
        mImage = GetComponent();

        //Test
        //SetOnlineTexture("http://thirdwx.qlogo.cn/mmopen/vi_32/ceXE8MaLuaThTbb3hibXvcoq6q3tt7APnP5GicHY6caYkYa86sVBMhH7JKQJICfWlsD4PTWlM3iaKXjdoM5gp1Ddg/96");
    }


    public void SetOnlineTexture(string mUrl)
    {
        Action handle = (bool mIsSuccess, Texture2D mSetupTexture) =>
        {
            if (mIsSuccess)
            {
                mImage.texture = mSetupTexture;
            }
            else
            {
                //TODO 加载失败处理
            }
        };

        Texture2D mTexture;
        if (TryGetImageInCache(mUrl, out mTexture))
        {
            handle(true, mTexture);
        }
        else
        {
            StartCoroutine(DownLoadImages(mUrl, handle));
        }
    }

    IEnumerator DownLoadImages(string mUrl, Action mCallBack)
    {
        WWW www = new WWW(mUrl);
        while (!www.isDone)
        {
            yield return null;
        }

        if (string.IsNullOrEmpty(www.error))
        {
            UpdateImageInCache(mUrl, www.texture);
            mCallBack(true, www.texture);
        }
        else
        {
            mCallBack(false, null);
        }

        www.Dispose();
        yield return null;
    }

    public static bool TryGetImageInCache(string mPath, out Texture2D mTexture)
    {
        return mImageCacheDict.TryGetValue(mPath, out mTexture);
    }

    public static void UpdateImageInCache(string mPath, Texture2D mTexture)
    {
        if (mImageCacheDict.ContainsKey(mPath))
        {
            mImageCacheDict[mPath] = mTexture;
        }
        else
        {
            mImageCacheDict.Add(mPath, mTexture);
        }
    }
}

 

 

 


 

 

你可能感兴趣的:(Unity)