lua和U3D中协程的异同

协程的一般概念:在主线程逻辑运行的同时,开启另一段逻辑处理,以辅助主程序的执行。

(一)首先说下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 
 

猜你喜欢

转载自blog.csdn.net/lingyun5905/article/details/86555626