Unity3d之之协程介绍.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Unity3d之之协程介绍

Unity3d之之协程介绍 在unity中,协程(Coroutines)的形式是我最喜欢的功能之一,几乎在所有的项目中,我都会使用它来控制运动,序列,以及对象的行为。在这个教程中,我将会说明协程是如何工作的,并且会附上一些例子来介绍它的用法。 协程介绍 ? ? ? ?Unity的协程系统是基于C#的一个简单而强大的接口 它允许你为自己的集合类型编写枚举器。这一点你不必关注太多,我们直接进入一个简单的例子来看看协程到底能干什么。首先,我们来看一下这段简单的代码... 倒计时器?这是一个简单的脚本组件,只做了倒计时,并且在到达0的时候log一个信息。? ? ? ?还不错,代码简短实用,是,如果我们需要复杂的脚本组件(像一个角色或者敌人的类),拥有多个计时器呢?刚开始的时候,我们的代码也许会是这样的:? ? ? ?尽管不是太糟糕,但是我个人不是很喜欢自己的代码中充斥着这些计时器变量,它们看上去很乱,而且当我需要重新开始计时的时候还得记得去重置它们(这活我经常忘记做)。 如果我只用一个for循环来做这些,看上去是否会好很多?? ? ? ? 现在每一个计时器变量都成为for循环的一部分了,这看上去好多了,而且我不需要去单独设置每一个跌倒变量。 ? ? ? ? 好的,你可能现在明白我的意思:协程可以做的正是这一点! 码入你的协程!? ? ? ?现在,这里提供了上面例子运用协程的版本!我建议你从这里开始跟着我来写一个简单的脚本组件,这样你可以在你自己的程序中看到它是如何工作的。 这看上去有点不一样,没关系,接下来我会解释这里到底发生了什么。 ? ? ? ? 这一行用来开始我们的Countdown程序,注意,我并没有给它传入参数,但是这个方法调用了它自己(这是通过传递Countdown的return返回值来实现的)。 Yield 在Countdown方法中其他的都很好理解,除了两个部分:l IEnumerator 的返回值l For循环中的yield return ? ? ? ? 为了能在连续的多帧中(在这个例子中,3秒钟等同于很多帧)调用该方法,Unity必须通过某种方式来存储这个方法的状态,这是通过IEnumerator 中使用yield return语句得到的返回值,当你“yield”一个方法时,你相当于说了,“现在停止这个方法,然后在下一帧中从这里重新开始!”。 ? ? ? ? 注意:用0或者null来yield的意思是告诉协程等待下一帧,直到继续执行为止。当然,同样的你可以继续yield其他协程,我会在下一个教程中讲到这些。 ? ? ? ? 协程在刚开始接触的时候是非常难以理解的,无论是新手还是经验丰富的程序员我都见过他们对于协程语句一筹莫展的时候。因此我认为通过例子来理解它是最好的方法,这里有一些简单的协程例子:文章出处狗刨学习网 多次输出“Hello” 记住,yield return是“停止执行方法,并且在下一帧从这里重新开始”,这意味着你可以这样做: //This will say hello 5 times, once each frame for 5 frames IEnumerator SayHelloFiveTimes() { Yield return 0; Debug.Log(Hello); Yield return 0; Debug.Log(Hello); Yield return 0; Debug.Log(Hello); Yield return 0; Debug.Log(Hello); Yield return 0; Debug.Log(Hello); } //This will do the exact same thing as the above function! IEnumerator SayHello5Times() { for(inti = 0; i 5; i++) { Debug.Log(Hello); Yield return 0; } } 每一帧输出“Hello”,无限循环。。。 通过在一个while循环中使用yield,你可以得到一个无限循环的协程,这几乎就跟一个Update()循环等同。。。 //Once started, this will run until manually stopped or the object is destroyed IEnumerator SayHelloEveryFrame() { while(true) { //1. Say hello Debug.Log(Hello); //2. Wait until next frame Yield return 0; }//3. This is a forever-loop, goto 1

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档