Unity中协程(IEnumerator)的使用

目录

一、问题的出现

二、协程(IEnumerator)的使用方式

1、协程的开启

2、yield return

3、协程的终止

三、问题的解决


一、问题的出现

今天在学unity的时候,想要给角色添加一个大力药水,捡到之后增加力量,把敌人砍滴飞起。效果实现了,但是问题也来了:这药水效果一直存在,砍谁都是一刀斩了!

这并不是我想要的效果,我希望是:药水有一段持续时间,在结束后恢复正常状态,这样才合情合理吗。

二、协程(IEnumerator)的使用方式

当我们的任务不能在一帧之内完成,而需要持续一段时间的时候,需要用一种方式将进程从主线程中剥离,放在另一条分支上(伪)。我们希望他不要停,但是又不要影响其他进程的运行。除了在Update中执行相关操作外,Unity还提供了更便利的方法,这便是协程(IEnumerator)。

unity的协程有三种状态 suspended(挂起)、running(运行)、dead(结束)

创建协程后,通过StartCoroutine()来调用协程函数,函数内部则通过yield来挂起函数,让函数等待下一次调用。外部通过StopCoroutine来结束协程。

协程使得方法的状态被存储了,方法中定义的这些变量都会保存它们的值,即使是在不同的帧中。

1、协程的开启

协程的调用的方法有两种:调用方法/调用名字

  1. StartCoroutine(function(参数1,参数2))
  2. StartCoroutine("functionname",参数1)

调用方法的方式好处在于,可以传入多种参数。但是他不能通过StopCoroutine来定向结束协程,只能通过StopAllCoroutine来结束。

调用名字可以通过StopCoroutine结束协程,但是只能传入一个参数

StartCoroutine(FirstTimer(item))//通过函数调用
StartCoroutine("FirstTimer",item)//通过函数名调用

2、yield return

通过yield return可以将协程挂起,在下次执行时函数会从yield后开始(保存了函数初始状态)

以下是yield return的效果(原文链接:https://blog.csdn.net/beihuanlihe130/article/details/76098844

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);

3、协程的终止

如果想要终止所有的协程,可以直接StopAllCoroutine()来关闭。但是如果希望定向关闭某一协程(以名称开始的协程),只能通过StopCoroutine("FunctionName")的方式关闭

StopCoroutine("FirstTimer")//关闭通过函数名调用的协程

三、问题的解决

这样咱们大力药水不消褪的问题就解决了,只要在获得buff后开启协程,在协程结束后将效果取消即可,代码如下

IEnumerator PowerupCountdownRoutine()
    {
        yield return new WaitForSeconds(7);
        hasPowerup =false;
    }

记得StartCoroutine调用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值