2

我对循环情况下的协程行为有疑问,请参阅以下代码摘录作为在 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()也执行另一个迭代生成调试日志 'Debug.Log("State"+state); '。

换句话说,我期待大量的调试日志(当状态为 Status1 时,State1() 例程的每次迭代都有一个),但实际上在状态为 Status1 时只执行了 1 次。

所以我想我想念一些关于产量功能的东西,有没有人可以解释我这种行为?

4

1 回答 1

2

您的问题源于您的代码State1()直到stateTransitionCond == true.

启动协程的方法 ,FSM()直到完成才返回State1。换句话说,控制流在协程完成之前不会返回到调用方法。我相信这是因为你在里面yield(产生另一个协程)。显然,“正常”方法在继续执行之前不会等待协程完成。State1FSM

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

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);
        }   
    }   
}
于 2013-10-08T22:29:31.867 回答