Unity对接后台和加载图片

这篇具有很好参考价值的文章主要介绍了Unity对接后台和加载图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

        在unity中与后台对接,用await在web端暂时还不支持,所以,协程成为比较好的通用方式,以下适用除post访问外的所有对接

2、对接后台
2.1、安装插件

        首先我们需要用到Newtonsoft.dll,如果没有这个.dll的请跟着我一起装上,我们先创建一个脚本WebRequest.cs,然后双击脚本打开VS2022

unity 加载 云端 图片,Unity,unity,c#

在上面一排工具栏中,点击“工具”选项unity 加载 云端 图片,Unity,unity,c#

 选择NuGet包管理器-管理解决方案的NuGet程序包,这时会弹出一个窗口

unity 加载 云端 图片,Unity,unity,c#点击”浏览“

unity 加载 云端 图片,Unity,unity,c#排在第一的就是我们需要用的插件,插件轻量好用

unity 加载 云端 图片,Unity,unity,c#

点击这个后,右侧小窗弹出窗口,像我这样勾选,然后安装

unity 加载 云端 图片,Unity,unity,c# 安装完成后,我们回到脚本页面,右键打开所在的文件夹

unity 加载 云端 图片,Unity,unity,c#我们返回工程目录,在Packages这个文件夹下有一个Newtonsoft文件夹,这个就是我们的插件

unity 加载 云端 图片,Unity,unity,c#

点进文件夹后有许多net版本,个人比较推荐netstandard2.0

unity 加载 云端 图片,Unity,unity,c# 将netstandard2.0下的Newtonsoft.Json.dll拖入我们的工程里,下面开始我们的正文

2.2、代码

        回到正题,我们创建好WebRequest.cs后,结构是这样

using Newtonsoft.Json.Linq;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class WebRequest : MonoBehaviour
{
    public string address;
    // Start is called before the first frame update
    void Start()
    {
        
    }
    /// <summary>
    /// 获取返回对象,如果不存在返回为null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path">路径</param>
    /// <param name="callback"></param>
    /// <returns></returns>
    public IEnumerator RequestURLWithArray(string path, System.Action<JObject> callback)
    {
        string paths = address + path;
        Debug.LogError("当前链接+++" + paths);
        //jishi();
        using (var request = UnityWebRequest.Get(paths))
        {
            // 发送HTTP请求并等待响应
            yield return request.SendWebRequest();

            // 检查是否有错误发生
            if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError(request.error + "链接:" + paths);
                yield break;
            }
            if (!string.IsNullOrEmpty(request.downloadHandler.text))
            {

                callback(JObject.Parse(request.downloadHandler.text));
            }

        }
    }
}

由于是教学,我没有现有的后台接口,就用本地json代替,后台对接也只是换一下链接就能继续用

以上代码写完,我们在工程目录Assets下创建StreamingAssets文件夹,在StreamingAssets文件夹中创建“测试.json”,测试.json的数据结构如下:

{
"name":"11111",
"id":123456789,
"password":"123456789"
}

兄弟们一定一定要注意,json必须是utf8格式保存的,不然容易出现读取失败或者乱码等bug

一个非常简单的json,主要是测试用,打算搭一个登录界面来测试所以数据不多,如果兄弟们有大量数据的,也可以用这套东西,博主亲测,几十个接口+几百条数据,完美对接,延时基本上在几百ms,可以接受的

然后我们在WebRequest的Start里写获取,改写一下WebRequest

using Newtonsoft.Json.Linq;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class WebRequest : MonoBehaviour
{
    public string address;
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(RequestURLWithArray(Application.streamingAssetsPath + "/测试.json", (a) =>
        {
            Debug.Log($"name:{a["name"]} id: {a["id"]} password: {a["password"]}");
        }));
    }
    /// <summary>
    /// 获取返回对象,如果不存在返回为null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path">路径</param>
    /// <param name="callback"></param>
    /// <returns></returns>
    public IEnumerator RequestURLWithArray(string path, System.Action<JObject> callback)
    {
        string paths =  path;
        Debug.LogError("当前链接== " + paths);
        //jishi();
        using (var request = UnityWebRequest.Get(paths))
        {
            // 发送HTTP请求并等待响应
            yield return request.SendWebRequest();

            // 检查是否有错误发生
            if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError(request.error + "链接:" + paths);
                yield break;
            }
            if (!string.IsNullOrEmpty(request.downloadHandler.text))
            {

                callback(JObject.Parse(request.downloadHandler.text));
            }

        }
    }
}

