当前位置: 首页 > 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!!!

http://www.lryc.cn/news/474295.html

相关文章:

  • 使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择
  • 【Flask】三、Flask 常见项目架构
  • AI机西使用体验:你不知道的强大功能揭秘!
  • 什么是护网(HVV)需要什么技术?(内附护网超全资料包)
  • opencv优秀文章集合
  • php处理文件上传的五种方式
  • C#与C++交互开发系列(十一):委托和函数指针传递
  • 【window】补充一些powershell基本命令
  • 精准触达用户,私域三步法!
  • Tcl脚本介绍(一)
  • 安全运营 -- 监控linux命令history
  • MyBatis3(动态SQL 常用的动态SQL 元素 映射器注解 基本注解 结果映射注解)
  • C#自定义事件的案例
  • flume系列之:flume机器做条带划分提高磁盘性能和吞吐量的详细步骤
  • C++基于opencv的视频质量检测--图像清晰度检测
  • 力扣11.1
  • 打印室预约系统|基于java和小程序的打印室预约系统设计与实现(源码+数据库+文档)
  • 操作系统-多线程案例
  • 什么是FUSE用户态文件系统
  • [每日一练]销售分析(通过数据的0/1转换进行是否存在的查询)
  • .NET Core WebApi第7讲:项目的发布与部署
  • 【python 将数据写入csv文件】正确方式
  • OpenCV4.8 开发实战系列专栏之 10 - 像素值统计
  • pandas计算相关性并画热力图
  • 初始Docker
  • Redis-概念、安装、基本配置
  • qt QPlainTextEdit详解
  • 【机器学习】23. 聚类-GMM: Gaussian Mixture Model
  • 深度探索C++对象模型
  • 电脑怎么设置开机密码:保障个人信息安全的第一步