[Unity] Unity如何加载远程图片

查看:576 |回复:5 | 2021-2-23 14:50:46

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 源数之力 于 2021-3-2 14:41 编辑

Unity如何加载远程图片
2021-2-23 14:50:46  
 赞 赞 0

使用道具 登录

5个回答,把该问题分享到群,邀请大神一起回答。
2#
用Unity开发游戏时一般都会把需要用到的Texture图片提前放在Assets目录下,游戏打包时自带这些Texture图片资源(适用于Android、iOS、Deskop平台等等)。然而为浏览器开发WebGL游戏时需要稍微考虑一下用户网速问题,每次打开游戏都让用户干等很长时间(假设30MB的游戏)的话会导致用户体验很差。
目前我就遇到上述的问题,游戏用gzip压缩打包后的大小为28MB,因为Unity下载完所有资源才能开始游戏,所有每次打开游戏就是看着Unity的logo等很长时间。想了想打算把一些不会在第一个Scene用到的图片不放在游戏的Assets,而分开放在服务器上让游戏需要时再远程加载使用。
远程加载图片的代码如下(这是最初版,后面有优化版):
UnityWebRequest www = UnityWebRequestTexture.GetTexture("www.xxx.com/xxx.png"); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) {     Debug.Log(www.error); } Texture2D tex = ((DownloadHandlerTexture)www.downloadHandler).texture; Sprite sprite = Sprite.Create(tex , new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); image.sprite = sprite ; //image 是 UI Image
这样加载图片后确实让打包的程序瘦身了不少,但出现了新的问题!这段代码让游戏变得巨卡让我怀疑人生。找了很多网上的大神们的优化方案,如调整图片分辨率、图片大小、异步等等,只能说这些方法只是锦上添花,但没能解决根本问题。看到一个讲Image和RawImage的区别的帖子才恍然大悟,导致程序卡顿的原因是Sprite.Create!在程序代码中动态创建sprite是个很耗资源的操作。
最后把Image换成RawImage,并直接给他赋texture值,这样就能省略Sprite.Create过程。上代码:
UnityWebRequest www = UnityWebRequestTexture.GetTexture("www.xxx.com/xxx.png"); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) {     Debug.Log(www.error); } Texture2D tex = ((DownloadHandlerTexture)www.downloadHandler).texture; image.texture = tex; //image 是 UI RawImage
程序卡顿问题解决了。

回复 收起回复
2021-2-23 15:08:30   回复
 赞 赞 1

使用道具 登录

3#
楼上的回答太专业了吧
回复 收起回复
2021-8-28 07:47:31   回复
 赞 赞 2

使用道具 登录

4#
  public IEnumerator GetImage(string url, Transform user)  //URL + Transform
    { //加载网络图片
        Image ico = user.GetComponent<Image>();  //获取组件
        ico.color = new Color(1, 1, 1);
        ico.sprite = Resources.Load("Image/yuan" , typeof(Sprite)) as Sprite; //载入进度圆环图片
        ico.preserveAspect = true;  //禁用拉伸
        ico.type = Image.Type.Filled; //修改显示模式
        WWW www = new WWW(url);
        while (!www.isDone)
        { //赋值加载进度
            ico.fillAmount = www.progress;
            yield return null;
        }
        ico.type = Image.Type.Simple;  //还原显示模式
        if (www != null && string.IsNullOrEmpty(www.error))
        {
            Texture2D texture = www.texture;
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
            ico.sprite = sprite;
        }
        else
        { //加载失败
            ico.sprite = Resources.Load("Image/ImageError", typeof(Sprite)) as Sprite;
        }
    }


————————————————
版权声明:本文为CSDN博主「伊风飘渺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/samema/article/details/89814302
回复 收起回复
2021-8-28 12:59:42   回复
 赞 赞 1

使用道具 登录

5#
不是很会  定个贴 顺便学习一波
回复 收起回复
2021-12-25 12:04:43   回复
 赞 赞 1

使用道具 登录

6#
回复 收起回复
2023-2-26 12:49:00   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表