到这里就要注意,敲黑板划重点

我在这里写的输出,是转成JObject对象后以键对值的形式直接取得

Debug.Log($"name:{a["name"]} id: {a["id"]} password: {a["password"]}");

这里的键全部要和json中的变量对的上,才能获取到,当然,除了JObject外还有数组形式,那是另一种结构,我们等下再说

写完后保存,回到unity中,创建空对象 WebRequest将脚本挂在上面,开始运行

unity 加载 云端 图片,Unity,unity,c#这时控制台就会输出我们想要的数据:

unity 加载 云端 图片,Unity,unity,c#以上就是基础用法,不太建议这样用,如果是只有一个json或接口,可以像上述这样写,但是如果不止一个,而且数据多,我们就要换种形式读取

2.3、进阶用法

        接下来是进阶用法,我们先创建一个抽象类,这个类继承MonoBehaviour,并且要有一个封装好的JObject参数,一个虚方法init,用来处理收到的数据:

1、新建抽象类Dataabstract.cs

using Newtonsoft.Json.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class Dataabstract : MonoBehaviour
{
    public string path;
    protected JObject data;
    public JObject Data
    {
        get { return data; }
        set 
        { 
            if (value != null)
            {
                data = value;
                init();
            }
            else
            {
                Debug.LogError("获取失败,请检查链接地址");
            }
        }
    }
    protected virtual void init()
    {

    }
}

2、修改WebRequest.cs

using Newtonsoft.Json.Linq;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class WebRequest : MonoBehaviour
{
    public string address = Application.streamingAssetsPath;
    public Dataabstract[] Dataabstracts;
    // Start is called before the first frame update
    void Start()
    {
        init();
    }
    void init()
    {
        for (int i = 0; i < Dataabstracts.Length; i++)
        {
            StartCoroutine(RequestURLWithArray(address+"/"+Dataabstracts[i].path, (a) =>
            {
                Dataabstracts[i].Data = a;
            }));
        }
    }
    /// <summary>
    /// 获取返回对象,如果不存在返回为null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path">路径</param>
    /// <param name="callback"></param>
    /// <returns></returns>
    public IEnumerator RequestURLWithArray(string path, System.Action<JObject> callback)
    {
        string paths =  path;
        Debug.LogError("当前链接== " + paths);
        //jishi();
        using (var request = UnityWebRequest.Get(paths))
        {
            // 发送HTTP请求并等待响应
            yield return request.SendWebRequest();

            // 检查是否有错误发生
            if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError(request.error + "链接:" + paths);
                yield break;
            }
            if (!string.IsNullOrEmpty(request.downloadHandler.text))
            {
                callback(JObject.Parse(request.downloadHandler.text));
            }

        }
    }
}

3、新建测试类Test1,Test1继承抽象类Dataabstract重写init方法

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

public class Test1 : Dataabstract
{
    protected override void init()
    {
        Debug.Log($"name:{data["name"]} id: {data["id"]} password: {data["password"]}");
    }
}

回到unity中,新建空物体Test1,挂上Test1脚本,在面板上的path写上我们的json名字,请注意,一定要把          后缀带上,后缀带上,后缀带上

unity 加载 云端 图片,Unity,unity,c#

然后我们把Test1拖入WebRequest的Dataabstracts数组中

unity 加载 云端 图片,Unity,unity,c#

然后运行就可以看到我们拿到了数据

unity 加载 云端 图片,Unity,unity,c#这样主要是应对大量不同的json或接口要读的, 这是这种格式的多样,下面我们来看另一种格式的json

2.4、另一种带数组的json读取

