Unity 协程 Unity Task UniTask

article/2025/10/31 9:37:50

协程

使用 StartCoroutine 和 IEnumerator
yield return null 暂停执行并随后在下一帧恢复
yield return new WaitForSeconds(1f); 延迟1秒
waitfor系列有好几个
在这里插入图片描述
WaitForSeconds 和 WaitForSecondsRealtime 的区别

使用缩放时间将协程执行暂停指定的秒数。

实际暂停时间等于给定时间除以 Time.timeScale。如果要使用未缩放时间进行等待,请参阅 WaitForSecondsRealtime。在协程中,WaitForSeconds 只能与 yield 语句结合使用。

有一些因素可能意味着实际等待的时间量与指定的时间量不完全一致。
1 在当前帧的 end 处开始等待。如果您在一个非常长的帧(例如,具有同步加载等阻止主线程的长时间操作的帧)上使用持续时间“t”启动 WaitForSeconds,协程将在帧结束后返回“t”秒,而不是取消后“t”秒。
2 允许协程在“t”秒后继续在第一帧上执行,不是确切的“t”秒之后。

WaitForEndOfFrame
等待,直到该帧结束,在 Unity 渲染每一个摄像机和 GUI 之后,在屏幕上显示该帧之前。

可以用它将显示内容读取到纹理中,将其编码为图像文件(请参阅 Texture2D.ReadPixels 和 Texture2D.Texture2D),并将其存储在设备上。
从 Game 视图切换到 Scene 视图将导致 WaitForEndOfFrame 冻结。它只在应用程序切换回 Game 视图时才会继续。只有当应用程序在 Unity 编辑器中运行时才会发生这种情况。注意:在批处理模式下,不会在编辑器上调用此协程。如需了解更多详细信息,请参阅手册中的命令行参数页面。

WaitWhile 直到提供的委托评估为 false
WaitUntil 直到提供的委托评估为 true

注意:可以使用 StopCoroutine 和 StopAllCoroutines 来停止协程。 当用 SetActive(false) 禁用某个协程所附加到的游戏对象时,该协程也将停止。调用 Destroy(example)(其中 example 是一个 MonoBehaviour 实例)会立即触发 OnDisable,并会处理协程,从而有效地停止协程。最后,在帧的末尾调用 OnDestroy。

通过在 MonoBehaviour 实例上将 enabled 设置为 false 来禁用 MonoBehaviour 时,协程不会停止。

协程的缺点就是
他必须依赖 Monobehavior

Unity Task

相比 协程 Unity 的 Task 更加灵活

看例子

void Start()
{ Debug.Log("1 : " + Thread.CurrentThread.ManagedThreadId);this.aaa();Debug.Log("2 : " + Thread.CurrentThread.ManagedThreadId);
}async void aaa()
{Debug.Log("3 : " + Thread.CurrentThread.ManagedThreadId);await Task.Run(() =>{Debug.Log("5 : " + Thread.CurrentThread.ManagedThreadId);Thread.Sleep(3000);Debug.Log("6 : " + Thread.CurrentThread.ManagedThreadId);});Debug.Log("4 : " + Thread.CurrentThread.ManagedThreadId);
}

你会发现 Task.Run 里面的内容是单独id 也就是 5 和 6
其他所有的都是主线程id


http://chatgpt.dhexx.cn/article/PhyuEkqJ.shtml

相关文章

Unity 协程探究

一、官方手册中的描述 1、Manual/Coroutines 函数在调用时, “从调用到返回” 都发生在一帧之内,想要处理 “随时间推移进行的事务”, 相比Update,使用协程来执行此类任务会更方便。 协程在创建时,通常是一个 “返回值类型 为 …

Unity 协程底层原理解析

1、协程 unity是单线程设计的游戏引擎,unity实际上有多条渲染线程,但对于unity调用我们编写的游戏脚本,都是放在一个主线程当中进行调度的。因此对于我们写的游戏脚本unity是单线程的。 协程不是进程或者线程,它的执行过程更类似…

Unity协程那些事儿

Unity协程那些事儿 1、什么是协程?2、协程的使用3、关于yield4、关于IEnumerator/IEnumerable5、从IEnumerator/IEnumerable到yield6、Unity协程机制的实现原理7、源码分析8、总结 1、什么是协程? 用过Unity的应该都知道协程,今天就给大家来…

Unity⭐️当Unity协程遇到while

文章目录 Unity协程是一个老生常谈的知识点了,但今天博主却差点被一篇文章忽悠了 那就是这句话: 为什么说这句话不对呢 那就是当遇到while时,我们再来检验这句话的正确性: 按上面那句话,应该每次yield return后&…

