UniTask异步解决方案

是一个高性能,0GC的async/await异步方案

协程缺点:

依赖monobehaviour

不能进行异常处理

方法返回值获取困难

c#原生Task:

优点:

不依赖monobehaviour

可以处理异常

缺点:

Task消耗大,设计跨线程操作

uniTask

优点:

继承c#的task优点

基于值类型解决方案,0GC

默认使用主协程

 https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask

延时操作:Delay DelayFrame Yield NextFrame WaitForEndOfFrame

等待操作: Wait Until Wait Until Value Changed

条件操作: When All When Any

异步委托生成UniTask及相关的封装: UniTask.Void UniTask.Defer UniTask.Lazy

取消:CancellationToken GetCancellationTokenOnDeatory()

异常处理:Try Catch SuppressCancellationThrow

超时处理:取消的变种,通过 CancellationTokenSouce.CancelAfterSlim(TimeSpan)设置超时并将CancellationToken 传递给异步方法

Forget()

事件处理:

1.异步事件 Lamaba 表达式注册 使用 UniTask.Action 或 UniTask.UnityAction

2.UGUI 事件转换为可等待事件

AsAsyncEnumerable

3.MonoBehaviour 消息事件都可以转换异步流

异步Linq

异步迭代器

响应式组件

 协程和task

void Start()
{StartCoroutine(waitting());
}
Ienumerator waitting()
{yield return new waitForSeconds(2);
}

using System.Threading.Tasks;
using UnityEngine;public class Zero :MonoBehaviour 
{async void Start(){await DealTest();   }async Task<int> DealTest(){Debug.Log(Time.time);await Task.Delay(100);Debug.Log(Time.time);return 1;}
}

延迟操作的API、Dealy方法、方法的重载及参数作用

UniTask.Delay                   延迟秒

UniTask.DelayFrame         延迟帧

UniTask.NextFrame          等待一帧

UniTask.Yield                    等待一帧,用于处理转回主线程用。yield之前再其他线程跑,yield之后回到主线程跑。

Time.timeScale=0F;
//等待时间,是否忽略时间缩放的影响(即便时间缩放为0但依然执行等待并向下执行,但是Time.time会受到影响),
await UniTask.Delay(1000,true);

WaitUntil等方法

WaitUntil

//知道达到------才执行

//等到指定对象的参数发生变化时 参数目标 判断方法的委托 如果返回值变化的话 就发生变化

//WaitUntilValueChanged

//等到指定对象的参数发生变化时,才完成。

