我对协程(在 Unity3D 和其他地方)如何工作感到困惑和好奇。协程是一个新线程吗?他们说Unity 的文档:
协程是一个可以暂停执行(yield)直到给定的 YieldInstruction 完成的函数。
他们在这里有 C# 示例:
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0F));
print("Before WaitAndPrint Finishes " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime) {
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
我对这个例子有很多疑问:
在上面的例子中,哪一行是协程?是
WaitAndPrint()
协程吗?是WaitForSeconds()
协程吗?在这一行:
yield return new WaitForSeconds(waitTime);
,为什么yield
和return
都存在?我在Unity 文档中读到“yield 语句是一种特殊的返回,它确保函数将在下次调用它时从 yield 语句之后的行继续执行。” 如果yield
是特殊的return
,return
这里在做什么?为什么我们必须返回一个
IEnumerator
?是否
StartCoroutine
开始一个新线程?WaitAndPrint()
在上面的例子中被调用了多少次?真的yield return new WaitForSeconds(waitTime);
回来了吗?如果是,那么我猜WaitAndPrint()
在上面的代码中被调用了两次。我猜是多次StartCoroutine()
打电话。WaitAndPrint()
但是,我看到另一个 Unity 文档说:“可以使用 yield 语句随时暂停协程的执行。yield 返回值指定何时恢复协程。” 这些话让我觉得WaitAndPrint()
其实还没有回来;它只是暂停了;它正在等待WaitForSeconds()
返回。如果是这种情况,那么在上面的代码WaitAndPrint()
中只调用了一次,并且StartCoroutine
只负责启动函数,而不是多次调用它。