一.协程学习的前置知识
迭代器
迭代器是一种用于简化循环结构的语法糖,它可以让我们通过一种更加简洁、优雅的方式来遍历一个集合或者执行一些需要多次迭代的操作。
在Unity中,迭代器的基本语法是使用yield return语句。yield return语句用于暂停迭代器的执行,并返回一个值或对象。
下面是一个使用迭代器的例子:
1 | IEnumerator MyIterator() { |
二.协程的入口
协程必须以IEnumerator开始,并且方法中必须包含关键字yield return,下面我们给出一个协程和普通程序的对比:
1 | IEnumerator PrintDebug() |
这时我们想要调用我们的协程就需要用到以下的代码
1 | StartCoroutine(PrintNum()); |
关键字yield return
yield return的作用是将我们的程序暂时挂起,满足部分条件之后再执行
下面是一些例子:
1 | yield return null;//下一帧以后执行后续代码 |
不仅如此,你甚至能使用自定义的yield return,请看代码
1 | public class MyYieldInstruction : CustomYieldInstruction { |
众所周知,自定义yield return类型需要满足以下两个条件:
-
继承自Unity的CustomYieldInstruction类。
-
实现keepWaiting属性,该属性的返回值控制协程是否继续等待。
在上面的示例中,MyYieldInstruction类继承自CustomYieldInstruction类,并实现了keepWaiting属性和Finish方法。在MyYieldInstruction类中,我们使用isFinished变量表示自定义的操作是否完成。在keepWaiting属性中,当isFinished为false时,协程将继续等待;当isFinished为true时,协程将不再等待,继续执行后面的代码。
以下的代码会告诉你该如何使用前面我们自定义的yield return
1 | IEnumerator MyCoroutine() { |
值得注意的是,在使用自定义yield return类型时,需要特别注意协程的终止条件,以避免出现不可预期的结果。
StartCoroutine语句
1 | StartCoroutine(方法); |
StartCoroutine的返回值类型是IEnumerator
注意:StartCoroutine语句只能在MonoBehaviour派生类的方法中使用,因为协程依赖于Unity的消息循环机制。
三.协程的结束
1 | StopCoroutine(方法); |
四.迭代器与协程的区别
迭代器(Iterator)和协程(Coroutine)在Unity中都用于异步操作,但它们在实现和使用上有一些区别。
- 实现方式不同
迭代器是一种基于枚举器(Enumerator)实现的语法,通过yield return语句实现协程的暂停和恢复。在编写迭代器时,需要实现IEnumerator和IEnumerable接口,并实现MoveNext、Reset和Current等方法。
协程是一种基于IEnumerator实现的语法,通过StartCoroutine和yield return语句实现协程的启动和暂停。在编写协程时,需要定义一个返回值为IEnumerator类型的方法,并使用yield return语句来暂停协程的执行。
- 使用方式不同
迭代器通常用于实现可枚举类型的遍历,可以通过foreach语句进行遍历操作。在协程中,迭代器通常用于实现异步操作,例如延迟执行、动画效果等。
协程通常用于实现异步操作,可以通过StartCoroutine语句启动协程,并使用yield return语句实现协程的暂停和恢复。协程可以通过yield return语句实现延迟执行、分步执行、等待操作完成等功能。
- 执行顺序不同
迭代器的执行顺序是在同一线程中顺序执行,即在迭代器中的每个yield return语句执行完毕后,才会执行下一个yield return语句或方法的其他部分。
协程的执行顺序是异步的,即在协程执行过程中可以执行其他代码。协程的执行可以被暂停和恢复,可以实现延迟执行、动画效果、等待操作完成等功能。
本文作于2023-03-19,首发于CSDN
https://blog.csdn.net/jubunihuan/article/details/129652810