Unity中协程(IEnumerator)的使用方法介绍

2023-11-04

在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程。
在通常情况下,如果我们想要让一个物体逐渐消失,我们希望方法可以一次调用便可在程序后续执行中实现我们想要的效果。
我们希望代码可以写成如下所示:

void Fade() 
{
    for (float f = 1f; f >= 0; f -= 0.1f) 
    {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}

然而该方法在调用时将在一帧中执行完毕,无法实现预期的效果。如果将该方法改写并放到Update函数中可实现我们预期的效果,但是还不够优雅。

float time = 0f;
float fadeTime = 2f;
void Fade() 
{
    time += Time.dealttime;
    Color c = renderer.material.color;
    c.a = 1f - time/fadeTime;
    renderer.material.color = c;
}

Unity中的协程方法通过yield这个特殊的属性可以在任何位置、任意时刻暂停。也可以在指定的时间或事件后继续执行,而不影响上一次执行的就结果,提供了极大地便利性和实用性。
协程在每次执行时都会新建一个(伪)新线程来执行,而不会影响主线程的执行情况。
正如上边的方法,我们使用协程可以更加方便的实现我们想要的效果。

void Fade() 
{
    for (float f = 1f; f >= 0; f -= 0.1f) 
    {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;//下一帧继续执行for循环
        yield return new WaitForSeconds(0.1f);//0.1秒后继续执行for循环
    }
}

我们通过StartCoroutine()函数来调用协程函数。

值得注意的是,协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中。当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一帧内等这个操作完成后再执行其他操作。
如我们需要执行一个循环:

IEnumerator CaculateResult()
{
    for (int i = 0; i < 10000; i++)
    {
        //内部循环计算
        //在这里的yield会让改内部循环计算每帧执行一次,而不会等待10000次循环结束后再跳出
        //yield return null;
    }
    //如果取消内部的yield操作,仅在for循环外边写yield操作,则会执行完10000次循环后再结束,相当于直接调用了一个函数,而非协程。
    //yield return null;
}

调用协程的方法有两种,分别是StartCoroutine(/这里直接调用方法,添加参数/),另一种是StartCoroutine(/这里填写”字符串的方法名字”,方法参数/)。第一种方法的优势在于可以调用多个参数的方法,后一种方法只能调用不含参数或只包含一个参数的协程方法。但是第一种方法不能通过StopCoroutine(/这里填写”字符串的方法名”/)来结束协程,只能通过StopAllCoroutines来结束。后一种则可以通过StopCoroutine来结束对正在执行的协程的调用。

协程在实现过程中我们需要注意yield调用的时机,执行较为复杂的计算时,如果在时间上没有严格的先后顺序,我们可以每帧执行一次循环来完成计算,或者每帧执行指定次数的循环来防止在程序运行中出现的卡顿现象。

yield return的介绍:

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

当某一个脚本中的协程在执行过程中,如果我们将该脚本的enable设置为false,协程不会停止。只有将挂载该脚本的物体设置为SetActive(false)时才会停止。

Unity在调用StartCoroutine()后不会等待协程中的内容返回,会立即执行后续代码。

虽然协程十分方便和灵活,但不当的使用会使程序产生无法预想的后果,请使用前慎重考虑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity中协程(IEnumerator)的使用方法介绍 的相关文章

  • c语言double类型的输入

    c语言double类型的输入 double输入用 lf 而不能用 f 今天在使用double类型输入时先用了 scanf lf a 结果以 f输出的时候都是0 以 g e输出似乎是最小的double值 12 3456789 0 000000

随机推荐

  • 软件产品设计

    figma软件介绍 Figma是一款在线协作式设计工具 用于 UI UX 设计和原型开发 它提供了一整套设计工具 包括向量绘图 页面布局和共享协作 支持多人协作 让用户可以在任何设备上创建 共享和讨论设计 知识点和技能 设计理论 理解UI设
  • Linux下xargs工具的使用

    xargs命令是给其他命令传递参数的一个过滤器 也是组合多个命令的一个工具 它能够将标准输入或管道中的数据转换为特定命令的命令行参数 也可以将单行或多行文本输入转换为其他格式的数据 比如单行变多行或者多行变单行 xargs的默认命令是ech
  • VS中的快捷键快速格式化代码,使好看,整齐

    在VC2005中 快捷键是Ctrl K Ctrl F 这是一个组合键 即先按Ctrl K 这时候编辑器会等待下一个按键动作 此时再按Ctrl F 即可以格式化代码了 当然 也可以在选项里面设置成使用VC6的快捷键 就可以继续使用Alt F8
  • 简述:面向对象的程序设计思想是什么?

    本博文源于C 基础 学到了类与对象这一章节 看见了课后有一个问题叫做 面向对象的程序设计思想是什么 我翻阅书籍 写下了这样一段话 就是警惕自己 如果未来被面试题面到 也能当做背诵个资料来看 下面开始简述那段话 文章目录 1 简述 面向对象的
  • PDM信号与PCM信号

    总结一下PDM信号与PCM信号 PDM PDM 脉冲密度调制 模拟信号的幅值使用输出脉冲对应区域的密度表示 PWM波是PDM波转换频率固定的一种特例 在实际输出的一位数据流中 只存在 1 和 0 1的密度越大 代表该区域对应的模拟信号幅值越
  • sql 2000 分页

    create PROCEDURE dbo Proc GetPageList Tables varchar 1000 表名 PK varchar 100 主键 Fields varchar 1000 查询的字段 SortField varch
  • 一阶RC滤波器

    一阶RC滤波器 作者 AirCity 2020 2 6 Aircity007 sina com 本文所有权归作者Aircity所有 RC低通滤波器 频响曲线 幅度下降到Ui 2 即是3dB带宽 此时 CR 1 2 f 1 CR f 1 2
  • SLF4J: Class path contains multiple SLF4J bindings.

    springboot启动出现如下警告 SLF4J Class path contains multiple SLF4J bindings SLF4J Found binding in jar file C Users wangfei m2
  • Python做数据分析需要学什么?

    下面分别从这四个方面来带大家学习数据分析 第一 做数据分析要精通Python吗 第二 数据分析流程是什么 学什么 第三 如何培养数据分析思维 第四 数据分析书籍推荐 一 数据分析要精通Python吗 做数据分析不必精通Python 但至少要
  • C++11类型转换总结

    一 强制类型转换 用C 中的四个强制类型转换的关键字 static cast const cast reinterpret cast dynamic cast static cast lt 类型说明符 gt 表达式 dynamic cast
  • docker进入容器出现bash-4.2#解决办法

    docker进入容器显示bash 4 2 如下 root VM 4 15 centos shopmall docker exec it u root 1f654abf60ac bash bash 4 2 出现上述问题是因为在 root 目录
  • go语言标准库

    在Go语言的安装文件里包含了一些可以直接使用的包 即标准库 Go语言的标准库 通常被称为语言自带的电池 提供了清晰的构建模块和公共接口 包含 I O 操作 文本处理 图像 密码学 网络和分布式应用程序等 并支持许多标准化的文件格式和编解码协
  • Linux 系统常用命令

    Linux 系统常用命令格式 command option argument1 argument2 其中option以 开始 多个option可用一个 连起来 如 ls l a 与 ls la 的效果是一样的 根据命令的不同 参数分为可选的
  • Centos设置屏幕不休眠

    前言 前段时间因工作需要 安装了一个centos7虚拟机体验了一把linux编程 感觉有些情况下比在windows中开发方便许多 囧 期间遇到一小问题 就是虚拟机每隔几分钟不操作 则会自动进入屏幕保护 需要重新输入密码才能进入 为此查了一下
  • 删除卷与分页文件(虚拟内存文件)

    无法删除卷可能是由于这个磁盘中存在分页文件 虚拟内存文件 引起的
  • Tomcat优化大全,进来看了,真就会了

    前言 Tomcat 服务器是一个开源的轻量级Web应用服务器 在中小型系统和并发量小的场合下被普遍使用 是开发和调试Servlet JSP 程序的首选 相信大家对于 Tomcat 已经是非常熟悉了 本篇将介绍tomcat的常见优化 那么为什
  • 网络设备网卡、中继器、集线器、网桥、交换机、路由器工作原理

    b 网络设备网卡 中继器 集线器 网桥 交换机 路由器工作原理 b b 网卡 b 1 工作在物理层 进行数据接收和发送 b 中继器 b 1 工作在物理层 用来复原网络中的信号并重新发送到其他网段上 进行数据接收再发送 b 集线器 b 1 工
  • echarts tooltip文字太长换行

    tooltip文字太长换行 设置了宽度也没有换行 加上一句 extraCssText max width 300px white space pre wrap 没加之前是这样 加上之后 extraCssText max width 300p
  • Tomcat8安装及配置详解

    Tomcat8安装及配置详解 1 下载安装包 2 安装Tomcat8 下载的zip包为免安装版 解压后可直接使用 3 配置环境变量 4 运行命令 5 测试是否成功 1 下载安装包 访问Tomcat官网https tomcat apache
  • Unity中协程(IEnumerator)的使用方法介绍

    在Unity中 一般的方法都是顺序执行的 一般的方法也都是在一帧中执行完毕的 当我们所写的方法需要耗费一定时间时 便会出现帧率下降 画面卡顿的现象 当我们调用一个方法想要让一个物体缓慢消失时 除了在Update中执行相关操作外 Unity还