当前位置: 首页 > news >正文

Unity网络请求队列

引子

最近的一个项目中由于某个需求,需要多次请求后台接口数据,就自己封装了一下网络请求的队列;刚刚好给大家分享一下,互相交流学习

简述

Unity 的网络请求队列是由 UnityWebRequestQueue 类实现的。这个类继承自 MonoBehaviour 类,可以在 Unity 的场景中创建一个 GameObject,并将 UnityWebRequestQueue 挂载到这个 GameObject 上,就可以在该场景中使用了。

Unity的WebRequest模块将网络请求封装成了一个队列,按照发送请求的先后顺序进行处理。当一个请求被添加到队列中后,WebRequest会判断当前是否有正在进行的请求,如果有,则将请求添加到等待队列中,等待正在进行的请求结束后再发送。如果没有正在进行的请求,则直接发送请求。当一个请求结束后,WebRequest会从等待队列中取出下一个请求进行发送。

GET 请求队列

GET 请求队列的核心代码如下:

public class GetRequestQueue : MonoBehaviour
{private Queue<UnityWebRequest> webRequestQueue = new Queue<UnityWebRequest>();void Update(){if (webRequestQueue.Count > 0){UnityWebRequest webRequest = webRequestQueue.Peek();if (webRequest.isDone){string responseText = webRequest.downloadHandler.text;Debug.Log(responseText);webRequestQueue.Dequeue();}else if (webRequest.isHttpError || webRequest.isNetworkError){Debug.Log(webRequest.error);webRequestQueue.Dequeue();}}}public void AddRequest(string url){UnityWebRequest webRequest = UnityWebRequest.Get(url);webRequestQueue.Enqueue(webRequest);StartCoroutine(webRequest.SendWebRequest());}
}

这个类定义了一个 Queue 对象 webRequestQueue 来缓存所有 GET 请求。在 Update 方法中,每次检查队列是否有请求,如果有请求,就取出队列中的第一个请求,并启动协程将这个请求发送出去。如果请求完成,则将请求从队列中删除,否则如果请求出错也将请求从队列中删除。

你可以将 AddRequest 方法暴露在其他类中,用于向 GET 请求队列中添加请求。如下所示:

public class GetRequestDemo : MonoBehaviour
{public string url = "http://localhost:8080/get";private GetRequestQueue getRequestQueue;void Start(){getRequestQueue = GameObject.Find("GetRequestQueue").GetComponent<GetRequestQueue>();}void OnGUI(){if (GUI.Button(new Rect(10, 10, 100, 50), "Send GET Request")){getRequestQueue.AddRequest(url);}}
}

在这个例子中,我们定义了一个 GET 请求的 Demo 类,当用户点击按钮时,调用 AddRequest 方法将请求添加到队列中。

POST请求队列

POST 请求队列的实现与 GET 请求队列类似,主要区别在于我们需要为 POST 请求添加请求体。下面是 POST 请求队列的实现代码:

public class PostRequestQueue : MonoBehaviour
{private Queue<UnityWebRequest> webRequestQueue = new Queue<UnityWebRequest>();void Update(){if (webRequestQueue.Count > 0){UnityWebRequest webRequest = webRequestQueue.Peek();if (webRequest.isDone){string responseText = webRequest.downloadHandler.text;Debug.Log(responseText);webRequestQueue.Dequeue();}else if (webRequest.isHttpError || webRequest.isNetworkError){Debug.Log(webRequest.error);webRequestQueue.Dequeue();}}}public void AddRequest(string url, string requestBody){UnityWebRequest webRequest = UnityWebRequest.Post(url, requestBody);webRequestQueue.Enqueue(webRequest);StartCoroutine(webRequest.SendWebRequest());}
}

这个类定义了一个 Queue 对象 webRequestQueue 来缓存所有 POST 请求。在 AddRequest 方法中,我们使用 UnityWebRequest.Post 方法创建一个 POST 请求,并将请求体 requestBody 传递给该方法。

同样的,你可以将 AddRequest 方法暴露在其他类中,用于向 POST 请求队列中添加请求。如下所示:

public class PostRequestDemo : MonoBehaviour
{public string url = "http://localhost:8080/post";public string requestBody = "{\"key\": \"value\"}";private PostRequestQueue postRequestQueue;void Start(){postRequestQueue = GameObject.Find("PostRequestQueue").GetComponent<PostRequestQueue>();}void OnGUI(){if (GUI.Button(new Rect(10, 10, 100, 50), "Send POST Request")){postRequestQueue.AddRequest(url, requestBody);}}
}

