Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree 行为树和取消正在运行的事件_Tree_Sequence_Interrupt_Behavior Tree - Fatal编程技术网

Tree 行为树和取消正在运行的事件

Tree 行为树和取消正在运行的事件,tree,sequence,interrupt,behavior-tree,Tree,Sequence,Interrupt,Behavior Tree,我在实现我的行为树时遇到问题。我想我了解基本情况,但我一直坚持运行事件,特别是如何阻止它们(或者更确切地说,如何不阻止它们) 假设以下简单树: Tree while "talk_to_lady" sequence move_to_position talk while "dance" sequence dance_move_1 dance_move_2 序列中的所有节点都是较长的运行操作,因此在完成之前返回运行状态 假设舞

我在实现我的行为树时遇到问题。我想我了解基本情况,但我一直坚持运行事件,特别是如何阻止它们(或者更确切地说,如何不阻止它们)

假设以下简单树:

Tree
  while "talk_to_lady"
    sequence
      move_to_position
      talk
  while "dance"
    sequence
      dance_move_1
      dance_move_2
序列中的所有节点都是较长的运行操作,因此在完成之前返回运行状态

假设舞蹈是真的,角色跳舞,这很好。现在“与女士交谈”是真的,这意味着角色应该去那里和她交谈。虽然该任务具有更高的优先级,并且我确实希望它发生,但我仍然希望角色在移动到talk_to_lady While循环之前完成当前舞蹈节点(即动画)(尽管可能存在其他我不想等待的情况)

我的解决方案是让树对dance_move动作调用Abort()方法,但如果返回running状态,它将忽略talk动作,直到dance_move动作返回成功或失败。此外,如果树中的高优先级事件是另一个操作而不是while节点,则它可能已经进行了状态更改,可能会干扰dance_move操作


我是否遗漏了什么,或者是否有我没有读过的解决方案?

在我看来,您必须拥有另一个独立的侦听器函数,该函数将协调其他函数的执行,或者在自己的线程中运行每个函数,而不考虑导致问题的“同步”机制。现在,根据所使用的语言,实现这一点可能非常简单或非常不简单。通过使用多线程方法,我将函数设置为在各自的线程中执行,从而使您能够根据自己的意愿从主线程停止线程,而主线程实际上是您的事件侦听器/生成器。您可以在主线程中实例化一个helper类,比如说,ThreadManager或其他类似的东西,它将嵌套用于管理运行线程(您的函数)的方法和对象/数组

因此,主线程将捕获发出的事件,通过ThreadManager类生成新线程,并在触发具有更高“级别”的事件时停止它们。如果希望在某些情况下保持同步性(如果新任务不应中断当前正在运行的任务),可以在队列中设置函数调用


这可能需要您花费一些时间进行设置,但最终可能会有回报,我个人曾在Python中为类似的用例使用过此模型,它工作得非常好。

您可以在“talk_to_lady”的顶部添加一个条件节点。 作为装饰者的条件节点提供了一个只有舞蹈完成的条件,然后执行“与女士交谈”行为


不确定我是否正确——当前代码在进入
与女士交谈
序列之前是否会完成
舞蹈
序列?或者您是在问如何根据情况中止/继续?我可以想象解决方案是一个队列或堆栈,其中包含要执行的剩余操作的列表代码应该用什么语言编写?对于迟到的回复,这种方法可能会有所不同——我的理解是,这些序列始终会从头到尾进行检查,因此,如果第一个序列在第二个序列运行时返回成功,它将中止第二个序列,这不一定是我想要的。我在用C#谢谢,我喜欢你的想法,但我担心线程不是一个选项,我确实希望它保持简单。此外,我的问题不是在触发更高优先级的事件时如何停止操作,而是如何在当前操作未完成时防止该操作发生。啊,我现在看到我误解了您实际上想要保持某种同步性。我仍然认为这是目前最可行的选择之一。我稍微修改了我的问题。看到您正在使用C#,您可以随意使用async/await,但在某种程度上,我仍然会说使用线程,但我很高兴看到其他人的建议,starred。
Tree
  condition: "dance state" == "finish" 
    while "talk_to_lady"
      sequence
        move_to_position
        talk
  while "dance"
    sequence
      dance_move_1
      dance_move_2