欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-03 12:28:57
...

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

使用方法:将脚本挂载到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("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1506247880185&di=df9429c3802ea6cb5fae77643d926047&imgtype=0&src=http%3A%2F%2F58pic.ooopic.com%2F58pic%2F22%2F90%2F18%2F18r58PICEP7.png");
    }


    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);
        }
    }
}