首页 > 其他分享 >Unity 将UnityWebRequest改为async/await异步

Unity 将UnityWebRequest改为async/await异步

时间:2023-08-01 15:56:49浏览次数:53  
标签:await request System Unity result using async public loopArgs

花了一点时间,对UnityWebRequest进行了简单封装,使用起来更方便一些,顺便实现了post接口轮询、重试的功能

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

public static class WebRequest
{
    public class Result
    {
        public long code;
        public string message;
        public byte[] data;

        public string GetText()
        {
            if (data != null && data.Length != 0)
            {
                return Encoding.UTF8.GetString(data, 0, data.Length);
            }
            return "";
        }
    }
    public class LoopArgs
    {
        /// <summary>
        /// 循环多少次,为0时表示无限循环
        /// </summary>
        public ushort Count { get; private set; }
        /// <summary>
        /// 每次循环间隔多少毫秒
        /// </summary>
        public ushort MsDelay { get; private set; }
        /// <summary>
        /// 直到返回true时终止循环,该方法允许根据每次结果,设置终止循环的时机,在小于循环次数时提前结束循环
        /// </summary>
        public Func<Result, bool> AbortUntil { get; private set; }
        public LoopArgs(ushort count, ushort msDelay, Func<Result, bool> abortUntil)
        {
            Count = count;
            MsDelay = msDelay;
            AbortUntil = abortUntil;
        }
    }
    public static async Task<Result> Post(string url, WWWForm form, Dictionary<string, string> headers)
    {
        using (UnityWebRequest request = UnityWebRequest.Post(url,form))
        {
            if (headers != null)
            {
                foreach (KeyValuePair<string, string> item in headers)
                {
                    request.SetRequestHeader(item.Key, item.Value);
                }
            }
            await request.SendWebRequest();
            Result result = new Result();
            result.code = request.responseCode;
            result.message = request.result.ToString();
            result.data = request.downloadHandler.data;
            return result;
        }
    }
    public static async Task<Result> Post(string url, WWWForm form, Dictionary<string, string> headers, LoopArgs loopArgs = null)
    {
        return await Loop(() => { return Post(url, form, headers); }, loopArgs);
    }
    static async Task<Result> Loop(Func<Task<Result>> request, LoopArgs loopArgs)
    {
        Result result;
        if (loopArgs == null)
        {
            result = await request();
        }
        else
        {
            ushort i = 0;
            while (true)
            {
                result = await request();
                if (loopArgs.AbortUntil != null && loopArgs.AbortUntil.Invoke(result))
                {
                    break;
                }
                if (loopArgs.Count != 0 && i >= loopArgs.Count)
                {
                    break;
                }
                await Task.Delay(loopArgs.MsDelay);
                i++;
            }
        }
        return result;
    }


    /// <summary>
    /// 异步的扩展方法
    /// </summary>
    public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
    {
        var tcs = new TaskCompletionSource<object>();
        asyncOp.completed += obj => { tcs.SetResult(null); };
        return ((Task)tcs.Task).GetAwaiter();
    }
}

 

这样调用

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.LogError("开始请求");
        PostTest();
        Debug.LogError("调用结束");
    }
    async void PostTest()
    {
        Debug.LogError("开始");
        WebRequest.Result result = await WebRequest.Post("www.baidu.com", null, null, new WebRequest.LoopArgs(3, 1000, (r) => { Debug.LogError(r.message); return false; }));
        string content = result.GetText();
        Debug.LogError("结束: " + content);
    }

}

 

打印结果:

 

标签:await,request,System,Unity,result,using,async,public,loopArgs
From: https://www.cnblogs.com/Jason-c/p/17596714.html

相关文章

  • promise和async await的差别
    Promise是ES6引入的一种处理异步操作的机制。它可以表示一个异步操作的最终完成或失败,并在完成或失败后返回结果或错误信息。Async/await是ES8(ECMAScript2017)引入的一种基于Promise的语法糖,用于更简洁地处理异步操作。它可以让异步的代码看起来更像同步的代码,提供了更好......
  • Unity的BuildPlayerProcessor:深入解析与实用案例
    UnityBuildPlayerProcessorUnityBuildPlayerProcessor是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自动执行一些操作。这个功能可以帮助开发者提高工作效率,减少手动操作的时间和错误率。在本文中,我们将介绍UnityBuildPlayerProcessor的使用方法,并提供三个使......
  • Unity之 GameObject.Find()路径正确却找不到物体
    有一个需求,需要用代码找到一个GameObject并将其取消激活。我是这么写的:GameObject.Find("mainCanvas").SetActive(false);但你运行后就会发现它报错;而报错的内容是找不到物体。反复核实路径正确,且物体确实是激活状态后我对这个代码的报错感到很不解。直到我把代码改成了:v......
  • Unity UGUI的Shadow(阴影)组件的介绍及使用
    UnityUGUI的Shadow(阴影)组件的介绍及使用1.什么是Shadow(阴影)组件?Shadow(阴影)组件是UnityUGUI中的一个特效组件,用于在UI元素上添加阴影效果。通过调整阴影的颜色、偏移、模糊等属性,可以使UI元素看起来更加立体和有层次感。2.Shadow(阴影)组件的工作原理Shadow(阴影)组件......
  • Unity的IPostprocessBuild:深入解析与实用案例
    UnityIPostprocessBuild技术文章UnityIPostprocessBuild是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目后自动执行一些操作。这个功能可以帮助开发者提高工作效率,减少手动操作的时间和错误率。在本文中,我们将介绍UnityIPostprocessBuild的使用方法,并提供三个使用......
  • Js 之promise、async 和 await
    一、示例代码<html><head></head><body><scriptsrc="jquery.js"></script><script>constlogin=asyncfunction(){vara=awaitnewPromise((resolve,reject)=>{$.get("&qu......
  • unity制作位图字体
    第一步:ps制作好艺术字体,每个一样宽一样高。第二步:使用 bmfont软件,将前面做好的小图转成fnt和png。(下载地址:https://www.angelcode.com/products/bmfont/)<?xmlversion="1.0"?><font><infoface="Arial"size="32"bold="0"italic="0"......
  • Unity png形式的图集拆除子图并把新的子png转换成sprite
    ///<summary>///图集形式为.png形式并在unity中有很多sprite的子图///</summary>privatevoidAtlasSplit(){stringguidStr=Selection.assetGUIDs[0];stringpath=AssetDatabase.GUIDToAssetPath(guidStr);Object......
  • steamcommunity 302 加速访问github
    steamcommunity302加速访问github官网文档:https://www.dogfight360.com/blog/knowledge-base/steamcommunity_302_manual/Linux/Macos环境下使用steamcommunity302Linux/Macos环境下使用steamcommunity302教程–Dogfight360Releases·caddyserver/caddy(github.co......
  • Unity可确定性定点数(软浮点)物理引擎
    Unity自带的物理引擎,都是用的硬件浮点,硬件浮点有个特点,就是不同CPU,实现的标准可能不一样,导致会有误差。也就是说,Unity自带的物理引擎,在不同平台上,模拟的效果可能会不一样。而且就算是同一机器,也可能因为浮点造成的误差,导致每次模拟的结果都不一样。解决方法就是用软件浮点(定点数......