深入探讨Unity协程及其使用

深入探讨Unity协程及其使用 协程 协程在Unity中是个很重要的东东,相信很多人都使用过,它能够非常方便的进行异步等待操作,可以说,用好协程,可以使你的代码更加优雅,然而,如果用不好&#xff0…

Unity 协程、模拟协程

理解协程 IEnumeratoryield 强大的迭代器 IEnumerator 就是一个函数容器 里面保存了一个一个的函数 IEnumator会依次执行每个函数 而每个函数都有一个返回值 保存在IEnumator.Currect里面 看下面这个例子 IEnuermator start_Coroutine(){Debug.Log("HellWord")…

unity 协程特点

协程 一. Unity中使用协程1. 什么是协程2. 如何使用3. 协程的应用场景创建补间动画打字机效果异步加载资源 4. 注意事项 二. Unity协程的底层原理1. 协程本体:C#的迭代器函数2. 协程调度:MonoBehaviour生命周期中实现3. Unity协程的架构 三. 扩展Unity的…

Unity协程深入及实现

Unity协程深入 文章目录 Unity协程深入Unity协程简介Unity协程的用法协程的原理协程的缺陷自己实现协程参考 Unity协程简介 Unity中的协程能够允许我们将一个任务分散到多个帧中。注意:协程(协同执行)和多线程有本质区别。 协程不是线程&…

unity 协程

首先声明:协程不是线程,协程在主线程中运行,而线程是单独开辟线程 以下是u3d关于协程的调用机制的解释: “在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在…

【Unity】Unity协程(Coroutine)的原理与应用

文章目录 前言一、什么是协程二、应用场景1.异步加载资源2.将一个复杂程序分帧执行3.定时器 三、协程的使用注意事项 四、Unity协程的底层原理1. 协程本体:C#的迭代器函数2. 协程调度:MonoBehaviour生命周期中实现 五、参考资料 前言 本文是作者在学习U…

Unity-协程详解

1. 简介 unity的**协程(Coroutine)**只是在c#的基础上做了一层封装,其实yield是C#的关键字。 unity协程是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余的部分,直到中断指令完成后&#xff…

Unity 协程(Coroutine)原理与用法详解

前言: 协程在Unity中是一个很重要的概念,我们知道,在使用Unity进行游戏开发时,一般(注意是一般)不考虑多线程,那么如何处理一些在主任务之外的需求呢,Unity给我们提供了协程这种方式…

linux的用户管理

1.linux的用户管理 linux的用户管理和组管理, 每个用户都必须要有一个且仅有一个初始组,可以有多个附加组,使用useradd命令创建用户时,如果没有指定初始组,系统默认会创建一个于其同名的组。 用户和组信息保存在4个文…

Linux用户管理练习

Linux下用户分为3类:超级用户(root)、系统用户、普通用户。 超级用户的用户名为root,它具有一切操作权力,因此为安全起见,建议不要轻易的在root账户下面对文件进行操作。在Linux操作系统的字符界面&#xf…

Linux用户管理工具

Linux用户管理工具 1. 用户 1.1创建用户 useradd -m username该命令为用户创建相应的帐号和用户目录/home/username; passwd username该命令为用户设置密码 1.2 删除用户 userdel -r username不带选项使用 userdel,只会删除用户。用户的家目录将…

Linux上的用户管理

Linux是一个多用户多任务的系统,任何人想要访问系统资源,必须通过登录账号来访问系统资源 添加用户 useradd:添加用户的命令(root才能添加用户) 用法:useradd 用户名 例:useradd water 就创建…

实现Linux用户管理

1.添加用户组:groupadd 用户组名称 2.创建用户 (一)仅创建用户:useradd 用户名 (二)指定用户所属的用户组: useradd -g 用户组 3.设置用户密码 (一)passwd 普通用户名 …

linux用户管理及操作指令

1、首先了解下linux是一个多用户多任务的操作系统。任何一个需要使用资源的用户都需要从linux系统中分配一个用户角色,比如:root、user、、然后使用对应账号进入系统。一个root用户下面能创建多个用户,每个用户下面对应一个目录 2、添加用户…

浅谈Linux用户管理

Linux用户管理 准备工作: 在管理用户时,执行命令后是无法看到效果的,最开始我们可以通过系统监视命令来对用户信息进行监控,使操作步骤可视。 watch -n 1 tail -n3 /etc/passwd;ls -l /home/ 注释: 部分含义watch …