Unity 如何实现异步UnityWebRequest请求

这篇具有很好参考价值的文章主要介绍了Unity 如何实现异步UnityWebRequest请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Unity官方从2018开始,已经不推荐使用WWW了,更推荐使用UnityWebRequest,UnityWebRequest的使用方法和WWW类似,都是使用协程的方式来等待网络回复,但是存在几个问题:

1.协程只能在Unity运行时使用。所以编辑器工具如果要做网络请求,就没法用协程了。
2.协程是同步阻塞的方式,无法做大量数据的异步请求。
3.协程不太容易做请求数据的返回。

出于对以上问题的考虑,而我的需求又是需要做批量的http请求,所以不得不使用异步的方式来实现。
故有了今天的解决方案,遂记录下来,供大家参考。

Get请求

Get请求是最简单的,参数都在URL的?后面,所以也没有什么特殊注意事项,使用异步async-await方式请求即可,代码如下:

    /// <summary>
    /// Post请求json数据
    /// </summary>
    /// <param name="url"></param>
    static async Task<string> RequestGet(string url)
    {
        // 创建UnityWebRequest对象
        UnityWebRequest www = UnityWebRequest.Get(url);
        www.downloadHandler = new DownloadHandlerBuffer();

        // 发送请求并等待响应
        await www.SendWebRequest();

        // 处理响应
        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
            return null;
        }
        else
        {
            Debug.Log("Form upload complete!");
            return www.downloadHandler.text;
        }
    }

Post请求

Post请求稍微麻烦一些,因为我们要带上表头数据,比如Json格式的表头数据,使用async-await方式请求,代码如下:

    /// <summary>
    /// Post请求json数据
    /// </summary>
    /// <param name="url">URL</param>
    /// <param name="jsonArgs">请求json数据</param>
    /// <summary>
    /// Post请求json数据
    /// </summary>
    /// <param name="url">URL</param>
    /// <param name="jsonArgs">请求json数据</param>
    static async Task<string> RequestPost(string url, string jsonArgs)
    {
        // 创建UnityWebRequest对象
        UnityWebRequest www = UnityWebRequest.Post(url, "");
        byte[] postBytes = Encoding.UTF8.GetBytes(jsonArgs);
        www.uploadHandler = new UploadHandlerRaw(postBytes);
        www.downloadHandler = new DownloadHandlerBuffer();
        www.SetRequestHeader("Content-Type", "application/json");

        // 发送请求并等待响应
        await www.SendWebRequest();

        // 处理响应
        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
            return null;
        }
        else
        {
            Debug.Log("Form upload complete!");
            return (www.downloadHandler.text);
        }
    }

文件下载

以前做文件下载,可能会使用HttpWebRequest,然后对返回的数据流进行读取,等待流读取完毕,再写入到本地,代码会相对复杂一些。现在UnityWebRequest对文件的下载支持相对比较好了,我们不需要在使用原生的HttpWebRequest了,下面来看下如何使用异步方式async-await来实现大文件下载,代码如下:文章来源地址https://www.toymoban.com/news/detail-724600.html

    /// <summary>
    /// 下载文件
    /// </summary>
    /// <param name="url">下载地址</param>
    /// <param name="filePath">文件保存地址</param>
    static async Task<bool> DownloadFile(string url, string filePath)
    {
        UnityWebRequest www = UnityWebRequest.Get(url);

        // 发送请求并等待响应
        await www.SendWebRequest();

        // 处理响应
        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
            return false;
        }
        else
        {
            // 将响应数据写入本地文件
            Debug.Log("File download complete!");
            File.WriteAllBytes(filePath, www.downloadHandler.data);
            return true;
        }
    }

