目录
一、问题的出现
二、协程(IEnumerator)的使用方式
1、协程的开启
2、yield return
3、协程的终止
三、问题的解决
一、问题的出现
今天在学unity的时候,想要给角色添加一个大力药水,捡到之后增加力量,把敌人砍滴飞起。效果实现了,但是问题也来了:这药水效果一直存在,砍谁都是一刀斩了!
这并不是我想要的效果,我希望是:药水有一段持续时间,在结束后恢复正常状态,这样才合情合理吗。
二、协程(IEnumerator)的使用方式
当我们的任务不能在一帧之内完成,而需要持续一段时间的时候,需要用一种方式将进程从主线程中剥离,放在另一条分支上(伪)。我们希望他不要停,但是又不要影响其他进程的运行。除了在Update中执行相关操作外,Unity还提供了更便利的方法,这便是协程(IEnumerator)。
unity的协程有三种状态 suspended(挂起)、running(运行)、dead(结束)
创建协程后,通过StartCoroutine()来调用协程函数,函数内部则通过yield来挂起函数,让函数等待下一次调用。外部通过StopCoroutine来结束协程。
协程使得方法的状态被存储了,方法中定义的这些变量都会保存它们的值,即使是在不同的帧中。
1、协程的开启
协程的调用的方法有两种:调用方法/调用名字
- StartCoroutine(function(参数1,参数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后开启协程,在协程结束后将效果取消即可,代码如下文章来源:https://www.toymoban.com/news/detail-758345.html
IEnumerator PowerupCountdownRoutine()
{
yield return new WaitForSeconds(7);
hasPowerup =false;
}
记得StartCoroutine调用文章来源地址https://www.toymoban.com/news/detail-758345.html
到了这里,关于Unity中协程(IEnumerator)的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!