问题:游戏内使用玩家的关系链头像(微信、qq)作为游戏头像,但是下载下来的gif格式资源无法跟png\jpg一样正确的显示,而是显示出红色的问号?
解决:下载后检查如果是.gif格式的资源,使用UniGif插件进行显示。由于UniGif插件使用unity的协成下载资源、播放动画,这边要注意unity对非活跃对象调用StartCoroutine
代码:
//避免重复加载,缓存下载结果 private static Dictionary<string, DownCache> m_cacheDownload = new Dictionary<string, DownCache>(); private class DownCache { public byte[] data; public string text; public Texture tex; public string url; } /// <summary> /// 下载图片 /// </summary> /// <param name="url"></param> /// <param name="callBack"></param> public static void DownLoadTextureByUrl(string url, Action<Texture, string> callBack) { if(callBack == null) return; DownCache cache; if (m_cacheDownload.TryGetValue(url, out cache)) { if (cache.text.StartsWith("GIF")) //gif { callBack(null, url); } else { callBack(cache.tex, url); } return; } TaskManager.Instance.Create(DownLoadPicture(url, callBack)); } private static IEnumerator DownLoadPicture(string url, Action<Texture, string> callBack) { UnityWebRequest req = UnityWebRequest.Get(url); DownloadHandlerTexture handle = new DownloadHandlerTexture(true); req.downloadHandler = handle; req.timeout = 30; yield return req.SendWebRequest(); if (req.isNetworkError || req.isHttpError) { yield break; } Texture tex = handle.texture; if (handle.text.StartsWith("GIF")) //gif { if (callBack != null) { callBack(null, url); } } else {// png/jpg tex.name = url; if (callBack != null) { callBack(tex, url); } } DownCache cacheHandle = new DownCache();//缓存,req.Dispose会销毁handle,所以这边单独缓存 cacheHandle.data = handle.data; cacheHandle.text = handle.text; cacheHandle.tex = tex; cacheHandle.url = url; if(!m_cacheDownload.ContainsKey(url)) m_cacheDownload.AddValueEx(url,cacheHandle); Debug.Log("download end : " + tex.name + "_" + tex.width); req.Dispose(); } public static void DownloadAndPlayGif(Component com, string url) { UniGifTexture uniGifTexture = com.GetComponent<UniGifTexture>(); if (uniGifTexture != null) { if (com.gameObject.activeInHierarchy) { uniGifTexture.PlayGifWithUrl(url); } else {//协成必须在对象可见的情况下才能调用 uniGifTexture.loadOnStartUrl = url; GGDebug.Debug("DownloadAndPlayGif with inactive obj : " + com.name); } } } public static void ClearGif(Component com) { UniGifTexture uniGifTexture = com.GetComponent<UniGifTexture>(); if (uniGifTexture != null) { uniGifTexture.Clear(); GameObject.DestroyImmediate(uniGifTexture.texture.mainTexture, true); } }
对UniGifTexture做的一个小优化:
public void PlayGifWithUrl(string url) { if(url.Equals(loadOnStartUrl) && state == STATE.PLAYING) return;//减少重复加载 Clear(); DestroyImmediate(texture.mainTexture, true); loadOnStartUrl = url; PlayGif(); }
原文:https://www.cnblogs.com/wang-jin-fu/p/12856007.html