Unity 协程、模拟协程

article/2025/11/1 5:26:05

理解协程

IEnumerator+yield 强大的迭代器

IEnumerator 就是一个函数容器 里面保存了一个一个的函数

IEnumator会依次执行每个函数  而每个函数都有一个返回值 保存在IEnumator.Currect里面

看下面这个例子

IEnuermator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";
}

yield就是从开始到yield之间的代码做成一个函数  实际上可以理解为yield就是如下

function (){Debug.Log("HellWord");return 1;
}
function (){Debug.Log("HellWord!!!");return "abc";
}

启动协程 this.StartCoroutine(e);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IECoroutine : MonoBehaviour
{void Start(){IEnumerator e = this.start_Coroutine();this.StartCoroutine(e);}IEnumerator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";}
}

yield return null;11下一帧再执行后续代码
yield return 0;1/下一帧再执行后续代码
vield return 6:/1任意数字)下一帧再执行后续代码
vield break;1/直接结束该协程的后续操作
yield return asyncOperation://等异步操作结束后再执行后续代码
vield return StartCoroution(/*某个协程*八://等待某个协程执行完毕后再执行后续代码
yield return www0://等待www操作完成后再执行后续代码
vield return new WaitForEndOfFrame()://等待帧结束,等待直到所有的摄像机和GU被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForseconds(0.3f)://等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的
间会受到Time.timescale的影响)
vield return new WaitForSecondsRealtime(0.3f)://等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后
(这里的时间不受到Time.timescale的影响);
yield return WaitForFixedUpdate()://等待下一次Fixedupdate开始时再执行后续代码
vield return new WaitUntil0//将协同执行直到 当输入的参数(或者委托)为true的时候
yield return new Waitwhile0//将协同执行直到 当输入的参数(或者委托)为false的时候

模拟协程实现过程

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IECoroutine : MonoBehaviour
{IEnumerator ie = null;void Start(){ie = this.start_Coroutine();}IEnumerator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";}void LateUpdate(){if (this.ie != null){if (!this.ie.MoveNext()){this.ie = null;}else{Debug.Log("ie.Current = " + ie.Current);}}}
}

 输出结果如下

 IEnumerator.MoveNext:执行当前函数 并将返回值存储到IEnumerator.Current里面  并把函数索引拨动到下一个  如果执行到头了 没有可执行的函数了 IEnumerator.MoveNext就会返回false

模拟协程等待时间

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IECoroutine : MonoBehaviour
{IEnumerator ie = null;void Start(){ie = this.start_Coroutine();}IEnumerator start_Coroutine(){Debug.Log("HellWord");yield return 1;Debug.Log("HellWod!!!");yield return "abc";Debug.Log("开始等待3秒");yield return new ClassWaitForTime(3);Debug.Log("等待3秒结束");}void LateUpdate(){if (this.ie != null){if (this.ie.Current is ClassWaitForTime){ClassWaitForTime cw = ie.Current as ClassWaitForTime;cw.Update(Time.deltaTime);if (!cw.IsOver()){//时间未到则停止往下继续执行return;}}if (!this.ie.MoveNext()){this.ie = null;}else{Debug.Log("ie.Current = " + ie.Current);}}}
}class ClassWaitForTime
{private float total;private float nowtime;public ClassWaitForTime(float time){this.total = time;this.nowtime = 0;}public void Update(float time){this.nowtime += time;}public bool IsOver(){return this.nowtime >= this.total;}
}

输出结果如下


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

相关文章

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 …

Linux用户管理(Centos7)

用户管理 用户命令 添加登录用户: 例:添加一个名为harry的用户,并使用bash作为登录的shell [rootaws ~]# useradd harry [rootaws ~]# tail -1 /etc/passwd harry:x:1002:1002::/home/harry:/bin/bashharry:x:1001:1001::/home/harry:/bin/…

Linux用户管理机制

Linux系统中的用户管理涉及用户账号文件 /etc/passwd、用户密码文件 /etc/shadow、用户组文件 /etc/group。 一、用户账号文件 /etc/passwd 该文件为纯文本文件,可以使用cat、head等命令查看。该文件记录了每个用户的必要信息,文件中的每一行对应一个用…

【Linux用户管理】

目录 前言 用户管理的基本命令 前言 Linux是一个多用户、多任务的操作系统,具有很好的稳定性与安全性,在linux系统中,root用户具有最高的权限,但该身份不当使用会带来一些不必要的麻烦和潜在的风险,故需要添加一些普通…

Linux之用户管理

一、用户的增删改查 1.增加用户 语法:useradd用户名 在终端输入 useradd 用户名 在linux系统home文件夹下面会出现新建用户的文件夹 2.修改密码 语法:passwd用户名 输入passwd 用户名,输入新的密码之后就可以使用新建的用户登录 3.删除用…

Linux用户管理-相关命令及配置文件-超详细-概念详解-初学全

前言 Linux系统作为多用户多任务的操作系统,可以在同一时间内允许多个用户登录、操作及配置计算机,随着需求的增加,用户的增加,我们也就需要对用户进行管理,以至于更有效地开展项目,改善工作,更…

Ubuntu/Linux用户管理与权限管理(超详细解析)

由于实验室几个老师的学生要共同使用一台服务器,所以需要规范一下服务器的使用,并且给各位学生配置相关的用户和权限,之前一直都是自己用,所以借此机会学习和总结一下Linux服务器的用户管理与权限管理。 Ubuntu/Linux用户管理与权…