【发布时间】:2020-03-11 10:25:48
【问题描述】:
我正在尝试在 untiy 中实现行为树,现在我正在为每个节点/复合/动作使用 Tick() 函数
我要做的是按顺序排列,例如:
-
开始循环遍历节点列表
-
在当前节点启动tick函数
-
等到节点tick返回失败/成功
-
转到下一个节点,继续进行第1步
我遇到的问题与第 3 步有关。我正在尝试使用协程来完成此操作。
问题在于断言为真,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();
}
}
【问题讨论】:
-
你应该使用 yield break 来中断协程
-
你不是在等待
Recursive在Execute中完成,@NikolayGonza 他在if语句中是yielding,他正在使用break退出true有条件的while -
我也尝试让递归函数递归:)。结果比 while 更糟糕
-
tick 是否使用多线程?如果不是,则调用中的执行将不会继续,直到 tick 方法的执行完成。
-
不,tick 不是多线程。我遇到的问题是断言,断言永远不应该达到。从协程 nosStat 应该是 Success/Failure
标签: c# unity3d artificial-intelligence