U2L8——协同程序原理

协同程序原理

协程本质 就是利用 C#的迭代器函数“分步执行”的特点 加上 协程调度逻辑 实现的一套分时执行函数的规则

关于协程的介绍和使用相关,在协同程序里

协程的本质

协程可以分成两部分:

  1. 协程函数本体:就是一个可以中间暂停返回的函数
  2. 协程调度器:是Unity内部实现的,会在对应的时机帮助我们继续执行协程函数

Unity只实现了协程调度部分,协程的本体本质上就是一个C#的迭代器方法

可以简单把协程理解为迭代器函数
C#看到迭代器函数和yield return​语法糖,就会把原本是一个“函数”变成“几部分”
我们就可以提供迭代器,从上到下遍历这几部分进行执行

而协程调度器就是利用迭代器函数返回的内容来进行之后的处理
比如Unity中的协程调度器,根据yield return​返回的内容,决定了下一次在何时继续执行迭代器函数中的“下一部分”

理论上来说,我们可以利用迭代器函数的特点,自己实现协程调度器来取代Unity自带的调度器

协程本体是迭代器方法的体现

协程函数本体

如果我们不通过 开启协程方法执行协程
Unity的协程调度器是不会帮助我们管理协程函数的

但是我们可以自己执行迭代器函数内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class TestClass
{
public int time;
public TestClass(int time)
{
this.time = time;
}
}

IEnumerator Test()
{
print("第一次执行");
yield return 1;
print("第二次执行");
yield return 2;
print("第三次执行");
yield return "123";
print("第四次执行");
yield return new TestClass(10);
}

void Start()
{
IEnumerator ie = Test();
ie.MoveNext(); //会执行函数中内容遇到yield return为止的逻辑
print(ie.Current); //得到yield return返回的内容
ie.MoveNext();
print(ie.Current);
ie.MoveNext();
print(ie.Current);
ie.MoveNext();
TestClass tC = ie.Current as TestClass;
print(tC.time);
}

//MoveNext 返回值 代表着 是否到了结尾(这个迭代器函数 是否执行完毕)
while (ie.MoveNext())
{
print(ie.Current);
}

通过我们自己分步执行迭代器函数,可以发现协程本质就是一个迭代器方法的体现,只不过Unity有自己的协程调度器来执行协程

协程调度器

继承MonoBehaviour​后 开启协程,相当于是把一个协程函数(迭代器)放入一个Unity的协程调度器中帮助我们管理进行执行
具体的yield return​后面的规则 也是Unity定义的一些规则

1
Coroutine c1 = StartCoroutine(Test());