Unity中协程(IEnumerator)的使用

这篇具有很好参考价值的文章主要介绍了Unity中协程(IEnumerator)的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、问题的出现

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

1、协程的开启

2、yield return

3、协程的终止

三、问题的解决


一、问题的出现

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

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

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

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

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

unity 开启协程,unity,游戏引擎

创建协程后,通过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调用文章来源地址https://www.toymoban.com/news/detail-758345.html

到了这里,关于Unity中协程(IEnumerator)的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(52)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(51)
  • Python中协程(coroutine)详解

    1 共用变量问题 多线程中可能出现多个线程争抢变量,所以变量需要加锁;协程中任一时刻都只有一个线程,所以变量不需要加锁。 但是协程虽然不像多线程争抢变量但仍是和多线程一样共用变量的,即共用变量在某处改变在另外一处引用时也会发生改变。 2 协程的适用场景

    2024年04月09日
    浏览(28)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(47)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(74)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(52)
  • Unity Bolt使用协程等待

    使用Unity bolt插件可以进行一些简单逻辑开发。本质上相当于把C#接口以图形化的方式进行调用。但是怎么使用协程进行等待呢。经过一些研究,可以使用继承WaitUnit的组件方式进行扩展。下面是具体的操作步骤。 1:等待组件扩展。 经过查找,Bolt已经对WaitForSeconds,WaitUnitl进行

    2024年02月13日
    浏览(38)
  • Unity 如何使用协程等待加载完成

    今天在项目打包后遇到一个bug 项目在电脑上跑没问题,但是在手机端时,由于手机较差的性能,导致异步加载的资源需要等待较长的时间. 而我在一个地方本以为是同步加载的资源,但是在调用时发现本该被加载完成的资源加载失败, 大佬查看过底层实现后给出结论:这个资源使用了

    2024年02月16日
    浏览(36)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(102)
  • GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT,是一个免费开源的3D引擎。本文以unity作对比,简述两者区别和选型建议。由于是很久以前写的ppt,技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的机遇,第一个是oprea的合作奖,第二个是用支持c#换来的微软的投资,第三个是虚幻

    2024年02月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包