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

Unity之UnityWebRequest

复习UnityWebRequest

  • 介绍
    • 下载文件和上传文件
    • 下载进度和异常
    • 验证文件
    • DownloadHandlerScript

介绍

unity中使用UnityWebRequest来代替所有HTTP请求提供了三种API,UnityWebRequest.Get,UnityWebRequest.Post,UnityWebRequest.Put分别处理GET,POST,PUT请求。UnityWebRequest需要配合协程使用,所有HTTP请求都是异步的,可以方便监听请求结果,默认情况支持HTTPS,如果需要支持HTTP,则需要单独开启,Player Settings中需要Allow downkiads over HTTP。

基本代码如下所示:

IEnumerable Start(){//GET请求UnityWebRequest quest01 = UnityWebRequest.Get("http://www.baidu.com");yield return quest01.SendWebRequest();var data01 = quest01.downloadHandler.text;//POST请求WWWForm form = new WWWForm();form.AddField("", "");UnityWebRequest quest02 = UnityWebRequest.Post("http://www.baidu.com", form);yield return quest02.SendWebRequest();var data02 = quest01.downloadHandler.text;//PUT请求byte[] myData = Encoding.UTF8.GetBytes("Test");UnityWebRequest quest03 = UnityWebRequest.Put("http://www.baidu.com",myData);yield return quest03.SendWebRequest();var data03 = quest03.downloadHandler.text;}

下载文件和上传文件

UnityWebRequest配合DownloadHandler可以处理下载文件,配合一下UploadHandler可以处理上传文件,但是下载文件的类型比较多,Unity又进一步封装,代码如下:

  //下载二进制文件UnityWebRequest request04 = UnityWebRequest.Get("");request04.downloadHandler = new DownloadHandlerFile("");yield return request04.SendWebRequest();byte[] data04 = request04.downloadHandler.data;//下载AB包UnityWebRequest quest05 = UnityWebRequest.Get("");quest05.downloadHandler = new DownloadHandlerAssetBundle("",0);yield return quest05.SendWebRequest();AssetBundle ab = ((DownloadHandlerAssetBundle)quest05.downloadHandler).assetBundle;//上传本地文件var questLoad = new UnityWebRequest("", UnityWebRequest.kHttpVerbPUT);questLoad.uploadHandler = new UploadHandlerFile("");yield return questLoad.SendWebRequest();//           .//           .//           .//           .//           .//           .//           .

下载进度和异常

下载过程中如果下载一个大文件,还需要处理下载异常并并显示下载进度,如下代码所示:

 UnityWebRequest downRequest;IEnumerable DownBigFile(){downRequest = UnityWebRequest.Get("url");downRequest.downloadHandler = new DownloadHandlerFile("");yield return downRequest.SendWebRequest();if (downRequest.result == UnityWebRequest.Result.Success){Debug.Log("下载成功");}else {Debug.Log("下载失败, 错误信息为:" + downRequest.error);}}void Update(){if (downRequest!=null){Debug.Log("下载进度为:" + downRequest.downloadProgress + "  已下载大小为:" + downRequest.downloadedBytes);}}

验证文件

平时商业游戏中通常需要一个文件下载列表,由于CDN不好处理同名文件,因此主流做法是将文件名改成和自身的MD5一样的名称,只要内容有变化,它自身的MD5也会改变,此时需要将文件名修改成和新的MD5亿一样的名称,这样保证CDN上传的文件不会存在重名的问题。
文件下载需要考虑文件完整性,通常是在上传前将文件MD5和文件大小保存起来,用户下载完成后需要检查当前的下载大小和MD5是否与CDN上的一致,由于设备获取MD5比较慢,通常只会保存文件大小,如果下载前后出现不一致,需要将本地文件删除,重新下载。

DownloadHandlerScript

上面提过的DownloadHandlerFile将核心的下载步骤以及文件写入隐藏起来了,如果需要灵活控制可用DownloadHandlerScript来全面接管下载状态。如下代码所示:

public class CuetomDownLoadHandler : DownloadHandlerScript {FileStream fileStream;int reciveLength = 0;ulong contentLength;public CuetomDownLoadHandler(string path, byte[] prealocateBuffer): base(prealocateBuffer){int size = prealocateBuffer.Length;fileStream = new FileStream(path, FileMode.OpenOrCreate,FileAccess.Write,FileShare.Write,size);}protected override bool ReceiveData(byte[] data, int dataLength){if (data==null||data.Length<1){return false;}reciveLength += dataLength;fileStream.Write(data, 0, dataLength);return base.ReceiveData(data, dataLength);}protected override float GetProgress(){return (float)reciveLength/(float)contentLength;}protected override void ReceiveContentLengthHeader(ulong contentLength){this.contentLength = Math.Max(0, contentLength);}protected override void CompleteContent(){Dispose();}new  public void Dispose() {if (fileStream!=null){fileStream.Dispose();fileStream = null;}base.Dispose();}

只需将DownloadHandlerFile代码替换上述CuetomDownLoadHandler就可以了


目前总结这么多,如果错误,欢迎指正!!!

Passion!!!

相关文章:

Unity之UnityWebRequest

复习UnityWebRequest 介绍下载文件和上传文件下载进度和异常验证文件DownloadHandlerScript 介绍 unity中使用UnityWebRequest来代替所有HTTP请求提供了三种API,UnityWebRequest.Get&#xff0c;UnityWebRequest.Post&#xff0c;UnityWebRequest.Put分别处理GET,POST,PUT请求…...

使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择

使用 pkg 打包 Puppeteer 应用 pkg 是一个非常强大的工具&#xff0c;它允许你将 Node.js 项目打包成独立的可执行文件&#xff0c;这意味着你可以在没有安装 Node.js 环境的设备上运行该应用。这对于希望分发不暴露源代码的应用程序、创建跨平台的快速演示版本或简化部署流程…...

【Flask】三、Flask 常见项目架构

目录 前言 简单项目结构 中型项目结构 复杂项目结构 前言 Flask是一个轻量级的Web应用框架&#xff0c;它被广泛用于快速开发简单的网站和复杂的大型应用。随着项目规模的增长&#xff0c;合理的项目架构变得尤为重要。这里探讨Flask项目中的三种常见架构&…...

AI机西使用体验:你不知道的强大功能揭秘!

AI机西有人用过吗&#xff1f;用户体验和功能详解 最近我听说了很多关于AI机西的讨论&#xff0c;很多人都在问&#xff1a;这款工具好用吗&#xff1f;有没有人用过&#xff1f;今天我就从我的使用体验出发&#xff0c;给大家分享一下AI机西的功能和我的感受。 1. 绘画功能&a…...

什么是护网(HVV)需要什么技术?(内附护网超全资料包)

文章目录 一、什么是护网行动&#xff1f;二、护网分类三、护网的时间四、护网的影响五、护网的规则六、什么是红队&#xff1f; 6.1、红队测试的意义 七、什么是蓝队 一、什么是护网行动&#xff1f; 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的…...

opencv优秀文章集合

文章目录 一、 CV领域1.1 图像处理1.2 目标检测与识别1.3 图像分割、目标追踪1.4 姿态估计1.5 3D视觉1.6 图像生成1.7 机器视觉1.8 其它 二、 nlp三、语音四、推荐系统 《OpenCV优秀文章集合》《OpenCV系列课程一&#xff1a;图像处理入门&#xff08;读写、拆分合并、变换、注…...

php处理文件上传的五种方式

dd($_FILES); //方式一 if(!empty($_FILES[file])){ //获取文件后缀方式一 //strrchr()函数查找字符在指定字符串中从右面开始的第一次出现的位置&#xff0c; //如果成功&#xff0c;返回该字符以及其后面的字符&#xf…...

C#与C++交互开发系列(十一):委托和函数指针传递

前言 在C#与C的互操作中&#xff0c;委托&#xff08;delegate&#xff09;和函数指针的传递是一个复杂但非常强大的功能。这可以实现从C回调C#方法&#xff0c;或者在C#中调用C函数指针的能力。无论是跨语言调用回调函数&#xff0c;还是在多线程、异步任务中使用委托&#x…...

【window】补充一些powershell基本命令

刚才说了一下如何用powershell管理&#xff0c;下边是一些常见的 PowerShell 命令及其参数的示例&#xff0c;补充给大家&#xff1a; 1. 获取帮助 Get-Help&#xff1a;获取命令的帮助信息。 Get-Help Get-Process Get-Help Get-Process -Examples Get-Help Get-Process -Fu…...

精准触达用户,私域三步法!

发现没&#xff1f;现在很多人都开始利用私域来增加潜在的客户&#xff0c;维护现有客户。而在私域管理中&#xff0c;精准触达用户是非常重要的一环。 接下来&#xff0c;就和大家聊聊私域精准触达用户的三个方法&#xff0c;让你可以实现精准营销。 1、数据分析与用户画像构…...

Tcl脚本介绍(一)

芯冰乐知识星球入口:芯冰乐 TCL就是Tool Command Language的简称,广泛应用在各大eda工具中。 EDA工具能够高度自动化的运行得益于TCL。 用户在编写完相关的tcl脚本后,让eda工具自动运行,便能够很大程度地解放双手了。 其实,网络上介绍TCL脚本的课程层出不穷了。应很多粉…...

安全运营 -- 监控linux命令history

0x00 背景 最近&#xff0c;有个IT的同事给我提了一个需求&#xff0c;说想监控/root/.ssh/ 文件夹下的文件变动&#xff0c;于是我灵机一动&#xff0c;这个需求只要对执行过的历史命令做审计就可以了。 0x01 实践 我实现这个功能使用 rsyslog 和 firewalld 两个组件。 我的…...

MyBatis3(动态SQL 常用的动态SQL 元素 映射器注解 基本注解 结果映射注解)

动态SQL 什么是MyBatis的动态SQL&#xff1f; **定义&#xff1a;**根据不同的条件拼接SQL语句&#xff0c;实现对数据库更准确的操作&#xff1b; **实现&#xff1a;**映射器配置文件或者注解 常用的动态SQL元素 if 元素&#xff1a;判断语句&#xff0c;单条件分 支判断…...

C#自定义事件的案例

方法一&#xff0c;详细的声明 namespace HelloWorldConsole {internal class Program{static void Main(string[] args){Customer customer new Customer();Waiter waiter new Waiter();customer.Order waiter.Action;customer.Action();}}public class OrderEventArgs : …...

flume系列之:flume机器做条带划分提高磁盘性能和吞吐量的详细步骤

flume系列之:flume机器做条带划分提高磁盘性能和吞吐量的详细步骤 磁盘条带划分新磁盘直接条带划分步骤有数据的磁盘做条带划分步骤磁盘条带划分 磁盘条带划分是将一个文件或数据块分散存储在多个物理磁盘上的技术。它可以提高磁盘的性能和吞吐量。以下是磁盘做了条带划分后可…...

C++基于opencv的视频质量检测--图像清晰度检测

文章目录 0.引言1. 原始算法实现2. 优化思路3. 优化后的代码4. 代码详细解读 0.引言 视频质量图像清晰度检测已在C基于opencv4的视频质量检测中有所介绍&#xff0c;本文将详细介绍其优化版本。 1. 原始算法实现 原始代码&#xff1a; double sharpnessDetect(const cv::Ma…...

力扣11.1

2518. 好分区的数目 给你一个正整数数组 nums 和一个整数 k 。 分区 的定义是&#xff1a;将数组划分成两个有序的 组 &#xff0c;并满足每个元素 恰好 存在于 某一个 组中。如果分区中每个组的元素和都大于等于 k &#xff0c;则认为分区是一个好分区。 返回 不同 的好分区…...

打印室预约系统|基于java和小程序的打印室预约系统设计与实现(源码+数据库+文档)

打印室预约系统 目录 基于java和小程序的打印室预约系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#x…...

操作系统-多线程案例

一、单例模式&#xff08;是一种设计模式&#xff09; 设计模式有很多种&#xff0c;不同的语法中也有不同的设计模式 单例 单个实例&#xff08;对象) 某个类&#xff0c;在一个进程中&#xff0c;只应该创建出一个实例&#xff0c;&#xff08;原则上不该有多个&#xff…...

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法&#xff0c;主要如下&#xff1a; 数据组织&#xff1a;文件系统将数据组织成文件和目录&#xff0c;使用户能够更方便地管理和查找文件。每个…...

DocHub文库系统完整指南:10分钟快速搭建百度文库式开源平台

DocHub文库系统完整指南&#xff1a;10分钟快速搭建百度文库式开源平台 【免费下载链接】DocHub 参考百度文库&#xff0c;使用Beego&#xff08;Golang&#xff09;开发的开源文库系统 项目地址: https://gitcode.com/gh_mirrors/do/DocHub &#x1f680; 快速开始&…...

代码随想录 300.最长递增子序列

思路&#xff1a;根据题意得&#xff0c;子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素不改变其余元素的顺序。动规五部曲&#xff1a;1.dp[i]的定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。2.确…...

别再让AI瞎猜了!5个实战案例教你写出让Vibe Coding一次成功的提示词

别再让AI瞎猜了&#xff01;5个实战案例教你写出让Vibe Coding一次成功的提示词 当你在Vibe Coding平台上输入一串提示词&#xff0c;满心期待地按下生成按钮&#xff0c;结果却得到一个与你想象中完全不同的产物——这种经历相信很多开发者都不陌生。为什么AI总是"误解&q…...

springcloud项目如何禁用三方依赖的拦截器

背景&#xff1a; 原始代码中有一个自定义的通用依赖&#xff0c;这个依赖中有很多通用方法和拦截器供整个系统使用。 需求&#xff1a; 禁用其中一个拦截器&#xff0c;保留其他方法和拦截器&#xff0c;过滤器等。 拦截器介绍 原有拦截器&#xff0c;自己封装了一个jdk&#…...

SIM4LIFE Light保姆级教程:手把手搞定第一个人体SAR值仿真(附FDTD模块避坑指南)

SIM4LIFE Light保姆级教程&#xff1a;手把手搞定第一个人体SAR值仿真&#xff08;附FDTD模块避坑指南&#xff09; 电磁场仿真在生物医学工程领域扮演着越来越重要的角色&#xff0c;而SIM4LIFE Light作为一款专为人体组织电磁特性研究设计的仿真软件&#xff0c;凭借其内置的…...

REPENTOGON全面安装指南:深度解锁以撒结合脚本扩展器功能

REPENTOGON全面安装指南&#xff1a;深度解锁以撒结合脚本扩展器功能 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON 想要为《以撒的结合&#xff1a;悔改》带来革命性的游…...

避开Psins惯导仿真中的那些“坑”:ethupdate参数传递与setdiag内存操作详解

避开Psins惯导仿真中的那些“坑”&#xff1a;ethupdate参数传递与setdiag内存操作详解 在惯性导航系统&#xff08;SINS&#xff09;仿真中&#xff0c;Psins工具箱因其高效性和灵活性备受开发者青睐。然而&#xff0c;即便是经验丰富的工程师&#xff0c;也常在一些看似简单的…...

如何在5分钟内构建你的专业在线演示文稿:PPTist完全指南

如何在5分钟内构建你的专业在线演示文稿&#xff1a;PPTist完全指南 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing …...

基于支持向量机SVM预测飞机延误率的Python项目

数据挖掘项目-基于支持向量机svm预测飞机延误率&#xff08;python&#xff09; 关键技术&#xff1a;支持向量机SVMKNN 包含内容&#xff1a;数据集代码文档 &#xff08;字数8436&#xff09; 引言 飞机延误是航空运输中常见的问题。航班延误不仅影响乘客的出行体验&#x…...

PX4飞控Telem2接口详解:除了连树莓派,还能怎么玩?(附QGC参数配置清单)

PX4飞控Telem2接口的进阶玩法&#xff1a;解锁隐藏功能的6种实战方案 在无人机开发领域&#xff0c;Pixhawk飞控的Telem2接口常被简单当作连接树莓派或Jetson的通信通道。但当我第一次测量到这个接口的VCC引脚居然能稳定输出5V/500mA时&#xff0c;一个大胆的想法浮现&#xff…...