循环使用协同程序

时间:2013-10-07 09:10:34

标签: c# unity3d coroutine

我对循环时的协程行为有疑问,请参阅以下代码摘录作为Unity C#脚本上的示例:

void Start() {
    StartCoroutine(FSM());
}

IEnumerator FSM() {
    state="State1";
    while (true) {
        Debug.Log("State "+state);
        yield return StartCoroutine(state);
    }
}

IEnumerator State1() {
    while (true) {
        if (stateTransitionCond) {
            state = "NextState";
            yield break;
        }
        yield return null; 
    }
}

状态机工作正常,但当前状态为Status1(stateTransitionCond==false),由于yield return null例程循环内的State1(),我期待在FMS()内循环{ {1}}还执行另一个迭代生成调试日志'Debug.Log(“State”+ state);'。

换句话说,我期待很多调试日志(State1()例程的每次迭代一次,当状态为Status1时),但实际上只有1次执行,而状态是Status1。

所以我想我错过了关于yield功能的一些内容,有没有人可以解释我这种行为?

1 个答案:

答案 0 :(得分:2)

您的问题源于这样一个事实:在State1()之前,您的代码不会突破stateTransitionCond == true方法。

启动协程FSM()的方法在State1完成之前不会返回。换句话说,在协程完成之前,控制流不会返回调用方法。我相信这是因为你yield State1 FSM using UnityEngine; using System.Collections; public class CoroutineTest : MonoBehaviour { // current FSM state public string state = ""; void Start() { StartCoroutine(FSM()); } IEnumerator FSM() { state = "State1"; while (true) { Debug.Log("State: " + state); // ExecuteOnce will execute exactly once before returning to the outer function yield return StartCoroutine(ExecuteOnce()); // ExecuteIndefinitely will execute indefinitely until its while() loop is broken // uncomment to test //yield return StartCoroutine(ExecuteIndefinitely()); } } IEnumerator ExecuteOnce() { Debug.Log("Calling ExecuteOnce()"); yield return new WaitForSeconds(1f); } IEnumerator ExecuteIndefinitely() { Debug.Log("Calling ExecuteIndefinitely()"); while (true) { Debug.Log("Inside ExecuteIndefinitely()"); yield return new WaitForSeconds(1f); } } } (产生另一个协程)。显然,“正常”方法不会等待协程在继续执行之前完成。

请参阅下面的代码示例以获取说明性示例:

{{1}}