在这个例子中,我们定义了一个 POST 请求的 Demo 类,当用户点击按钮时,调用 AddRequest 方法将请求添加到队列中,并将请求体 requestBody 传递给 AddRequest 方法。

注意

在队列中,WebRequest支持设置最大并发数,即同时能进行的最大请求数。当队列中的请求数达到最大并发数时,新的请求会被添加到等待队列中,直到有请求结束后再进行发送。这样可以保证不会过度的进行网络请求,避免出现网络拥堵等问题。

Unity的WebRequest模块的网络请求队列原理就是将请求封装成队列,并按照先进先出的原则进行处理,支持设置最大并发数,保证并发请求的数量不会过度,避免出现网络拥堵等问题。

相关文章:

Unity网络请求队列

引子 最近的一个项目中由于某个需求&#xff0c;需要多次请求后台接口数据&#xff0c;就自己封装了一下网络请求的队列&#xff1b;刚刚好给大家分享一下&#xff0c;互相交流学习 简述 Unity 的网络请求队列是由 UnityWebRequestQueue 类实现的。这个类继承自 MonoBehaviou…...

【Spring Boot】使用XML配置文件实现数据库操作(一)

使用XML配置文件实现数据库操作&#xff08;一&#xff09; 1.SQL映射文件 SQL映射文件就是我们通常说的mapper.xml配置文件&#xff0c;主要实现SQL语句的配置和映射&#xff0c;同时实现Java的POJO对象与数据库中的表和字段进行映射关联的功能。 1.1 mapper.xml的结构 下…...

PMP中常用英文术语

常用术语&#xff08;五&#xff09; Project 项目 为完成一个唯一的产品或服务的一种一次性努力。 Project Charter 项目许可证 由高级管理部门提供的一个文档&#xff0c;它给项目经理特权把组织的资源应用到项目工作中。 Project Communication Management 项目沟通管理 项目…...

【Apollo学习笔记】——规划模块TASK之SPEED_BOUNDS_PRIORI_DECIDERSPEED_BOUNDS_FINAL_DECIDER

文章目录 前言SPEED_BOUNDS_PRIORI_DECIDER功能简介SPEED_BOUNDS_FINAL_DECIDER功能简介SPEED_BOUNDS_PRIORI_DECIDER相关配置SPEED_BOUNDS_FINAL_DECIDER相关配置SPEED_BOUNDS_DECIDER流程将障碍物映射到ST图中ComputeSTBoundary(PathDecision* path_decision)ComputeSTBounda…...

score_inverse_problems运行环境,pycharm重新安装,jax,jaxlib的GPU版本安装-230831

尝试运行https://github.com/yang-song/score_inverse_problems pycharm2019不支持python3.10&#xff0c;其实后来我用来3.8…… pycharm2022.3.3的安装&#xff0c;涉及激活&#xff08;淘宝5元&#xff09;&#xff0c;搜狗拼音输入&#xff08;shift不能切换输入法&#x…...

VSC++: 奇怪的风吹

