unity协程简介[通俗易懂]

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

大家好,又见面了,我是你们的朋友全栈君。

在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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然而该方法在调用时将在一帧中执行完毕,无法实现预期的效果。如果将该方法改写并放到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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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循环
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

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

调用协程的方法有两种,分别是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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151661.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开机出现DISK BOOT FAILURE,INSERT SYSTEM DISK AND PRESS ENTER「建议收藏」

    开机出现DISK BOOT FAILURE,INSERT SYSTEM DISK AND PRESS ENTER「建议收藏」开机就出现DISKBOOTFAILURE,INSERTSYSTEMDISKANDPRESSENTER我的第一引导是从光驱,第二是从硬盘。以前是可以正常从硬盘启动的,突然发现这种现象。光驱里面没有光盘,为什么不能从硬盘启动了呢?开机滴的一声,应该是自检正常啊。打开BIOS查看了一下,好像也没动什么数据,打开机箱,把几个插头插紧了一下,(不记得做了哪些操作,反正没动内存

    2022年7月13日
    42
  • 通过pycharm安装python_python pycharm安装

    通过pycharm安装python_python pycharm安装第一步:安装Python网站:https://www.python.org/1):进入官网下载最新Python版本!跟着标识下载就行了。……打开安装包,在第一个界面选择custominstallation自定义安装,并且勾选上位置在中下面的AddPyhton3.9toPATH这是添加Python3.9的环境变量第二个界面不用管。第三个界面只要把最上面5个勾选就OK了然后直接点击安装。第二步:安装Pycharm编译器网站…

    2022年8月28日
    2
  • 100多个免费常用API接口分享,调用完全不限次数,以后总用得着![通俗易懂]

    100多个免费常用API接口分享,调用完全不限次数,以后总用得着![通俗易懂]各类无次数限制的免费API接口整理,主要是聚合数据上和APIStore上的一些,还有一些其他的。聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免

    2022年7月3日
    31
  • python长度单位换算表_长度单位换算表大全

    python长度单位换算表_长度单位换算表大全长度单位换算表大全我国传统的长度单位有里、丈、尺、寸等。1里=150丈=500米。2里=1公里(1000米)1丈=10尺,1尺=10寸。1丈=3.33米,1尺=3.33分米,1寸=3.33厘米。国际单位制中,长度的标准单位是“米”,用符号“m”表示。1960年第十一届国际计量大会:“米的长度等于氪-86原子的2P10和5d1能级之间跃迁的辐射在真空中波长的1650763.73倍”。其他的长度单位还…

    2022年7月11日
    39
  • Vue(6)v-on指令的使用[通俗易懂]

    Vue(6)v-on指令的使用[通俗易懂]v-on监听事件可以用v-on指令监听DOM事件,并在触发时运行一些JavaScript代码。事件代码可以直接放到v-on后面,也可以写成一个函数。示例代码如下:<divid

    2022年7月29日
    12
  • py2exe转换参数[通俗易懂]

    py2exe转换参数[通俗易懂]在公司用python写了个统计数据并通过xlsxwriter模块生成excel的小工具,完成后使用py2exe转换成exe文件过程中遇到了些问题,记录下.fromdistutils.coreimportsetupimportsyssys.argv.append(‘py2exe’)#直接执行pythonsetup.py即可转换includes=[‘xlsxwriter’]o

    2025年9月1日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号