Unity对接后台和加载图片

1、前言

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

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

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

在上面一排工具栏中,点击“工具”选项

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

点击”浏览“

排在第一的就是我们需要用的插件,插件轻量好用

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

 安装完成后,我们回到脚本页面,右键打开所在的文件夹

我们返回工程目录,在Packages这个文件夹下有一个Newtonsoft文件夹,这个就是我们的插件

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

 将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 updatevoid 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 updatevoid 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将脚本挂在上面,开始运行

这时控制台就会输出我们想要的数据:

以上就是基础用法,不太建议这样用,如果是只有一个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 updatevoid 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名字,请注意,一定要把          后缀带上,后缀带上,后缀带上

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

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

这样主要是应对大量不同的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,按我这样的结构创建好东西

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

 然后把三个挂了Test2的GameObject拖进WebRequest中的数组中

直接运行就能看到结果 

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

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挂上去,运行

 可以看到图片已经加载出来了,非常好用,当然这个图片如果多的话可以参考上面读json的形式改写,建立一个图片管理模块去专门加载图片,我们下期再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED屏幕信息安全如何预防?

随着科技的不断进步&#xff0c;LED屏幕在我们生活和工作中扮演着越来越重要的角色&#xff0c;然而&#xff0c;随之而来的是信息安全面临的挑战。为了有效预防LED屏幕信息的泄露和被盗取&#xff0c;我们需要采取一系列的安全措施。以下是一些建议&#xff1a; 物理安全措施&…

用C++和python混合编写数据采集程序?

之前看过一篇文章&#xff0c;主要阐述的就是多种语言混合编写爬虫程序&#xff0c;结合各种语言自身优势写一个爬虫代码是否行得通&#xff1f;觉得挺有意思的&#xff0c;带着这样的问题&#xff0c;我尝试着利用我毕生所学写了一段C和python混合爬虫程序&#xff0c;目前运行…

对于Windows就是找不到 环境变量 的解决

我认为将“我的电脑”从桌面上隐藏掉纯粹是傻逼行为 说下解决办法&#xff1a; 1. 找到文件资源管理器&#xff0c; 2. 右键点击“此电脑” -- 选择属性&#xff1a; 3. 进入属性界面&#xff0c;应该进入的是“关于”界面&#xff1a;选择“高级系统设置”&#xff1a; 4. 终…

ssm+vue的罪犯信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的罪犯信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

STM32---MDK工程创建

本节我们带领大家学习如何新建一个寄存器库版本MDK的详细步骤&#xff1b; 由于51单片机的学习时&#xff0c;所涉及的寄存器很少&#xff0c;所以往往几个头文件、驱动文件就可以完成相关的功能&#xff0c;但是对于STM32来讲&#xff0c;涉及的寄存器、头文件等都很多&#…

导入seaborn的数据集方法load_datasets的问题

sns.load_dataset使用报错解决URLError: &#xff1c;urlopen error [Errno 11004] getaddrinfo failed&#xff1e;&#xff08;windows&#xff09;&#xff09; import seaborn as sns import matplotlib.pyplot as plt ​ # 使用Seaborn自带的数据集 tips sns.load_datas…

Filebeat使用指南

Filebeat介绍主要优势主要功能配置日志的解析Kibana中设置日志解析安装步骤安装Filebeat安装监控通过prometheus监控 Filebeat和Logstash的主要区别 Filebeat介绍 Filebeat是使用Golang实现的轻量型日志采集器&#xff0c;也是Elasticsearch stack的一员。它可以作为一个agent…

CSS BFC特性和应用

目录 1&#xff0c;介绍2&#xff0c;BFC布局规则3&#xff0c;创建BFC4&#xff0c;BFC应用1&#xff0c;浮动子元素使父级高度坍塌2&#xff0c;非浮动元素被浮动元素覆盖3&#xff0c;margin 合并1&#xff0c;父子 margin 合并&#xff1a;父级和第1个/最后1个子元素2&…

