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

【Unity网络编程知识】Unity的 UnityWebRequest相关类学习

1、UnityWebRequest类介绍

        UnityWebRequest是一个unity提供的一个模块化的系统类,用于构成HTTP请求和处理HTTP响应,它主要目标是让unity游戏和Web服务端进行交互,它将之前WWW的相关功能都集成在了其中,所以新版本中都建议使用unityWebRequest类来代替WWW类,它在使用上和WWW很类似,主要的区别就是unityWebRequest把下载下来的数据处理单独提取出来了,我们可以根据自己的需求选择对应的数据处理对象来获取数据。

注意:

  • UnityWebRequest和www一样,需要配合协同程序使用
  • UnityWebRequest和www一样,支持http、ftp、file协议下载或加载资源
  • UnityWebRequest能够上传文件到HTTP资源服务器

2、UnityWebRequest常规操作获取数据

2.1 使用Get请求获取文本或二进制数据,UnityWebRequest.Get

    StartCoroutine(LoadText());IEnumerator LoadText(){//UnityWebRequest req = UnityWebRequest.Get("ftp://127.0.0.1/xxx.png");//UnityWebRequest req = UnityWebRequest.Get("file://" + Application.streamingAssetsPath + "/test.png");UnityWebRequest req = UnityWebRequest.Get("https://apis.tianapi.com/esports/index?key=569f5d47f6840feced4db412448e44f5&num=10");yield return req.SendWebRequest();//如果处理成功 结果就是成功枚举if(req.result == UnityWebRequest.Result.Success ){//文本 字符串print(req.downloadHandler.text);//字节数组byte[] bytes = req.downloadHandler.data;print(bytes.Length);}else{print("获取失败:" + req.result + req.error + req.responseCode);}}

2.2 使用Get请求获取纹理数据,UnityWebRequestTexture.GetTexture

    StartCoroutine(LoadTexture());IEnumerator LoadTexture(){UnityWebRequest req = UnityWebRequestTexture.GetTexture("https://qcloud.dpfile.com/pc/DfcPF0Dzu9D9Qd9Wm3_qdklLIicjzbTkXVl-rKrD1BAXyPEkpUqfdIUZwCbbB1Xz.jpg");yield return req.SendWebRequest();if(req.result == UnityWebRequest.Result.Success){//(req.downloadHandler as DownloadHandlerTexture).texture//DownloadHandlerTexture.GetContent(req);image.texture = DownloadHandlerTexture.GetContent(req);}else{Debug.LogError("获取失败" + req.error + req.result + req.responseCode);}}

 2.3 使用Get请求获取AB包数据,UnityWebRequestAssetBundle.GetAssetBundle

    IEnumerator LoadAB(){UnityWebRequest req = UnityWebRequestAssetBundle.GetAssetBundle("http://192.168.1.25:8000/HttpServer/lua");req.SendWebRequest();while(!req.isDone){print(req.downloadProgress);print(req.downloadedBytes);yield return 0;}//yield return req.SendWebRequest();if(req.result == UnityWebRequest.Result.Success){//AssetBundle ab = (req.downloadHandler as DownloadHandlerAssetBundle).assetBundle;AssetBundle ab = DownloadHandlerAssetBundle.GetContent(req);print(ab.name);}else{Debug.LogError("获取失败" + req.error + req.result + req.responseCode);}}

3、UnityWebRequest常规操作上传数据

3.1 上传相关数据类,IMuItipartFormSection接口

        //IMuItipartFormSection//数据相关类都继承该接口//我们可以用父类装子类List<IMultipartFormSection> datalist = new List<IMultipartFormSection>();

1)MultipartFormDataSection

        //1.二进制字节数组datalist.Add(new MultipartFormDataSection(Encoding.UTF8.GetBytes("djadjad")));//2.字符串datalist.Add(new MultipartFormDataSection("dsdadad"));//3.参数名,参数值(字节数组,字符串),编码类型,资源类型(常用)datalist.Add(new MultipartFormDataSection("Name", "ZTT", Encoding.UTF8, "text/..."));datalist.Add(new MultipartFormDataSection("Msg", new byte[1024], "application/..."));

2)MultipartFormFileSection

        //1.字节数组datalist.Add(new MultipartFormFileSection(File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));//2.文件名,字节数组(常用)datalist.Add(new MultipartFormFileSection("FileName.png", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));//3.字符串数据,文件名(常用)datalist.Add(new MultipartFormFileSection("123", "test.txt"));//4.字符串数据,编码格式,文件名(常用)datalist.Add(new MultipartFormFileSection("fdfds", Encoding.UTF8, "test.txt"));//5.表单名,字节数组,文件名,文件类型datalist.Add(new MultipartFormFileSection("file", new byte[1024], "test.txt", ""));//6.表单名,字符串数据,编码格式,文件名datalist.Add(new MultipartFormFileSection("file", "dada", Encoding.UTF8, "test.txt"));

3.2 Post发送请求

 

    StartCoroutine(UpLoad());IEnumerator UpLoad(){//准备上传的数据List<IMultipartFormSection> data = new List<IMultipartFormSection>();//键值对相关的 信息 字段数据data.Add(new MultipartFormDataSection("Name", "ZTT"));//PlayerMsg msg = new PlayerMsg();//data.Add(new MultipartFormDataSection("Msg", msg.Writing()));//添加一些文件上传文件//传二进制文件data.Add(new MultipartFormFileSection("test.png", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));//传文本文件data.Add(new MultipartFormFileSection("文件字符串内容", "test2.png"));UnityWebRequest req = UnityWebRequest.Post("http://192.168.1.25:8000/HttpServer/", data);req.SendWebRequest();while(!req.isDone){print(req.uploadProgress);print(req.uploadedBytes);yield return null;}print(req.uploadProgress);print(req.uploadedBytes);if(req.result == UnityWebRequest.Result.Success){print("上传成功");//req.downloadHandler.data}}

3. 3 Put上传请求

    StartCoroutine(UpLoadPut());IEnumerator UpLoadPut(){UnityWebRequest req = UnityWebRequest.Put("http://192.168.1.25:8000/HttpServer/", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png"));yield return req.SendWebRequest();if(req.result == UnityWebRequest.Result.Success){print("上传成功");}else{}}

4、 UnityWebRequest类的常用方法和变量

1)构造函数

UnityWebRequest req = new UnityWebRequest();

2)请求地址

req.url = "服务器地址";

3)请求类型

req.method = UnityWebRequest.kHttpVerbGET;

4)上传、下载的进度

req.downloadProgress
req.uploadProgress

5)超时设置

