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,一经查实,立即删除!

相关文章

C++-火车编组

Description 货运火车要在编组站根据挂常车厢到达目的地重新分组。 如果一列火车有4节车厢&#xff0c;经过编组后&#xff0c;车厢的编组顺序为3,2,4,1,你知道编组站是怎么编组的吗? 小明到编组站参观后发现编组站的铁路有很多岔道&#xff0c;火车在岔道上来来回回地开动…

Linux随记(七)

一、欧拉bclinux 21.10安装zabbix-5.0.37.tar.gz &#xff08;zbx-客户端&#xff09; #系统环境&#xff1a; BigCloud Enterprise Linux For Euler 21.10 LTS #软件信息&#xff1a; zabbix-5.0.37.tar.gz &#xff0c; pcre-devel-8.44-2.oe1.x86_64.rpm &#xff0c; inst…

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…

nodejs使用node-cron实现定时任务功能

ChatGPT国内站点&#xff1a;海鲸AI 在Node.js中&#xff0c;node-cron是一个轻量级的任务调度库&#xff0c;它允许你根据类似于Cron的时间表来安排任务的执行。如果你想要每十分钟执行一次任务&#xff0c;你可以按照以下步骤来设置&#xff1a; 安装node-cron&#xff1a; 如…

Filebeat使用指南

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

Kubernetes 使用插件扩展 kubectl

例子演示 编写 kubectl-foo &#xff0c;拷贝至 /usr/local/bin/ #!/bin/bash# 可选的参数处理 if [[ "$1" "version" ]] thenecho "1.0.0"exit 0 fi# 可选的参数处理 if [[ "$1" "config" ]] thenecho $KUBECONFIGexit…

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;。 问总共有多少条不…

Linux常用命令汇总

文章目录 Linux系统命令内存相关文件相关 GitGit常用的shell脚本 整理如下&#xff0c;随时补充更新&#xff1a; Linux系统命令 内存相关 # 查看内存占用最高的进程 ps aux --sort-%mem | head ps aux --sort-%cpu | headtop&#xff0c;按照M按照内存排序&#xff0c;按下…

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

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

JWT和Session的区别

目录 1. 存储位置 2. 扩展性和分布式系统 3. 安全性 4. 携带方式 当涉及用户身份验证和授权时&#xff0c;JSON Web Token&#xff08;JWT&#xff09;和会话&#xff08;Session&#xff09;是两种常见的解决方案。它们有着不同的工作原理和特点。 一、JWT是一种开放标准…

python 实现一个简单的计算器

python 实现一个简单的计算器 本文主要整合下tkinter ,实现下简单的计算器. 代码如下: #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/12/2 下午13:01 .Email:Describe: """ import tkinter as tk# 创建计算器窗口 ro…

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…