我们在StreamingAssets下再创建一种json,名字叫测试1.json,数据如下

{
  "data": [
    {
      "name": "123",
      "id": 1,
      "password": "爱上放大"
    },
    {
      "name": "456",
      "id": 2,
      "password": "各色地方"
    },
    {
      "name": "789",
      "id": 3,
      "password": "奥尔格和"
    }
  ]
}

新建Test2脚本

using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.UI;

public class Test2 : Dataabstract
{
    public int index;
    [SerializeField] Text[] text;
    protected override void init()
    {
        JArray jArray = (JArray)data["data"];
        for (int i = 0; i < text.Length; i++)
        {
            text[i].text = jArray[index][text[i].name].ToString();
        }
    }
}

接下来我们回到unity,按我这样的结构创建好东西

unity 加载 云端 图片,Unity,unity,c#

把Test2挂到GameObject上,然后各GameObject的index分开,我这里的json有三组数据,所以我这里填的是0-2,这个作为索引去json中的data数组中找数据而已,将每个GameObject下的三个Text拖进Test2中的Text数组中

unity 加载 云端 图片,Unity,unity,c# 然后把三个挂了Test2的GameObject拖进WebRequest中的数组中

unity 加载 云端 图片,Unity,unity,c#

直接运行就能看到结果 

unity 加载 云端 图片,Unity,unity,c#

可以看到,我们成功取到了数据,而且几乎没有延时,基本上是运行就有

2.5、总结

在面对如下简单的json时,我们用JObject去拿数据

{
  "name": "11111",
  "id": 123456789,
  "password": "123456789"
}

在面对如下稍微复杂的json时,我们用JArray取数据

{
  "data": [
    {
      "name": "123",
      "id": 1,
      "password": "爱上放大"
    },
    {
      "name": "456",
      "id": 2,
      "password": "各色地方"
    },
    {
      "name": "789",
      "id": 3,
      "password": "奥尔格和"
    }
  ]
}

而我们建的抽象类,只是用了一个简易版的观察者模式,去构建我们的通信模块,方便维护,降低耦合

3、加载图片
public void show(string url,Action<Sprite> ac)
{
    StartCoroutine(LoadImageFromUrl(url,ac));
}
IEnumerator LoadImageFromUrl(string url, Action<Sprite> ac)
{
    using (var request = UnityWebRequestTexture.GetTexture(url))
    {
        yield return request.SendWebRequest();

        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(request.error);
        }
        else
        {
            Texture2D texture = DownloadHandlerTexture.GetContent(request);
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
            ac(sprite);
        }
    }
}

我们可以建一个脚本来测试这段代码,新建Test3

using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Test3 : MonoBehaviour
{
    [SerializeField] Image im;
    private void Start()
    {
        show("https://img1.baidu.com/it/u=4049022245,514596079&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1701622800&t=c88ca2191a6df508642839cff923ed20", (a) =>
        {
            im.sprite = a;
        });
    }
    public void show(string url,Action<Sprite> ac)
    {
        StartCoroutine(LoadImageFromUrl(url,ac));
    }
    IEnumerator LoadImageFromUrl(string url, Action<Sprite> ac)
    {
        using (var request = UnityWebRequestTexture.GetTexture(url))
        {
            yield return request.SendWebRequest();

            if (request.result != UnityWebRequest.Result.Success)
            {
                Debug.Log(request.error);
            }
            else
            {
                Texture2D texture = DownloadHandlerTexture.GetContent(request);
                Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
                ac(sprite);
            }
        }
    }
}

回到unity,新建一个Image,把Test3挂上去,运行

unity 加载 云端 图片,Unity,unity,c#

 可以看到图片已经加载出来了,非常好用,当然这个图片如果多的话可以参考上面读json的形式改写,建立一个图片管理模块去专门加载图片,我们下期再见文章来源地址https://www.toymoban.com/news/detail-767821.html