void 奇怪的风吹() {//缘由https://ask.csdn.net/questions/1062454int aa[]{15, 30, 12, 36, 11, 20, 19, 17, 16, 18, 38, 15, 30, 12, 36, 11, 20, 19, 17, 16, 18, 38, -1},j 0, a 0, y 0, z 0;while (aa[j] > 0){if (j && aa[j] > 35 || aa[j] < 15)…...

被动操作系统指纹识别的强大功能可实现准确的物联网设备识别

到 2030 年&#xff0c;企业网络和互联网上的物联网设备数量预计将达到290 亿。这种指数级增长无意中增加了攻击面。 每个互连设备都可能为网络攻击和安全漏洞创造新的途径。Mirai 僵尸网络通过使用数千个易受攻击的 IoT 设备对关键互联网基础设施和热门网站发起大规模 DDoS 攻…...

QT/C++获取电脑系统,主板型号,CPU型号,硬盘型号,内存大小等相关信息(二)通过Windows Server (WMI)查询

Qt/C调用windows Api库通过wmi的方式查询电脑能获取更多详细信息&#xff0c;也更加合理有技术性。 建议使用MSCV编译器&#xff0c;如MSCV 2017 ,Qt版本 : 5.13.1 目录导读 关于 WMI示例&#xff1a;创建 WMI 应用程序示例&#xff1a;打印Wmi执行的查询项的所有属性头文件引用…...

自建音乐服务器Navidrome之一

这里写自定义目录标题 1.1 官方网站 2. Navidrome 简介2.1 简介2.2 特性 3. 准备工作4. 视频教程5. 界面演示5.1 初始化页5.2 专辑页 前言 之前给大家介绍过 Koel 音频流服务&#xff0c;就是为了解决大家的这个问题&#xff1a;下载下来的音乐&#xff0c;只能在本机欣赏&…...

ACL 访问控制 过滤数据 维护网络安全(第七课)

一 ACL 简介 ACL是Access Control List(访问控制列表)的缩写,是一种用于控制文件、目录、网络设备等资源访问权限的方法。ACL可以对每个用户或用户组设置不同的访问权,即在访问控制清单中为每个用户或用户组指定允许或禁止访问该资源的权限。它通常由一系列规则组成,规则…...

3D视觉测量:面对面的对称度 点对(附源码)

文章目录 0. 测试效果1. 基本内容2. 3D视觉测量对称度测量思路3. 代码实现4. 参考文章目录:3D视觉测量目录微信:dhlddxB站: Non-Stop_目标:通过3D视觉方法计算面对面的对称度0. 测试效果 数据说明:此测试点云是通过UG建模,Meshlab降采样得到,数据比较理想,仅作为测试使用…...

无涯教程-JavaScript - RANK函数

RANK函数取代了Excel 2010中的RANK.EQ函数。 描述 该函数返回数字列表中数字的等级。数字的等级是其相对于列表中其他值的大小。 如果对列表进行排序,则数字的排名将是其位置。 语法 RANK (number,ref,[order])争论 Argument描述Required/OptionalNumberThe number whose…...

蓝牙发展现状

目录 一、产品分类1、Bluetooth经典2、Bluetooth低能耗(LE)3、二者差异 二、出货量三、未来需要加强的方向四、技术行业细分五、学习资料1、蓝牙官网2、大神博客——于忠军 一、产品分类 1、Bluetooth经典 Bluetooth Classic无线电&#xff0c;也被称为Bluetooth 基本速率/增强…...

排序算法问题

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 代码如下&#xff1a; 1.插入排序(简…...

PlotlyJs 指定画布的宽度并页面居中

可以通过CSS样式来实现指定画布的宽度并使其在页面居中。具体方法如下&#xff1a; 在HTML文件中定义一个div&#xff0c;用来包含PlotlyJs画布。如下所示&#xff1a; <div id"plotly-div"></div>在CSS样式中指定该div的宽度和居中方式。如下所示&…...

java基础-----第八篇

系列文章目录 文章目录 系列文章目录一、Java类加载器二、双亲委托模型 一、Java类加载器 JDK自带有三个类加载器&#xff1a;bootstrap ClassLoader、ExtClassLoader、AppClassLoader。 BootStrapClassLoader是ExtClassLoader的父类加载器&#xff0c;默认负责加载%JAVA_HOME…...

【Java 基础篇】StringBuilder的魔力:Java字符串处理探究

在Java编程中&#xff0c;字符串是一个常见的数据类型&#xff0c;用于存储文本信息。然而&#xff0c;与字符串相关的操作可能会导致性能问题&#xff0c;因为字符串是不可变的&#xff0c;每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题&#xff0c;Java…...

Shell 编程技巧:批量转换Markdown文件

由于一些原因&#xff0c;需要将以前编写的所有markdown文件转成docx文件&#xff0c;以便做一个备份&#xff0c;特别是原文档中引用的图片需要嵌入docx文件&#xff0c;作本地化保存。先上脚本吧&#xff1a; sudo yum -y install pandoc # set new line char as IFS IFS$\…...

EasyAVFilter的初衷:把ffmpeg.c当做SDK来用,而不是当做EXE来用

之前我们做一个视频点播的功能&#xff0c;大概的流程就是将上传上来的各种格式的视频&#xff0c;用FFmpeg统一进行一次转码&#xff0c;如果probe到视频的编码格式是H.264就调用-vcodec copy&#xff0c;如果probe到视频的编码格式不是H.264就调用-vcodec libx264&#xff0c…...

内存管理之:内存空间分布和栈攻击(黑客常用攻击手段)

目录 C语言内存管理及栈攻击 内存管理 Linux虚拟内存空间分布&#xff08;重要&#xff09; 栈溢出&#xff08;栈攻击&#xff09; 堆栈的特点 栈攻击 栈攻击的实现 原理 编译器选项 实现案例 linux修改栈空间大小方式 内存泄漏 如何避免野指针&#xff1f; 如何…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...