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

【Unity】UniTask(异步工具)快速上手

UniTask(异步工具)

官方文档:https://github.com/Cysharp/UniTask/blob/master/README_CN.md

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

优点:0GC,可以在任何地方使用

为Unity提供一个高性能,0GC的async/await异步方案。

优点:

  • 基于值类型的UniTask和自定义的 AsyncMethodBuilder 来实现0GC
  • 使所有 Unity 的 AsyncOperations 和 Coroutines 可等待
  • 基于 PlayerLoop 的任务( UniTask.Yield, UniTask.Delay, UniTask.DelayFrame, etc…) 可以替换所有协程操作
  • 对MonoBehaviour 消息事件和 uGUI 事件进行 可等待/异步枚举 拓展
  • 完全在 Unity 的 PlayerLoop 上运行,因此不使用Thread,并且同样能在 WebGL、wasm 等平台上运行。
  • 带有 Channel 和 AsyncReactiveProperty的异步 LINQ,
  • 提供一个 TaskTracker EditorWindow 以追踪所有UniTask分配来预防内存泄漏
  • 与原生 Task/ValueTask/IValueTaskSource 高度兼容的行为
  1. 相关博客:

    • https://blog.csdn.net/farcor_cn/article/details/119494954
  2. 使用案例:

    • 等待1s

      写入async UniTaskVoid

      public async UniTaskVoid Awaittime(){Debug.Log("开始");await UniTask.Delay(1000);Debug.Log("结束延时");}
      
  3. 相关静态方法

    • UniTask.Delay

      延时几秒执行,能选择是以什么update时间来计算。

      UniTask.Delay(1000); //延迟1000ms
      UniTask.Delay(TimeSpan.FromSeconds(1));//延迟1s
      UniTask.Delay(1000, delayTiming: PlayerLoopTiming.FixedUpdate);//以FixedUpdate的时间来等待
      
    • UniTask.DelayFrame

      延时几帧执行

      UniTask.DelayFrame(3);//等待3帧(默认 update循环)
      UniTask.DelayFrame(3, PlayerLoopTiming.FixedUpdate);//等待3帧(Fixedupdate循环)
      
    • UniTask.Yield()

      等待1帧执行,调用即回到主线程执行操作

      await UniTask.Yield();//等待update()下的一帧
      await UniTask.Yield(PlayerLoopTiming.FixedUpdate);//等待下一次fixedUpdate
      
    • **UniTask.SwitchToThreadPool **

    • UniTask.SwitchToMainThread
      用来切换代码是在主线程跑还是线程池里跑

      await UniTask.Yield();
      //之后都在主线程跑
      await UniTask.SwitchToThreadPool();
      //之后都在线程池跑
      await UniTask.SwitchToMainThread();
      //之后回到主线程跑
      

      yield和SwitchToMainThread区别在于,如果已经是主线程下的话,SwitchToMainThread不会再等待一帧,而yield无论是不是在主线程,都会等待1帧。

    • UniTask.WaitUntil

    • UniTask.WaitWhile

      条件等待

      private async UniTaskVoid WaitUntils(){Debug.Log("开始");// 等待条件为 true则继续执行,否则等待await UniTask.WaitUntil(() => isActiveAndEnabled);// 在这里可以执行其他逻辑或代码,当 isActiveAndEnabled 为 true 时才会继续执行// 等待条件为 false则继续执行,否则等待await UniTask.WaitWhile(() => isActiveAndEnabled);// 在这里可以执行其他逻辑或代码,当 transform.position.y 不再大于 0 时才会继续执行}
      
    • UniTask.WaitUntilValueChanged

      指定对象变化时执行

      var str = await UniTask.WaitUntilValueChanged(this.transform,x =>x.position);//第一个参数时判断目标,第二个参数是判断方法的委托。如果这个返回值变的话,即为发生变化。
      Debug.Log(str);
      
    • UniTask.WhenAll(List)
      同Task.WhenAll()等待所有Task完成后完成,但UniTask版可以返回不同类型的值。

          private async UniTaskVoid StartAll(){// 创建异步任务列表List<UniTask> tasks = new List<UniTask>();// 向任务列表添加异步操作tasks.Add(DoTask1Async());tasks.Add(DoTask2Async());tasks.Add(DoTask3Async());// 等待所有任务完成await UniTask.WhenAll(tasks);// 所有任务完成后,执行下面的代码Debug.Log("所有任务已完成");}private async UniTask DoTask1Async(){// 异步操作1的代码await UniTask.Delay(1000);Debug.Log("任务1完成");}private async UniTask DoTask2Async(){// 异步操作2的代码await UniTask.Delay(2000);Debug.Log("任务2完成");}private async UniTask DoTask3Async(){// 异步操作3的代码await UniTask.Delay(3000);Debug.Log("任务3完成");}
      
    • UniTask.WhenAny(List)
      同Task.WhenAny()等待其中一个Task完成即为完成。

    • UniTask.Create(Function(UniTask))
      用异步委托快速生成返回UniTask的异步方法。

      private async UniTaskVoid Create(){// 创建自定义的异步操作并返回 UniTask 对象UniTask<string> customTask = UniTask.Create(async () =>{Debug.Log("开始自定义异步操作");await UniTask.Delay(1000);Debug.Log("自定义异步操作完成");return "11";});// 等待自定义异步操作完成并获取结果string result = await customTask;// 输出结果Debug.Log($"自定义异步操作的结果:{result}");}
      
    • UniTask.Defer(Function(UniTask))
      用异步委托快速生成返回UniTask的异步方法,但在创建时不执行,但在await时才执行。

      private async UniTaskVoid CreateDefer(){// 创建自定义的异步操作并返回 UniTask 对象UniTask<string> customTask = UniTask.Defer(async () =>{Debug.Log("开始自定义异步操作");await UniTask.Delay(1000);Debug.Log("自定义异步操作完成");return "11";});// 等待自定义异步操作完成并获取结果string result = await customTask;// 输出结果Debug.Log($"自定义异步操作的结果:{result}");}
      
    • UniTask.Lazy(Function(UniTask))
      用异步委托生成一个AsyncLazy型对象,在创建时不执行,但在await时才执行。与Defer不同的是这个可以重复await。

    • UniTask.Void(Function(UniTask))
      直接启动一个异步委托,不考虑其等待。

      	UniTask.Void(async () => {Debug.Log("aa");await UniTask.Delay(1000);});
      
    • UniTask.Action/UnityAction(Function(UniTask))
      就是将异步委托封装成Action或UnityAction。

相关文章:

【Unity】UniTask(异步工具)快速上手

UniTask(异步工具) 官方文档&#xff1a;https://github.com/Cysharp/UniTask/blob/master/README_CN.md URL:https://github.com/Cysharp/UniTask.git?pathsrc/UniTask/Assets/Plugins/UniTask 优点&#xff1a;0GC&#xff0c;可以在任何地方使用 为Unity提供一个高性能&…...

k8s三种常用的项目发布方式

k8s三种常用的项目发布方式 1、 蓝绿发布 2、 金丝雀发布(灰度发布)&#xff1a;使用最多 3 、滚动发布 应用程序升级&#xff0c;面临的最大问题是新旧业务之间的切换。 项目的生命周期&#xff1a;立项----定稿----需求发布----开发----测试-----发布 最后测试之后上线。再…...

Nodejs搭配axios下载图片

新建一个文件夹&#xff0c;npm i axios 实测发现只需保留node_modules文件夹&#xff0c;删除package.json不影响使用 1.纯下载图片 其实该方法不仅可以下载图片&#xff0c;其他的文件都可以下载 const axios require(axios) const fs require(fs) var arrPic [https:…...

强化学习在生成式预训练语言模型中的研究现状简单调研

1. 绪论 本文旨在深入探讨强化学习在生成式预训练语言模型中的应用&#xff0c;特别是在对齐优化、提示词优化和经验记忆增强提示词等方面的具体实践。通过对现有研究的综述&#xff0c;我们将揭示强化学习在提高生成式语言模型性能和人类对话交互的关键作用。虽然这些应用展示…...

python_selenium_安装基础学习

目录 1.为什么使用selenium 2.安装selenium 2.1Chrome浏览器 2.2驱动 2.3下载selenium 2.4测试连接 3.selenium元素定位 3.1根据id来找到对象 3.2根据标签属性的属性值来获取对象 3.3根据xpath语句来获取对象 3.4根据标签的名字获取对象 3.5使用bs4的语法来获取对象…...

面试宝典进阶之关系型数据库面试题

D1、【初级】你都使用过哪些数据库&#xff1f; &#xff08;1&#xff09;MySQL&#xff1a;开源数据库&#xff0c;被Oracle公司收购 &#xff08;2&#xff09;Oracle&#xff1a;Oracle公司 &#xff08;3&#xff09;SQL Server&#xff1a;微软公司 &#xff08;4&#…...

Agisoft Metashape 地面点分类参数设置

Agisoft Metashape 点云分类之地面点分类参数设置 文章目录 Agisoft Metashape 点云分类之地面点分类参数设置前言一、分类地面点参数二、农村及城区有房屋地区二、植被区域分类三、侵蚀半径(Erosion radius)参数设置前言 Agisoft Metashape提供了自动检测地面点的功能,减少…...

计算机科学速成课【学习笔记】(4)——二进制

本集课程B站链接&#xff1a; 4. 二进制-Representing Numbers and Letters with Binary_BiliBili_哔哩哔哩_bilibili4. 二进制-Representing Numbers and Letters with Binary_BiliBili是【计算机科学速成课】[40集全/精校] - Crash Course Computer Science的第4集视频&…...

数据库开发工具Navicat Premium 15 mac软件特色

Navicat Premium 15 mac版是一款数据库开发工具&#xff0c;Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。 Navicat Premium mac软件特色 无缝数据迁移 数据传输&#xff0c;数据同步和结构同步…...

从零开始构建区块链:我的区块链开发之旅

1.引言 1.区块链技术的兴起和重要性 区块链技术&#xff0c;作为数字化时代的一项颠覆性创新&#xff0c;已经成为当今世界最令人瞩目的技术之一。自比特币的问世以来&#xff0c;区块链技术已经从仅仅支持加密货币发展成为一种具有广泛应用前景的分布式账本技术。其核心优势…...

c JPEG编码,但有错误

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…...

二级C语言备考1

一、单选 共40题 &#xff08;共计40分&#xff09; 第1题 &#xff08;1.0分&#xff09; 题号:6923 难度:较易 第1章 以下叙述中正确的是 A:C语言规定必须用main作为主函数名,程序将从此开始执行 B:可以在程序中由用户指定任意一个函数作为主函数…...

【2024系统架构设计】 系统架构设计师第二版-嵌入式系统架构设计理论与实践

目录 一 嵌入式系统软件架构的原理 二 嵌入式系统软件架构的设计方法 三 案例分析 一 嵌入式系统软件架构的原理 🚀嵌入式系统的典型架构可以分为...

用python提取word中的所有图片

使用word中提取的方式图片会丢失清晰度&#xff0c;使用python写一个脚本&#xff0c;程序运行将弹出对话框选择一个word文件&#xff0c;然后在弹出一个对话框选择一个文件夹保存word中的文件。将该word中的所有图片都保存成png格式&#xff0c;并命名成image_i的样式。 程序…...

医疗器械分类及是否需要临床

1、医疗器械的分类&#xff1a; 在中国&#xff0c;医疗器械的管理分为一类、二类和三类&#xff0c;这是根据《医疗器械监督管理条例》的规定划分的。不同类别的医疗器械受到不同的监督和管理&#xff0c;包括注册审批、生产质量监督、市场监管等方面。 一类医疗器械&#x…...

AI人工智能虚拟现实行业发展分析

AI人工智能和虚拟现实是当今科技领域最受关注和研究的两个领域。这两项技术的迅速发展给各行各业带来了巨大的变革和机遇。在过去的几年里&#xff0c;AI和虚拟现实已经取得了显著的进展&#xff0c;并且有着广阔的发展前景。 AI人工智能作为一种模拟人类智能的技术&#xff0…...

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…...

Ubuntu20二进制方式安装nginx

文章目录 1.下载nginx安装包2.安装nginx3.安装出现的问题及解决方案错误1&#xff1a;错误2&#xff1a;错误3&#xff1a; 4.常用命令5.知识扩展&#xff1a; 1.下载nginx安装包 nginx官网&#xff1a;http://nginx.org/en/download.html 选择稳定的nginx版本下载。 2.安装ngi…...

window mysql5.7 搭建主从同步环境

window 搭建mysql5.7数据库 主从同步 主节点 配置文件my3308.cnf [mysql] # 设置mysql客户端默认字符集 default-character-setutf8mb4[mysqld] server-id8 #server-uuidbc701be9-ac71-11ee-9e35-b06ebf511956 log-binD:\mysql_5.7.19\mysql-5.7.19-winx64\mysql-bin binlog-…...

MCU、MPU、SOC简介

文章目录 前言一、MCU二、MPU三、SOC总结 前言 随着处理器技术的不断发展&#xff0c;CPU(Central Processing Unit)的发展逐渐出现三种分支&#xff0c;分别是MCU(Micro Controller Unit&#xff0c;微控制器单元) 和MPU&#xff08;Micro Processor Unit&#xff0c;微处理器…...

Kubernetes那点事儿——配置存储:ConfigMap、Secret

配置存储&#xff1a;ConfigMap、Secret 前言ConfigMapSecret 前言 前面介绍过的各种存储主要都是做数据的持久化&#xff0c;本节介绍的ConfigMap和Secret主要用于配置文件存储&#xff0c;或者环境变量的配置。 ConfigMap 创建ConfigMap后&#xff0c;数据实际会存储在K8s中…...

小白向:搭建企业培训APP的完整技术指南

当下&#xff0c;许多企业转向了现代化的培训方法&#xff0c;其中一个关键的工具就是企业培训APP。本文将为你提供搭建企业培训APP的完整技术指南&#xff0c;助你在数字化时代更好地满足企业培训的需求。 一、需求分析与功能规划 在开始开发之前&#xff0c;首先需要明确企…...

CVE-2023-36025 Windows SmartScreen 安全功能绕过漏洞

CVE-2023-36025是微软于11月补丁日发布的安全更新中修复Windows SmartScreen安全功能绕过漏洞。攻击者可以通过诱导用户单击特制的URL来利用该漏洞&#xff0c;对目标系统进行攻击。成功利用该漏洞的攻击者能够绕过Windows Defender SmartScreen检查及其相关提示。该漏洞的攻击…...

分析一个项目(微信小程序篇)二

目录 首页&#xff1a; 发现&#xff1a; 购物车&#xff1a; 我的&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 接…...

每日论文推送(有中文摘或源码地址或项目地址)

***VX搜索“晓理紫”并关注就可以每日获取最新论文***标题: “It’s not like Jarvis, but it’s pretty close!” – Examining ChatGPT’s Usage among Undergraduate Students in Computer Science作者: Ishika Joshi, Ritvik Budhiraja, Harshal D Akolekar摘要: Large lan…...

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…...

Nginx安装http2和ssl模块

Nginx安装http2和ssl模块 Nginx在执行默认安装命令的时候&#xff0c;并不会编译启用ngx_http_v2_module模块。故在修改Nginx配置文件启用http2.0协议的时候会报错。 一.检查Nginx安装了哪些模块 #进入Nginx的安装目录 cd /usr/local/nginx #执行命令查看安装了哪些模块 ./sbi…...

Android 8.1 隐藏设置中定位功能

Android 8.1 隐藏设置中定位功能 最近接到客户反馈&#xff0c;需要隐藏设备设置中的定位功能&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SecuritySettings.java mLocationcontroller.displ…...

无线网卡怎么连接台式电脑?正确操作步骤分享!

“我在使用电脑时经常都需要用到网络&#xff0c;请问大家在使用无线网卡时怎么将它与台式电脑进行连接的呢&#xff1f;” 使用电脑的用户在进行网上冲浪时都需要先连接网络。如果不想使用网线&#xff0c;无线网卡不仅可以为用户提供网络服务&#xff0c;在使用时该更加灵活和…...

聚道云软件连接器助力某贸易公司实现付款流程自动化

客户介绍&#xff1a; 某贸易公司是一家集进出口贸易、国内贸易、电子商务等业务于一体的综合性贸易企业。公司业务遍及全球多个国家和地区&#xff0c;拥有庞大的供应商网络和采购需求。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#…...

广州网站制作商/宁波seo教程行业推广

题目: 打印出下列图案 * *** ***** ******* ********* 1.程序代码: 2.运行结果:...

今日世界军事新闻/seo排名快速刷

人脸识别关键技术及原理人脸识别基础关键技术1、人脸检测&#xff08;Face Detection&#xff09;2、人脸对齐&#xff08;Face Alignment&#xff09;3、人脸特征提取&#xff08;Face Feature Extraction&#xff09;4、人脸识别&#xff08;Face Recognition&#xff09;5、…...

模板网站建设价格/网络营销的特点不包括

陌生了&#xff01;以前痴迷的技术&#xff0c;可我仍想拾起&#xff01;转载于:https://blog.51cto.com/mmgsdxb/317666...

做网站的公司怎么拓展业务/win10优化大师好用吗

数据泵expdp/impdp工具的使用&#xff1a; 建立数据泵目录 使用数据泵需要先建directory create directory dump_scott as/home/oracle/dump/scott 查看建立的目录 Select * from dba_directories 赋权 Grant read,write on directory dump_scott toscott 导出案例1&…...

上海 房地产网站建设/百度网盘帐号登录入口

此代码在我的本地xampp apache服务器中工作正常。 我在具有不同IP地址系统的局域网中运行相同的代码。 该文件无法打开&#xff0c;我无法将其写入所需的目录。 请做有需要的吗&#xff1f; 提前致谢。通过下面的代码传递xml文件。#!"C:\xampp\perl\bin\perl.exe"#!&…...

靠网站建设成功/深圳网络推广服务公司

定时器类Timer在java.util包中。使用时&#xff0c;先实例化&#xff0c;然后使用实例的schedule(TimerTask task, long delay)方法&#xff0c;设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类&#xff0c;继承并重写其run()方法&#xff0c;可实现…...