关于协程中yield return的一些使用

1.协程与线程

Unity中的特殊在于所有的脚本和代码都是在一个主线程里运行的,协程也不例外。协程与线程的相似点只在于,协程看起来也可以与其他函数并行执行。 但本质上来说,线程

是通过可以开启多个子线程同时执行程序,而达到并行。而协程则是通过每帧检测的方式,在自己与其他函数之间切换。

2.yield return 的不同返回类型(一)

      使用yield return的时候你会发现它可以返回的类型一长串,对于初学者我觉得就分为带 new和不带new的就行了。
      先说不带new的。通常可以yield return的有 null,数字 ,字符串,布尔值甚至表达式,函数,嵌套协程等。
      以在Start()中开启当前协程为例,如果是不带new的返回类型,执行时间都是一样的。即在第一时间执行协程中的代码 到第一个yield return当行为止,然后在下一帧的Update之后,LateUpdate之前执行yield return后面的代码。(注:本人测试用的Unity版本是5.4.1,看过网上有些总结说是在LateUpdate之后执行,与我测试的结果不太一样,如果有疑问你们可以自己测试一下,因为Unity中某些版本可能会做微小改动)
             另外需要注意的是,yield return后面可以是一个函数调用,赋值表达式,嵌套的其它协程等。以赋值的表达式num=10为例;它会在当行yield return执行的时候就执行,函数调用和其它协程也是一样。也就是说,此时yield return的函数调用就相当于直接调用了这个函数,并且是当时就执行的。 而其它return 类型 如null,字符串,数字等一般只用作延迟一帧来用

3.yield return 的不同返回类型(二)。
             下面说带new的,也是通常我们重点使用的协程功能。
              这里列举几个:
                  (1).new  WaitUntil(Func<bool>)  参数是一个布尔返回类型的委托,作用是,知道这个返回的布尔值为true时,协程才会继续执行当行yield return 后面的代码。       
                  (2) new WaitForSeconds(ffloat)参数是float类型的数字,表示秒,也是协程最常用的功能之一。 作用是,在N秒后才会继续执行当行yield return 后面的代码。 
由于yield return可以在一个协程中任意位置写多个,配合这个可以实现很多时间细化可视化的功能。
                  (3)new WaitForEndOfFrame()作用是,在结束当前帧 摄像机和GUI被渲染以及其它函数完成后才会继续执行当行yield return 后面的代码。 这个我只验证了在LateUpdate执行完之后执行,具体在整个脚本周期中哪个函数执行完之后开始执行还未详细验证。
                  (4)new  WaitForFixedUpdate()  作用是,直到当行代码之后第一个FixedUpdate执行之后才会继续执行当行yield return 后面的代码。也就是说,如果是在start里面开启协程的话,第一次执行FixedUpdate之后就会继续执行return后面的代码。

 4.停止协程
                  协程内停止 可以用yield return break;
                  协程外停止 使用 StopCoroutine(string  methodname);
                  另外需要注意的是,设置当前协程所在脚本enable为false并不能停止当前协程的执行,只有设置当前脚本挂载gameobject.SetActive(false) 才可以。



       

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值