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

[游戏开发][Unity]UnityWebRequest使用大全

首先记录个小问题

使用new UnityWebRequest的方式,最终的downloadHandler是个null

使用UnityWebRequest.Get的方式,最终的downloadHandler会是DownloadHandlerBuffer

从网站或本地下载内容,包括文本或二进制数据

IEnumerator downloadfile(string path)
{UnityWebRequest uwr = UnityWebRequest.Get(path);yield return uwr.SendWebRequest();if (uwr.result == UnityWebRequest.Result.Success){//加载文本Debug.Log("Success " + uwr.downloadHandler.text);//加载二进制数据//Debug.Log("Success " + uwr.downloadHandler.data);}elseDebug.LogError(uwr.error);
}

从网站或本地下载贴图

IEnumerator downloadfile(string path)
{UnityWebRequest uwr = UnityWebRequest.Get(path);yield return uwr.SendWebRequest();if (uwr.result == UnityWebRequest.Result.Success){//加载贴图Texture2D tex2D = DownloadHandlerTexture.GetContent(uwr);}elseDebug.LogError(uwr.error);
}

从网站或本地下载Assetbundle

IEnumerator downloadfile(string path)
{UnityWebRequest uwr = UnityWebRequest.Get(path);yield return uwr.SendWebRequest();if (uwr.result == UnityWebRequest.Result.Success){//加载ABAssetBundle ab = DownloadHandlerAssetBundle.GetContent(uwr)}elseDebug.LogError(uwr.error);
}

将表单发送到 http 服务器 (post)

IEnumerator downloadfile(string path)
{List<IMultipartFormSection> form = new List<IMultipartFormSection>();form.Add(new MultipartFormDataSection("fileld1=A&field2=B"));form.Add(new MultipartFormFileSection("data", "file.txt"));UnityWebRequest uwr = UnityWebRequest.Post(path,form);yield return uwr.SendWebRequest();if (uwr.result == UnityWebRequest.Result.Success)Debug.Log("Success " + uwr.downloadHandler.text);elseDebug.LogError(uwr.error);
}

将原始数据上传到 http 服务器 (put)

 IEnumerator Upload()
{byte[] myData = System.Text.Encoding.UTF8.GetBytes("Chinar的测试数据");using (UnityWebRequest uwr = UnityWebRequest.Put("http://www.baidu.com", myData)){yield return uwr.SendWebRequest();if (uwr.result == UnityWebRequest.Result.Success)Debug.Log("Success " + uwr.downloadHandler.text);elseDebug.LogError(uwr.error);}
}

四、案例

一、断点续传

记录已经下载到的本地文件大小,向资源服务器发送请求时,通过请求头实现拿到剩下需要下载的内容,然后接着下载

确保对同一个资源文件的下载操作,就不存在资源会下载错误的情况,如果你在断点续传的阶段发现资源服务器上的资源已经更新,那就得删除之前下载的文件然后重新下载。

using System;
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;public class ChinarBreakpointRenewal : MonoBehaviour
{private bool _isStop;           //是否暂停public Slider ProgressBar;      //进度条public Text SliderValue;        //滑动条值public Button startBtn;        //开始按钮public Button pauseBtn;        //暂停按钮string Url = "https://downsc.chinaz.net/Files/DownLoad/sound1/201808/10447.wav";/// <summary>/// 初始化UI界面及给按钮绑定方法/// </summary>void Start(){//初始化进度条和文本框ProgressBar.value = 0;SliderValue.text = "0.0%";//开始、暂停按钮事件监听startBtn.onClick.AddListener(OnClickStartDownload);pauseBtn.onClick.AddListener(OnClickStop);}//开始下载按钮监听事件public void OnClickStartDownload(){//开启协程 *注意真机上要用Application.persistentDataPath路径*StartCoroutine(DownloadFile(Url, Application.streamingAssetsPath + "/MP4/test.mp4", CallBack));}/// <summary>/// 协程:下载文件/// </summary>/// <param name="url">请求的Web地址</param>/// <param name="filePath">文件保存路径</param>/// <param name="callBack">下载完成的回调函数</param>/// <returns></returns>IEnumerator DownloadFile(string url, string filePath, Action callBack){UnityWebRequest huwr = UnityWebRequest.Head(url); //使用Head方法可以获取到文件的全部长度yield return huwr.SendWebRequest();//发送信息请求//判断请求或系统是否出错if (huwr.isNetworkError || huwr.isHttpError) {Debug.Log(huwr.error); //出现错误 输出错误信息}else{long totalLength = long.Parse(huwr.GetResponseHeader("Content-Length")); //首先拿到文件的全部长度string dirPath = Path.GetDirectoryName(filePath);//获取文件的上一级目录if (!Directory.Exists(dirPath)) //判断路径是否存在{Directory.CreateDirectory(dirPath);//不存在创建}/*作用:创建一个文件流,指定路径为filePath,模式为打开或创建,访问为写入* 使用using(){}方法原因: 当同一个cs引用了不同的命名空间,但这些命名控件都包括了一个相同名字的类型的时候,可以使用using关键字来创建别名,这样会使代码更简洁。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的* using(类){} 括号中的类必须是继承了IDisposable接口才能使用否则报错* 这里没有出现不同命名空间出现相同名字的类属性可以不用using(){}*/using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write)){long nowFileLength = fs.Length; //当前文件长度,断点前已经下载的文件长度。Debug.Log(fs.Length);//判断当前文件是否小于要下载文件的长度,即文件是否下载完成if (nowFileLength < totalLength){Debug.Log("还没下载完成");/*使用Seek方法 可以随机读写文件* Seek()  ----------有两个参数 第一参数规定文件指针以字节为单位移动的距离。第二个参数规定开始计算的位置* 第二个参数SeekOrigin 有三个值:Begin  Current   End* fs.Seek(8,SeekOrigin.Begin);表示 将文件指针从开头位置移动到文件的第8个字节* fs.Seek(8,SeekOrigin.Current);表示 将文件指针从当前位置移动到文件的第8个字节* fs.Seek(8,SeekOrigin.End);表示 将文件指针从最后位置移动到文件的第8个字节*/fs.Seek(nowFileLength, SeekOrigin.Begin);  //从开头位置,移动到当前已下载的子节位置UnityWebRequest uwr = UnityWebRequest.Get(url); //创建UnityWebRequest对象,将Url传入uwr.SetRequestHeader("Range", "bytes=" + nowFileLength + "-" + totalLength);//修改请求头从n-m之间uwr.SendWebRequest();                      //开始请求if (uwr.isNetworkError || uwr.isHttpError) //如果出错{Debug.Log(uwr.error); //输出 错误信息}else{long index = 0;     //从该索引处继续下载while (nowFileLength < totalLength) //只要下载没有完成,一直执行此循环{if (_isStop) break;//如果停止跳出循环yield return null;byte[] data = uwr.downloadHandler.data;if (data != null){long length = data.Length - index;fs.Write(data, (int)index, (int)length); //写入文件index += length;nowFileLength += length;ProgressBar.value = (float)nowFileLength / totalLength;SliderValue.text = Math.Floor((float)nowFileLength / totalLength * 100) + "%";if (nowFileLength >= totalLength) //如果下载完成了{ProgressBar.value = 1; //改变Slider的值SliderValue.text = 100 + "%";/*这句话的作用是:如果callBack方法不为空则执行Invoke* 注意:* 1.这里的Invoke可不是Unity的Invoke延迟调用的用法,参考文章:https://blog.csdn.net/liujiejieliu1234/article/details/45312141 从文章中我们可以看到,C#中的Invoke是为了防止winform中子主线程刚开始创建对象时,子线程与主线程并发修改主线程尚未创建的对象属性。* 因为unity这里只有主线程没有用到子线程可以直接写callBack();*/callBack?.Invoke();break;}}}}}}}}/// <summary>/// 下载完成后的回调函数/// </summary>void CallBack(){Debug.Log("下载完成");}/// <summary>/// 暂停下载/// </summary>public void OnClickStop(){if (_isStop){pauseBtn.GetComponentInChildren<Text>().text = "暂停下载";Debug.Log("继续下载");_isStop = !_isStop;OnClickStartDownload();}else{pauseBtn.GetComponentInChildren<Text>().text = "继续下载";Debug.Log("暂停下载");_isStop = !_isStop;}}
}

相关文章:

[游戏开发][Unity]UnityWebRequest使用大全

首先记录个小问题 使用new UnityWebRequest的方式&#xff0c;最终的downloadHandler是个null 使用UnityWebRequest.Get的方式&#xff0c;最终的downloadHandler会是DownloadHandlerBuffer 从网站或本地下载内容&#xff0c;包括文本或二进制数据 IEnumerator downloadfile(st…...

如何使用Fiddler对手机进行弱网测试?(干货教程)

1.首先&#xff0c;fiddler连接手机 1)Tools->Options->Connections->设置端口8888&#xff0c;勾选Allow remote computers to connect 2)配置手机 注&#xff1a;手机和电脑需要在同一局域网下 手机进入网络详情&#xff0c;将代理改为手动 设置主机名、端口 主机…...

专业科普:什么是单片机?

一、什么是单片机 单片机诞生于20世纪70年代末&#xff0c;它是指一个集成在一块芯片上的完整计算机系统。单片机具有一个完整计算机所需要的大部分部件&#xff1a;CPU、内存、内部和外部总线系统&#xff0c;目前大部分还会具有外存。同时集成诸如通讯接口、定时器&#xff…...

深度学习-第T11周——优化器对比实验

深度学习-第T11周——优化器对比实验 深度学习-第T11周——优化器对比实验一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集…...

基于Dlib的疲劳检测系统

需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…...

three.js通过CubeTexture加载环境贴图,和RGBELoader加载器加载hdr环境贴图

一、使用CubeTexture进行环境贴图 1.CubeTexture使用介绍 Three.js中可以通过使用CubeTexture进行环境贴图&#xff0c;CubeTexture需要将6张图片&#xff08;正面、反面、上下左右&#xff09;包装成一个立方体纹理。下面是一个简单的例子&#xff1a; 首先需要加载六张贴图…...

pycharm中Terminal输入sqlite3,出现无法将sqlite项识别为cmdlet**的解决方法

前提&#xff1a;本机上已安装sqlite3&#xff0c;安装详见&#xff1a;pycharm社区版中安装配置sqlite3_Sunshine_0426的博客-CSDN博客 问题&#xff1a; cmd命令行中或pycharm中Terminal行输入sqlite3 db.sqlite3命令后&#xff0c;出现“无法将“sqlite3”项识别为 cmdlet…...

VSCode 安装配置教程详解包含c++环境配置方法

vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器&#xff1a;配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址&#xff1a;官网下载地址 直接打开下载好的.exe文件进行安装即可&#xff0…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和图像放大缩小的技术背景Baumer工业相机通过BGAPISDK将相机图像图像放大缩小功能1.引用合适的类文件2.通过BGAPISDK将相机图像图像放大缩小功能…...

8.1 PowerBI系列之DAX函数专题-进阶-解决列排序对计算的影响

需求 下列矩阵中&#xff0c;在月份列不按照原始数据的month_no排列时&#xff0c;能正确计算销售额占比&#xff0c;但是当月份按照month_no排序时就会出错&#xff0c;需要解决这个问题。 实现 month % divide([amount],calculate([amount],all(date[month desc]))) //排…...

Java的第十二篇文章——集合

目录 第十二章 集合 学习目标 1. 集合框架的由来 2. 集合框架的继承体系 3. Collection接口 3.1 Collection接口的常用方法 4. Iterator接口 4.1 Iterator接口的抽象方法 4.2 获取迭代器接口实现类 4.3 迭代器的实现原理 4.4 并发修改异常 4.5 集合存储自定义对象并…...

docker 镜像制作 与 CI/CD

目录 镜像到底是什么&#xff1f; 使用docker创建镜像 步骤&#xff1a; 1、编辑Dockerfile&#xff08;Dockerfile是docker制作镜像的配方文件&#xff09; 2、编辑requirements.txt文件 3、编辑app.py文件&#xff0c;我们的程序文件 4、生成镜像文件 5、查看生成的镜…...

Spring Boot 异常报告器解析

基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解Spring Boot banner详解Spring Boot 属性配置解析Spring Boot 属性加载原理解析Spring Boot 异常报告器解析 创建自定…...

瑞亚太空活动公司RSA与英国国防与安全加速器达成量子项目合作

​ &#xff08;图片来源&#xff1a;网络&#xff09; 瑞亚太空活动公司&#xff08;RSA&#xff09;与英国国防与安全加速器&#xff08;DASA&#xff09;签署了合作协议&#xff0c;主要开发名为“无限交换”的可操纵量子真空的技术项目。这是RSA在英国签订的第一份合同&…...

Shapley值法介绍及实例计算

Shapley值法介绍及实例计算 为解决多个局中人在合作过程中因利益分配而产生矛盾的问题&#xff0c;属于合作博弈领域。应用 Shapley 值的一大优势是按照成员对联盟的边际贡献率将利益进行分配&#xff0c;即成员 i 所分得的利益等于该成员为他所参与联盟创造的边际利益的平均值…...

不用手动改 package.json 的版本号

“为什么package.json 里的版本还是原来的&#xff0c;有没有更新&#xff1f;”&#xff0c;这个时候我意识到&#xff0c;我们完全没有必要在每次发布的时候还特意去关注这个仓库的版本号&#xff0c;只要在发布打tag的时候同步一下即可 node.js 部分&#xff0c;我们得有一个…...

gitlab Can‘t update,dev has no tracked branch

代码仓库迁移到gitlab后本地更改仓库地址后 拉取代码报错&#xff1a; Can’t update,dev has no tracked branch&#xff1a; 解决办法&#xff1a; 在当前项目的目录下运行命令&#xff1a; git branch -u git dev --set-upstream-toorigin/dev第一个dev是本地分支名字&…...

sql批量操作

SQl: 1&#xff0c;在某一字段后批量增加内容&#xff1a;UPDATE 表名 SET 字段 CONCAT(字段,要增加的内容) 例&#xff1a;UPDATE b8_niuniu_permission SET game_ids CONCAT(game_ids,,3) &#xff08;或者后面可以加where条件&#xff09; 2&#xff0c;批量修改某一字段…...

数据库监控与调优【九】—— 索引数据结构

索引数据结构-B-Tree索引、Hash索引、空间索引、全文索引 二叉树查找 对于相同深度的节点&#xff0c;左侧的节点总是比右侧的节点小。在搜索时&#xff0c;如果要搜索的值key大于根节点&#xff08;图中6&#xff09;&#xff0c;就会在右侧子树里查找&#xff1b;key小于根…...

哈工大计算机网络传输层详解之:流水线机制与滑动窗口协议

哈工大计算机网络传输层详解之&#xff1a;流水线机制与滑动窗口协议 哈工大计算机网络课程传输层协议详解之&#xff1a;可靠数据传输的基本原理哈工大计算机网络课程传输层协议详解之&#xff1a;TCP协议哈工大计算机网络课程传输层协议详解之&#xff1a;拥塞控制原理剖析 …...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...