协程的一般概念:在主线程逻辑运行的同时,开启另一段逻辑处理,以辅助主程序的执行。
(一)首先说下unity中的协程。
调用方法如下:
public Coroutine StartCoroutine(IEnumerator routine);
public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value);
public Coroutine StartCoroutine(string methodName);
停用的方法对应如下:
public void StopCoroutine(IEnumerator routine);
public void StopCoroutine(Coroutine routine);
public void StopCoroutine(string methodName);
public void StopAllCoroutines();
停用的方法这有个坑,请大家注意:
比如调用的协程方法是Test();
StartCoroutine("Test");
StopCoroutine("Test");
这么调用时可以的。
以下方式调用时不可以的:
StartCoroutine(Test());
StopCoroutine(Test());
必须通过以下方式调用才能停止
IEnumerator testEnumerator = Test();
StopCoroutine(testEnumerator);
或者是
Coroutine testCoroutine;
StopCoroutine(testCoroutine);
这么调用才行。
其中要说明的是StopAllCoroutines,这个函数只能停止继承MonoBehaviour的那个类中的协程。
(二)下面说下Lua中的协程:
lua中的协程有三个状态:挂起态、运行态、停止态,当我们创建了一个协同程序时,起始状态为挂起态。也就是说创建了一个协程后,它不会自动运行。
我们需要主动的调用一个方法来启动创建的协程。
比如说:
创建了一个协程:
co = coroutine.create(function ()
print("hello kitty");
end)
然后启用这个协程, coroutine.resume(co);
我们可以通过coroutine.status(co),来获取当前协程的状态。比如:
print(coroutine.stsatus(so);
打印状态为:suspended(挂起)
coroutine.resume(co);
状态为:dead
下面我们说下,lua中协程的大招:yield函数,它主要作用就是将正在运行的代码挂起。
比如:
co = coroutine.create(function()
for i = 1, 10 do
print(i);
coroutine.yield();
end
end
运行程序,打印出1,然后程序被挂起。
然后调用coroutine.resume(co);
打印信息为2。又被挂起。直到条件终止。
当协程状态处于dead也就是终止状态后, 如果我们在启用它,resume将返回false和错误信息。
false cannot resume dead coroutine
原文:https://blog.csdn.net/Nice_66/article/details/81213870