【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 高度兼容的行为
-
相关博客:
- https://blog.csdn.net/farcor_cn/article/details/119494954
-
使用案例:
-
等待1s
写入async UniTaskVoid
public async UniTaskVoid Awaittime(){Debug.Log("开始");await UniTask.Delay(1000);Debug.Log("结束延时");}
-
-
相关静态方法
-
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(异步工具) 官方文档:https://github.com/Cysharp/UniTask/blob/master/README_CN.md URL:https://github.com/Cysharp/UniTask.git?pathsrc/UniTask/Assets/Plugins/UniTask 优点:0GC,可以在任何地方使用 为Unity提供一个高性能&…...
k8s三种常用的项目发布方式
k8s三种常用的项目发布方式 1、 蓝绿发布 2、 金丝雀发布(灰度发布):使用最多 3 、滚动发布 应用程序升级,面临的最大问题是新旧业务之间的切换。 项目的生命周期:立项----定稿----需求发布----开发----测试-----发布 最后测试之后上线。再…...
Nodejs搭配axios下载图片
新建一个文件夹,npm i axios 实测发现只需保留node_modules文件夹,删除package.json不影响使用 1.纯下载图片 其实该方法不仅可以下载图片,其他的文件都可以下载 const axios require(axios) const fs require(fs) var arrPic [https:…...

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

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、【初级】你都使用过哪些数据库? (1)MySQL:开源数据库,被Oracle公司收购 (2)Oracle:Oracle公司 (3)SQL Server:微软公司 (4&#…...
Agisoft Metashape 地面点分类参数设置
Agisoft Metashape 点云分类之地面点分类参数设置 文章目录 Agisoft Metashape 点云分类之地面点分类参数设置前言一、分类地面点参数二、农村及城区有房屋地区二、植被区域分类三、侵蚀半径(Erosion radius)参数设置前言 Agisoft Metashape提供了自动检测地面点的功能,减少…...

计算机科学速成课【学习笔记】(4)——二进制
本集课程B站链接: 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版是一款数据库开发工具,Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。 Navicat Premium mac软件特色 无缝数据迁移 数据传输,数据同步和结构同步…...
从零开始构建区块链:我的区块链开发之旅
1.引言 1.区块链技术的兴起和重要性 区块链技术,作为数字化时代的一项颠覆性创新,已经成为当今世界最令人瞩目的技术之一。自比特币的问世以来,区块链技术已经从仅仅支持加密货币发展成为一种具有广泛应用前景的分布式账本技术。其核心优势…...

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题 (共计40分) 第1题 (1.0分) 题号:6923 难度:较易 第1章 以下叙述中正确的是 A:C语言规定必须用main作为主函数名,程序将从此开始执行 B:可以在程序中由用户指定任意一个函数作为主函数…...

【2024系统架构设计】 系统架构设计师第二版-嵌入式系统架构设计理论与实践
目录 一 嵌入式系统软件架构的原理 二 嵌入式系统软件架构的设计方法 三 案例分析 一 嵌入式系统软件架构的原理 🚀嵌入式系统的典型架构可以分为...

用python提取word中的所有图片
使用word中提取的方式图片会丢失清晰度,使用python写一个脚本,程序运行将弹出对话框选择一个word文件,然后在弹出一个对话框选择一个文件夹保存word中的文件。将该word中的所有图片都保存成png格式,并命名成image_i的样式。 程序…...
医疗器械分类及是否需要临床
1、医疗器械的分类: 在中国,医疗器械的管理分为一类、二类和三类,这是根据《医疗器械监督管理条例》的规定划分的。不同类别的医疗器械受到不同的监督和管理,包括注册审批、生产质量监督、市场监管等方面。 一类医疗器械&#x…...

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

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

Ubuntu20二进制方式安装nginx
文章目录 1.下载nginx安装包2.安装nginx3.安装出现的问题及解决方案错误1:错误2:错误3: 4.常用命令5.知识扩展: 1.下载nginx安装包 nginx官网: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总结 前言 随着处理器技术的不断发展,CPU(Central Processing Unit)的发展逐渐出现三种分支,分别是MCU(Micro Controller Unit,微控制器单元) 和MPU(Micro Processor Unit,微处理器…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...