到了这里,关于Unity 如何实现异步UnityWebRequest请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity解决:没有UnityWebRequest.Result

    当我在Unity 2019中使用Unity 2021的代码satable时。 控制台显示 “UnityWebRequest”不包含“result”的定义,并且找不到接受“UnityWebRequest”类型的第一个参数的可访问扩展方法“result”(是否缺少using指令或程序集引用?) 漏洞/问题: 版本2020.3中添加了result。 在该版本之前,只需

    2024年02月05日
    浏览(25)
  • Unity C# 网络学习(十)——UnityWebRequest(一)

    UnityWebRequest与WWW的区别 UnityWebRequest将各种资源进行了拆分 UnityWebRequest比WWW的效率更高,有很低的GC产生 更方便的上传数据 1.下载文本和二进制数据 2.下载图片数据 3.下载AssetBundle数据 4.下载音频数据 1.上传数据类MultipartFormDataSection 2.上传数据类MultipartFormFileSection 3.Post发送数

    2023年04月08日
    浏览(23)
  • Unity UnityWebRequest 向php后端上传图片文件

    之前测试功能写过一次,因为代码忘记保存,导致真正用到的时候怎么也想不起来当初怎么写的了,复现后还是写个文章记录一下,省的下次再忘记。 搞定。

    2024年01月23日
    浏览(39)
  • unity unityWebRequest 通过http下载服务器资源

    直接下载不显示进度 显示下载进度 //注册事件的方法 private void OnDownloadAssets()//下载资源 { GameController.Instance.StartCoroutine(DownloadFormServer_IE(url, savePath)); }

    2024年02月21日
    浏览(35)
  • unity 3d与服务器以及数据库进行数据交互!!!(UnityWebRequest)

    数字孪生最重要的一步便是数据的通信,这里的数据通信包含了,数字模型和物理模型之间的通信。而对于数字模型在前面的介绍(跳转前面介绍的),我们采用的是unity3d来完成的,当然这里介绍的数据交互,重要也是以unity3d来介绍,但是大致的思想和原理都是一样的。下

    2024年02月12日
    浏览(28)
  • Unity实现异步加载场景

    一:创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel,取名为LoadScreen,再在loadScreen下面创建一个Image组件,放置背景图片,然后我们再在lpadScreen下面继续创建一个Slider,这个是用来加载进度条的,我们改名为LoadSlider。我们为什么需要改名字,为了见名之一,不至于过段时

    2024年02月12日
    浏览(26)
  • Unity异步编程【6】——Unity中的UniTask如何取消指定的任务或所有的任务

    今天儿童节,犬子已经9个多月了,今天是他的第一个儿童节。中年得子,其乐无穷(音:ku bu kan yan)…回头是岸啊 一连创建5个异步任务[id 从0~4],先停止其中的第id == 4的任务,再停止所有的任务 在Unity中,CancellationTokenSource用于创建和控制CancellationToken实例,以便在需要时

    2024年02月07日
    浏览(28)
  • Unity中【UniTask异步流程】如何进行【步骤分段】、【步骤撤销】、【步骤跳转】、【取消异步任务】

    UniTask是Unity中的Task实现,Task是C#中实现异步操作的一个模块(类)。UniTask与Task有着同样的使用思路(使用习惯,常用API等),可以说UniTask是借鉴Task而开发出来的。 以前有一个实验,操作就是点击物体,执行动画,点击物体,执行动画…如此子子孙孙无穷循环,直到地球爆炸

    2024年02月02日
    浏览(25)
  • Unity 启动时带参数,网页后端进行数据交互 UnityWebRequest ,Post,Get,Delete

    启动传参数可以参考这篇文章: 浏览器调用本地exe(应用程序)方法 Unity准备工作 需要用到这个API 官方解释:返回包含当前进程的命令行参数的字符串数组 返回值是一个string[],当Length1的时候就是带参数,注意:在UnityEditor模式也就是编辑器模式会有默认参数返回,Length是大于1的 常用

    2024年02月16日
    浏览(34)
  • 【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

    本篇配套直接打开可用的项目包地址,欢迎下载: https://download.csdn.net/download/weixin_41697242/88612084 想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。 平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。不过不同平

    2024年01月24日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包