授人以渔(一)——从C#到Unity的协程(下篇)

本文详细解析yieldreturn在迭代器方法中的作用,将其与Unity协程的关系进行对比,并通过实例演示如何利用yieldreturn实现MoveNext()和Current属性的控制。读者将学会如何自定义协程并应用于分帧操作和定时任务。
现在我们来讲一讲yield关键字:
从上一篇文章的代码例子中,我们不难发现看到yield return语句后面跟的就是这个序列的每个值,也可以说yield return后跟的是枚举数(也就是IEnumerator接口的Current属性),然后编译器调用MoveNext()将枚举器向前移(当然每次移动前会先判断是否可移动)。这跟上面我们手写的枚举器一样的原理是一致的,只是这都由编译器帮我们做。
在MSDN上,官方对yield return的解释是迭代器方法运行到 yield return语句时,会返回一个 expression,并保留当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。你看到这就会自然地想到Unity的协程了吧,Unity协程不就是每次遇到yield return语句就会
暂时挂起,把控制权交给主程序,然后判断这个expression是否满足,如果满足下一次就直接从当前位置继续执行。
  • 协程的原理:
  • 有了上面的基础,现在我们来看协程。
IEnumerator MyCoroutine(){ //主体 }
  • Unity协程的声明如上面的代码,可以当作为一个返回值为IEnumerator的函数(注意只是当作,千万不要认为它就是一个函数,其实它本质是一个函数迭代器,也就是它并不是一个函数而是一个迭代器对象,而且它的Current的属性不再是一个基本类型的值而是一个函数,每个函数在MoveNext()调用的时候执行)
  • 对于一个IEnumerator我们通过上篇文章知道都有MoveNext()和Current属性,要实现对一个序列进行迭代必须用到这两个,而C#就是使用yield return和yield break来实现对MoveNext()和Current属性的使用。每次yield的位置就是每次MoveNext指令前进的终点,而yield return 后面的值就是Current的值。我们来实践一下。
可以看到上述结果符合我们的预期。上述结果表明协程真正的运行过程就是通过MoveNext()和Current来实现的。而我们在Unity里用到的协程只不过是内置了许多API让你可以在任意时刻调用MoveNext()而已,比如yield return null(在下一帧执行),你仅仅需要在LateUpdate()中调用MoveNext()就能实现分帧操作。如下图
再比如yield return new WaitForSeconds(5.0f),你仅仅需要每隔5秒执行一次MoveNext()即可,现在你完全可以自己试着去实现协程了,你都可以自己实现了我相信以后在Unity里遇到协程也不用担心看不懂了吧。 这个授人以渔系列我打算把一些Unity经常用到的技术,深入原理去给大家讲明白,让你不仅会用,在面试官问到你时,你更能把它讲清楚。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值