using Cysharp.Threading.Tasks;
using UnityEngine;public class Two : MonoBehaviour
{public GameObject ball;void Start(){WaitUtilTest();WaitUntilValueTest();}void Update(){ball.transform.Translate(new Vector3(1,0,0)*Time.deltaTime);}async void WaitUtilTest(){await UniTask.WaitUntil(()=>isFarThanOne());//等到小球的x轴大于1后再执行方法的语句ball.GetComponent<Renderer>().material.color = Color.red;}public bool isFarThanOne(){if (ball.transform.position .x>1){return true;}return false;}//如果小球的x轴变化就输出“小球值的变化”async void WaitUntilValueTest(){await UniTask.WaitUntilValueChanged(ball.transform,x=>x.position);Debug.Log("小球值的变化");}
}

 WhenAll方法

当两个小球都达到1的时候,就执行等待函数代码

using Cysharp.Threading.Tasks;
using UnityEngine;public class Three : MonoBehaviour
{public GameObject ball1;public GameObject ball2;void Start(){TestWhenAll();}void Update(){ball1.transform.Translate(new Vector3(1, 0, 0) * Time.deltaTime);ball2.transform.Translate(new Vector3(1, 0, 0) * Time.deltaTime * 0.5f);}async void TestWhenAll(){UniTask task1 = UniTask.WaitUntil(() => ball1.transform.position.x > 1);UniTask task2 = UniTask.WaitUntil(() => ball2.transform.position.x > 1);await UniTask.WhenAll(task1, task2);string str = $"ball1:{ball1.transform.position.x},ball2:{ball2.transform.position.x}";Debug.Log(str);}
}

WhenAny方法

只有其中一个任务完成了就执行等待的方法

using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;public class Four : MonoBehaviour
{public Button btn1;public Button btn2;public bool isClick1;public bool isClick2;void Start(){btn1.onClick.AddListener(() => Click1());btn2.onClick.AddListener(() => Click2());AllBtnClick();}public void Click1(){isClick1 = true;}public void Click2(){isClick2 = true;}async void AllBtnClick(){UniTask task1 = UniTask.WaitUntil(() => isClick1);UniTask task2 = UniTask.WaitUntil(() => isClick2);await UniTask.WhenAny(task1, task2);//uniTask 不能await两次Debug.Log("11");}
}

Defer

UniTask.Void 参数异步委托 直接启动一个异步委托 不考虑其等待 无需加await

UniTask.Defer 用异步委托快速生成返回UniTask的异步方法,必须加await 才能执行

void Start
{UniTask.Void(async () =>{Debug.Log("start" + Time.frameCount);await UniTask.NextFrame();Debug.Log("end" + Time.frameCount);});
}

void Start()
{await UniTask.Defer(async () =>{Debug.Log("start" + Time.frameCount);await UniTask.NextFrame();Debug.Log("end" + Time.frameCount);});
}

协程与uniTask的转换

一些需要用到等待的unity对戏提供GetAwaiter()功能,从而拿到Awaiter对戏就可以进行await了。UniTask已经对各种各样的unity对戏进行了GetAwaiter的扩展。

1.Coroutine的等待及UniTask的转换

2.AsyncOperation的等待 如场景异步加载 资源异步加载 网络请求

3.UGUI的部分响应方法等待 如鼠标点击事件

4.MonoBehaviour的部分功能可以等待 如触发器

5.部分插件的扩展DOTween

Task -> UniTask : 使用AsUniTask

UniTask -> UniTask : 使用AsAsyncUnitUniTask

UniTask -> UniTask : 使用AsUniTask,这两者的转换是无消耗的

//动画序列
await transform.DOMoveX(2,10);
await  transform.DOMoveX(5,20);
//并行 并传递cancellation用于取消
var ct=this.GetCancellationTokenOnDestroy();
await  UniTask.WhenAll(transform.DoMoveX(10,3).withCancellation(ct),transform.DoScale(10,3).withCancellation()
);
using Cysharp.Threading.Tasks;
using System.Collections;
using UnityEngine;public class Six : MonoBehaviour
{async void Start(){StartCoroutine(CorotineTest());//实现协程等待await CorotineTest();}IEnumerator CorotineTest(){Debug.Log("start");yield return new WaitForSeconds(1);Debug.Log("end");}
}
using Cysharp.Threading.Tasks;
using System;
using System.Collections;using UnityEngine;public class Six : MonoBehaviour
{async void Start(){StartCoroutine(CorotineTest1());}IEnumerator CorotineTest1(){Debug.Log("start");//使用这个方法将UniTask组件转化成协程//如果你想将异步转换成协程,你可以使用.ToCoroutine(),如果你只想允许使用携程系统,这很有用。yield return UniTask.Delay(TimeSpan.FromSeconds(1)).ToCoroutine();Debug.Log("end");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EI会议征稿】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#…

c题目13:验证100以内的数是否满足哥德巴赫猜想。(任一大于2的偶数都可以写成两个质数之和)

每日小语 活下去的诀窍是&#xff1a;保持愚蠢&#xff0c;又不能知道自己有多蠢。——王小波 自己思考 即要让第一个质数与这个数减去第一个质数的值都为质数&#xff0c;所以要满足几个条件 1.abc 2.a为质数 3.b为质数 这里是否可以用到我之前刚学的自己设置的那个判断…

带头结点的双向循环链表

目录 带头结点的双向循环链表 1.存储定义 2.结点的创建 3.结点的初始化 4.尾插结点 5.尾删结点 6.头插结点 7.头删结点 8.查找并返回结点 9.在pos结点前插入结点 10.删除pos结点 11.打印链表 12.销毁链表 13.头插结点2.0版 14.尾插结点2.0版 前言&#xff1a; 当…

深入探究Python中的JSON、Pickle和Shelve模块:特性与区别

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;处理数据序列化和持久化是极其重要的。JSON、Pickle和Shelve是三种常用的模块&#xff0c;它们提供了不同的方法来处理数据的序列化和持久化。本文将深入研究这三个模块&#xff0c;探讨它…

conda和pip常用命令整理

文章目录 一、conda常用指令1. 更新2 .环境管理3. 包管理 二、pip常用命令1. 常用命令2. 国内镜像 一、conda常用指令 1. 更新 conda --version 或 conda -V #查看conda版本 conda update conda # 基本升级 conda update anaconda # 大的升级 conda upd…

VBA_MF系列技术资料1-232

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

动态规划:多重背包问题-一维滚动数组解法

题目描述 你是一名宇航员&#xff0c;即将前往一个遥远的行星。在这个行星上&#xff0c;有许多不同类型的矿石资源&#xff0c;每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球&#xff0c;但你的宇航舱有一定的容量限制。 给定一个宇航舱&#xff0c;最大容量…

02_学习使用javax_ws_rs_下载文件

文章目录 1 前言2 Maven 依赖3 下载接口4 如何返回文件&#xff1f;5 感谢 1 前言 专栏上一篇&#xff0c;写了如何使用 javax.ws.rs 上传文件&#xff0c;那么必然的&#xff0c;我们得再学习学习如何下载文件&#x1f600; 2 Maven 依赖 这个就不赘述了&#xff0c;和上一篇…

【高效开发工具系列】Hutool DateUtil工具类

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络爬虫与指纹浏览器:解析指纹浏览器对网络爬虫的作用

网络爬虫在信息搜集、数据挖掘等领域起着重要作用。然而&#xff0c;传统爬虫往往面临被目标网站封禁的风险。本文将介绍指纹浏览器对网络爬虫的作用&#xff0c;以及指纹浏览器如何帮助爬虫降低封禁风险。 网络爬虫面临的挑战 网络爬虫是一种自动化程序&#xff0c;用于从互联…

Python+Requests模块获取响应内容

Requests模块获取响应内容 响应包括响应行、响应头、响应正文内容&#xff0c;这些返回的响应信息都可以通过Requests模块获取。这些 获取到的响应内容也是接口测试执行得到的实际结果。 获取响应行 获取响应头 获取其它响应信息 代码示例&#xff1a; # 导入requests模块…

华为OD机试真题-分割均衡字符串-2023年OD统一考试(C卷)

题目描述&#xff1a; 均衡串定义&#xff1a;字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的X和Y两种字符。 输入描述&#xff1a; 均衡串&#xff1a;XXYYXY 字符…

算法通关村第十四关-青铜挑战认识堆

大家好我是苏麟 , 今天带大家认识认识堆 . 堆 堆是将一组数据按照完全二叉树的存储顺序&#xff0c;将数据存储在一个一维数组中的结构。 堆有两种结构&#xff0c;一种称为大顶堆&#xff0c;一种称为小顶堆 : 大顶堆 大顶堆的任何一个父节点的值&#xff0c;都大于或等于…

前端下拉框select标签的插件——select2.js

本文采用的是select2 版本:Select2 4.0.6-rc.1。 可以兼容IE8及以上。亲测过。 官网:Getting Started | Select2 - The jQuery replacement for select boxes 一、认识select2.js 1、使用插件,首先要引入别人的插件了,你可以选择离线(无网络)或者在线引用的(如果有网…

ios 逆向分分析,某业帮逆向算法(一)

用到工具: 爱思助手CrackerXL(砸壳软件)越狱手机ida反汇编软件分析login 的sign 签名算法中自己写算法 已知我们32位,我们不妨猜测是md5 ,那我们试图使用CC_MD5 ,这个是ios 中的标准库, 我们使用frida-trace 注入hook一下,看看有没有 经过 是经过了这个函数,密码也是…

新建的springboot项目中application.xml没有绿色小叶子(不可用)

经常有朋友会遇到新建了一个springboot项目&#xff0c;发现为啥我创建的application.xml配置文件不是绿色的&#xff1f;&#xff1f;&#xff1f; 下面教大家如何解决&#xff0c;这也是博主在做测试的时候遇到的&#xff1a; 将当前位置application.xml删掉&#xff0c;重新…

Java,Stream API的使用

Stream是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 Stream和Collection集合的区别&#xff1a;Collection是一种静态的内存数据结构&#xff0c;讲的是数据&#xff0c;而Stream是有关计算的&#xff0c;讲的是计算。集合主…

在Spring Boot中使用@Async实现一个异步调用

在使用异步注解之前&#xff0c;我们需要先了解&#xff0c;什么是异步调用&#xff1f; 异步调用对应的事同步调用&#xff0c;同步调用是值程序按照我们定义的顺序依次执行&#xff0c;每一行程序都必须等待上一行的程序执行完成之后才执行&#xff0c;而异步是指在顺序执行…

YOLOv8 第Y7周 水果识别

1.创建文件夹&#xff1a; YOLOv8开源地址 -- ultralytics-main文件下载链接&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreML > TFLite 其余文件由代码生成。 数据集下载地址&#xff1a;Frui…

使用NVM管理多个版本的node.js

1、nvm介绍&#xff1a; nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js 2、下载nvm地址&#xff1a; https://d…