req.timeout = 2000;

6)上传、下载的字节数

req.downloadedBytes
req.uploadedBytes

7)重定向次数设置为0表示不进行重定向可以设置次数

req.redirectLimit = 2;

8)状态码、结果、错误内容

req.responseCode
req.result
req.error

9)下载、上传处理对象

req.downloadHandler
req.uploadHandler

5、UnityWebRequest高级操作获取数据

4.1 发送Get请求

        // 关键类://1.DownloadHandlerBuffer       用于简单的数据存储,得到对应的2进制数据。//2.DownloadHandlerFile         用于下载文件并将文件保存到磁盘(内存占用少)。//3.DownloadHand1erTexture      用于下载图像。//4.DownloadHandlerAssetBundle  用于提取AssetBundle。//5.DownloadHandlerAudioC1ip    用于下载音频文件。StartCoroutine(DownLoadTex());IEnumerator DownLoadTex(){UnityWebRequest req = new UnityWebRequest("https://qcloud.dpfile.com/pc/DfcPF0Dzu9D9Qd9Wm3_qdklLIicjzbTkXVl-rKrD1BAXyPEkpUqfdIUZwCbbB1Xz.jpg", UnityWebRequest.kHttpVerbGET);//1.DownloadHandlerBuffer//DownloadHandlerBuffer downloadHandlerBuffer = new DownloadHandlerBuffer();//req.downloadHandler = downloadHandlerBuffer;//2.DownloadHandlerFile//print(Application.persistentDataPath);//req.downloadHandler = new DownloadHandlerFile(Application.persistentDataPath + "/downloadFile.jpg");//3.DownloadHand1erTextureDownloadHandlerTexture textureDownLoadHandle = new DownloadHandlerTexture();req.downloadHandler = textureDownLoadHandle;yield return req.SendWebRequest();if(req.result == UnityWebRequest.Result.Success){//获取字节数组//downloadHandlerBuffer.data;//textureDownLoadHandle.textureimage.texture = textureDownLoadHandle.texture;}else{print("获取数据失败" + req.result + req.error + req.responseCode);}}

 4.2 自定义实现获取数据DownloadHandler相关类

步骤一、继承DownloadHandlerScript,实现CustomDownLoadFileHandle 类

