使用协程暂停暂停执行函数

问题描述 投票:0回答:1

我正试图统一实现行为树,现在我正在为每个节点/复合/动作使用Tick()函数

例如,我想做的是一个序列:

  1. 在节点列表中开始for循环迭代

  2. 在当前节点上启动刻度功能

  3. 等待节点滴答声返回失败/成功
  4. 转到下一个节点,然后继续执行步骤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();
    }
}
c# unity3d artificial-intelligence
1个回答
0
投票

您可以只使用WaitWhile指令

 IEnumerator Recursive(Node nod)
 {
     Status status;
     yield return new WaitWhile(() =>
     {
        status = nod.Tick();
        return status == Status.Running;
     });
     nodeStat = status;
 }
© www.soinside.com 2019 - 2024. All rights reserved.