我对循环时的协程行为有疑问,请参阅以下代码摘录作为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功能的一些内容,有没有人可以解释我这种行为?
答案 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}}