我正试图统一实现行为树,现在我正在为每个节点/复合/动作使用Tick()函数
例如,我想做的是一个序列:
在节点列表中开始for循环迭代
在当前节点上启动刻度功能
转到下一个节点,然后继续执行步骤1
我在第3步中遇到的问题。我正努力通过协程来完成此任务。
问题是断言为true,nodeStat var为None。当执行WaitFor Seconds时,控件返回到Debug.Assert(nodeStat != Status.None);
行
public class Sequence : Composite
{
protected override void Start()
{
status = Status.Running;
}
Status nodeStat = Status.None;
IEnumerator Recursive(Node nod)
{
while (true)
{
Debug.Log(nod + "is running");
Status status = nod.Tick();
Debug.Log(Time.time + " " + status);
if (status == Status.Running)
{
Debug.Log("start coroutine at : " + Time.time);
yield return new WaitForSeconds(0.2f);
Debug.Log("Comtinue coroutine at : " + Time.time);
}
else
{
Debug.Log("has finished coroutine");
nodeStat = status;
break;
}
}
}
protected override Status Execute()
{
foreach(Node nod in ListaNoduri)
{
GameManager.Instance.StartCoroutine(Recursive(nod));
Debug.Assert(nodeStat != Status.None);
if (nodeStat == Status.Failure)
return Status.Failure;
}
return Status.Success;
}
protected override void Exit()
{
base.Exit();
}
public override Status Tick()
{
//Debug.Log(status);
return base.Tick();
}
}
您可以只使用WaitWhile指令
IEnumerator Recursive(Node nod)
{
Status status;
yield return new WaitWhile(() =>
{
status = nod.Tick();
return status == Status.Running;
});
nodeStat = status;
}