到了这里,关于Unity对接后台和加载图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity关于本地加载图片涉及webrequest或者byte

    Unity关于本地加载图片的有2种,一种使用webrequest发送请求发送数据将得到的数据转换成Texture2d,最后转换成sprite,第二种方法是使用读取文本文件方法 将图片当成文件来读取,然后转换成,下边附上我的代码

    2024年02月15日
    浏览(36)
  • Unity3D中Resources动态加载图片

    问题:unity的Resources动态加载就不必多说了,这里出现的问题是当我把图片放入Resources文件夹后,使用Resources.Load(datapath)却并没有出现图片。 分析:由于你放在文件夹下的是图片,是Texture2D类型,但是实际用在u3d中的是sprite,所以需要转换类型。 方式: 1.在代码中先行创

    2024年02月11日
    浏览(41)
  • Unity 加载本地或网络图片并转为精灵(Sprite)的方法

    有时候我们需要把加载的图片转换成Sprite来使用。 方法: 步骤一:加载本地或网络图片并转换成Texture,这里不再赘述,可参考: Unity 加载本地图片的方法-CSDN博客 Unity 下载网络图片的方法,并把图片赋值给UI和物体的方法-CSDN博客  步骤二:把Texture转换成Sprite。 方法是使用

    2024年02月04日
    浏览(50)
  • Unity AVPro Video 加载视频第一秒图片与例子

    使用AVPro Video 加载视频第一秒的图片 原理:使用AVPro Video插件的MediaPlayer mediaPlayer.OpenMedia(new MediaPath(url链接, MediaPathType.AbsolutePathOrURL), false); 然后等待一定时间 使用ExtractFrame截取视频 Texture2D texture2D = mediaPlayer.ExtractFrame(null, 1); UI效果: 点击图片进行播放,在点击一下关闭播放

    2024年02月15日
    浏览(50)
  • UNITY 基础之 实现动态加载网络端、PC端和 ANDROID 端指定路径下的图片的简单方法

    Unity中的一些基础知识点,便于后期查看学习。 本节介绍,如何动态加载网络上,电脑上或者Android手机上指定路径的图片的简单方式,方法不唯一,仅供参考。 1、UnityWebRequest 发起网络请求,DownloadHandlerTexture 作为发起下载图片,解析得到图片 2、下载地址不仅支持网络路径

    2024年02月09日
    浏览(36)
  • Unity初学注意事项,以及最新如何删除云端项目

    作为一个对好玩的事感兴趣的人 近段时间我开始学习Unity了 首先呢,我们得先了解Unity是用于开发游戏的一个开源软件(当然他的专业版还是要收费的,这里指的个人版,初学者都是够用的,个人版开发的游戏也可以发布,只要游戏所赚的金额不超过100000元都是可以不用换的

    2024年02月07日
    浏览(47)
  • Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

    最近,由于开发需要数据存储服务,就跑去Bmob看看,不看不要紧,发现自己以前创建的应用的数据存储服务居然变成非永久的了,只有一年的免费时间,而且还过期了。这对于我将要开发的软件时很不友好的;因此,我就只能去找与Bmob同类型的后端云服务,就是我接下来要

    2023年04月23日
    浏览(38)
  • Javaweb对接Unity(一)

    一、在JavaIDEA配置Javaweb的Tomcat URL路径是java对接unity的关键 二、创建Servlet类,再配置好Web.Xml

    2024年02月14日
    浏览(35)
  • 【Unity】对接Steam

    步骤1 :搜索Steamworks或点击Steamworks链接 步骤2 :选择文献库 步骤3 :选择Steamworks SDK 步骤4 :点击此处下载最新SDK 将下载下来的SDK压缩包解压,并将Unity打包的游戏文件复制到解压路径steamworks_sdk_153asdktoolsContentBuildercontent下。 注意:    路径中不能有空格或中文。  

    2024年02月16日
    浏览(44)
  • vue对接unity

    业务需求需要前端对接unity,百度一通怎么操作引入。好家伙,是有很多。但是十篇我都没能成功导入unity。所以我决定我踩完坑,自己写一篇分享出来。 首先,方案有两个。一个是引入 vue-unity-webgl ,一个是直接用 iframe 引入。ok。知道方案,怎么做呢,因为vue-unity-webgl和ifr

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包