深度学习之基于Django文本情感分析识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在文本情感分析领域的应用已经取得了显著的进展。Django是一个流行的Python Web框架&#xff0c;它可以帮助…

代码随想录算法训练营第39天| 62.不同路径 63. 不同路径 II

JAVA代码编写 62.不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不…

灰度发布专题---3、Nginx+Lua灰度发布

上一章已经讲解了配置文件灰度发布、应用版本灰度发布、API网关灰度发布实现&#xff0c;但如果用户这时候在代理层如何做灰度发布呢&#xff1f; 代理层灰度发布分析 用户无论访问应用服务还是静态页&#xff0c;都要经过Nginx代理层&#xff0c;我们可以在Nginx这里做灰度发…

SeaTunnel扩展Source插件,自定义connector-webservice

代码结构 在seatunnel-connectors-v2中新建connector-webservice模块&#xff0c;可以直接赋值connector-http-base模块&#xff0c;webservice和http的方式比较类似&#xff0c;有些类直接复制了http中的代码。 核心类有WebserviceConfig&#xff0c;WebserviceParameter&am…

【上海大学数字逻辑实验报告】三、组合电路(二)

一、实验目的 掌握8421码到余3码的转换。掌握2421码到格雷码的转换。进一步熟悉组合电路的分析和设计方法。学会使用Quartus II设计8421码到余3码的转换电路逻辑图。学会使用Quartus II设计2421码到格雷码的转换电路逻辑图。 二、实验原理 8421码是最常用的BCD码&#xff0c…

TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析

TOP-K问题 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题&#xff0c;能想到的最简单直接的方式就是排序&#xff0c;但是…

【程序设计】简易生产者、消费者模型

需求&#xff1a; 创建消息队列时需要指定队列的容量上限&#xff0c;队列中没有消息时&#xff0c;消费者从队列中take元素会阻塞&#xff1b;队列中的消息数量达到容量上限时&#xff0c;生产者往队列中put元素会阻塞。要保证线程安全。 组成&#xff1a; &#xff08;1&…

【NeurIPS 2023】PromptIR: Prompting for All-in-One Blind Image Restoration

PromptIR: Prompting for All-in-One Blind Image Restoration&#xff0c; NeurIPS 2023 论文&#xff1a;https://arxiv.org/abs/2306.13090 代码&#xff1a;https://github.com/va1shn9v/promptir 解读&#xff1a;即插即用系列 | PromptIR&#xff1a;MBZUAI提出一种基…

文件操作--IO

目录 ♫什么是文件 ♫文件路径 ♫文件类型 ♫文件的管理 ♪File的构造方法 ♪File的常用方法 ♫文件的内容操作 ♪InputStream ♪OutputStream ♪字符流读写文件 ♫Scanner与流对象 ♫什么是文件 文件在计算机里可以指“狭义”的文件&#xff08;指硬盘上的文件和目录&…

c语言详解牛顿迭代法以及求解倒数和平方根

Newtons iteration method 是在实数域和复数域利用切线不断逼近方程根的一种求高次曲线方程的方法&#xff0c;区别于梯度下降法&#xff0c;它是二阶导&#xff0c;收敛速度比较快&#xff0c;对于非凸函数&#xff0c;牛顿法容易受到鞍点或者最大值点的吸引。由于牛顿迭代法是…

产品学习之路(一)

在做好开发的同时&#xff0c;还需要熟悉产品业务逻辑&#xff0c;不能为了功能而做功能&#xff0c;要从产品经理的角度去看待每个需求和客户痛点所在&#xff0c;这样针对产品设计出来的东西自己也有发言权&#xff1b; 目前作为一名前端开发人员&#xff0c;也在自学产品知识…

xxl-job 分布式任务调度框架

文章目录 分布式任务调度XXL-Job 简介XXL-Job 环境搭建XXL-Job (源码说明)配置部署调度中心docker安装 Bean模式任务(方法形式)-入门案例任务详解任务详解-执行器任务详解-基础配置任务详解-调度配置任务详解-基础配置任务详解-阻塞处理策略任务详解-路由策略 路由策略路由策略…