public class CustomDownLoadFileHandle : DownloadHandlerScript
{//用于保存 本地存储时的路径private string savePath;//用于缓存收到的数据的容器private byte[] cacheBytes;//当前已收到的数据长度private int index = 0;public CustomDownLoadFileHandle():base(){}public CustomDownLoadFileHandle(byte[] bytes) : base(bytes){}public CustomDownLoadFileHandle(string path) : base(){savePath = path;}protected override byte[] GetData(){//return base.GetData();return cacheBytes;}/// <summary>/// 从网络收到数据后 每帧会调用的方法/// </summary>/// <param name="data"></param>/// <param name="dataLength"></param>/// <returns></returns>protected override bool ReceiveData(byte[] data, int dataLength){//return base.ReceiveData(data, dataLength);Debug.Log("收到数据长度:" + data.Length);Debug.Log("收到数据长度dataLength:" + dataLength);data.CopyTo(cacheBytes, index);index += dataLength;return true;}/// <summary>/// 从服务器收到 Content-Length标头时 会调用/// </summary>/// <param name="contentLength"></param>protected override void ReceiveContentLengthHeader(ulong contentLength){//base.ReceiveContentLengthHeader(contentLength);Debug.Log("收到数据长度:" +  contentLength);//根据收到的标头 决定字节数组容器的大小cacheBytes = new byte[contentLength];}/// <summary>/// 当消息收完了 会自动调用的方法/// </summary>protected override void CompleteContent(){//base.CompleteContent();Debug.Log("消息收完");//把收到的字节数组 进行自定义处理 我们在这 处理成 存储到本地File.WriteAllBytes(savePath, cacheBytes);}}

 步骤二、使用自定义获取数据DownloadHandler相关类

    StartCoroutine(DownLoadCustomHandle());IEnumerator DownLoadCustomHandle(){UnityWebRequest req = new UnityWebRequest("https://qcloud.dpfile.com/pc/DfcPF0Dzu9D9Qd9Wm3_qdklLIicjzbTkXVl-rKrD1BAXyPEkpUqfdIUZwCbbB1Xz.jpg", UnityWebRequest.kHttpVerbGET);//使用自定义的下载处理对象 来处理获取到的 2进制字节数组print(Application.persistentDataPath);req.downloadHandler = new CustomDownLoadFileHandle(Application.persistentDataPath + "/CustomHandle.jpg");yield return req.SendWebRequest();if(req.result == UnityWebRequest.Result.Success){print("存储本地成功");}else{print("获取数据失败" + req.result + req.error + req.responseCode);}}

6、UnityWebRequest高级操作上传数据

6.1 发送Post请求

        // 注意://由于UnityWebRequest类的常用操作中//上传数据相关内容已经封装的很好了//我们可以很方便的上传参数和文件//我们使用常用操作已经能够满足常用需求了//所以以下内容主要做了解//UploadHandler相关类//1.UploadHandlerRaw    用于上传字节数组StartCoroutine(UpLoad());//2.UploadHandlerFile   用于上传文件IEnumerator UpLoad(){UnityWebRequest req = new UnityWebRequest("http://192.168.1.25:8000/HttpServer/", UnityWebRequest.kHttpVerbPOST);//1.UploadHandlerRaw    用于上传字节数组//byte[] bytes = Encoding.UTF8.GetBytes("13131344");//req.uploadHandler = new UploadHandlerRaw(bytes);//req.uploadHandler.contentType = "类型/细分类型";//2.UploadHandlerFile   用于上传文件req.uploadHandler = new UploadHandlerFile(Application.streamingAssetsPath + "/test.png");yield return req.SendWebRequest();print(req.result);}

相关文章:

  • ThreadLocal作一个缓存工具类
  • 超小多模态视觉语言模型MiniMind-V 训练
  • OV7670连接STM32F407VET
  • Java迭代器知识点详解
  • 从编程助手到AI工程师:Trae插件Builder模式实战Excel合并工具开发
  • 在CentOS系统上部署GitLabRunner并配置CICD自动项目集成!
  • 《算法导论(第4版)》阅读笔记:p86-p90
  • Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
  • 自制操作系统day4(c指针)(指针和数组)(CLI和STI)(EFLAGS)
  • 力扣刷题Day 50:接雨水(42)
  • 你的it管理员已经限制对此应用一些区域的访问
  • MySQL进阶篇-InnoDB引擎(超细)
  • MySQL死锁:面试通关“三部曲”心法
  • Linux的权限问题
  • 【SPIN】PROMELA语言编程入门同步机制(SPIN学习系列--4)
  • std::ranges::iota
  • R²AIN SUITE 亮相第九届智能工厂高峰论坛
  • [CSS3]属性增强2
  • 卷积神经网络中的局部卷积:原理、对比与应用解析
  • PHP 实现连续子数组的最大和、整数中1出现的次数
  • 牛市早报|年内首次存款利率下调启动,5月LPR今公布
  • 特朗普与普京开始进行电话会谈,稍后还将致电泽连斯基
  • 《习近平新时代中国特色社会主义思想学习论丛》第十一辑至第十五辑出版发行
  • 大学2025丨专访西湖大学副校长邓力:如何才能培养“不惧未知”的创新者
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征
  • 广州医药集团有限公司原党委书记、董事长李楚源被“双开”