我在实施行为树时遇到问题。我想我了解基本知识,但是我坚持运行事件,尤其是如何停止事件(或更确切地说,如何不停止事件)
假设以下简单树:
Tree
while "talk_to_lady"
sequence
move_to_position
talk
while "dance"
sequence
dance_move_1
dance_move_2
序列中的所有节点都是较长的运行动作,因此返回运行状态直到完成。
假设跳舞是真的,角色跳舞,那很好。现在talk_to_lady是真实的,这意味着角色应该去那里与她交谈。尽管该任务确实具有更高的优先级,并且我确实希望它能够实现,但我仍然希望角色在转入talk_to_lady while循环之前完成当前的舞蹈节点(即动画)(尽管在其他情况下,我会不想等)。
我的解决方案是让该树在dance_move动作上调用一个Abort()方法,但是如果此返回运行状态,它将忽略讲话动作,直到dance_move动作返回成功或失败。另外,如果树中较高优先级的事件是另一个动作而不是while节点,则它可能已经进行了状态更改,可能会干扰dance_move动作。
我错过了什么吗?还是我没有读过的解决方案?
答案 0 :(得分:0)
IMO,您将必须具有另一个单独的 listener 函数,该函数将协调其他函数的执行或在其自己的线程中运行每个函数,而无需考虑“同步”机制。引起问题。现在,取决于所使用的语言,实现该目标可能非常琐碎或非常琐碎。通过使用多线程方法,我将功能设置为在各自的线程中执行,从而使您可以随意从实际上是事件侦听器/生成器的主线程中停止线程。您可以有一个在您的主线程中实例化的帮助程序类,例如 ThreadManager 或类似的东西,它们将嵌套用于管理运行线程(您的函数)的方法和对象/数组。
因此,主线程将捕获发出的事件,通过您的 ThreadManager 类生成新线程,并在触发具有较高“等级”的事件时停止它们。如果要在某些情况下保持同步(如果新任务不应该中断当前正在运行的任务),则可以在队列中设置函数调用。
这可能会花一些时间来建立,但最终可能会得到回报,我个人已在Python中将此模型用于类似的用例,并且效果很好。
答案 1 :(得分:0)
您可以在“ talk_to_lady”的顶部添加一个条件节点。 条件节点作为装饰器提供了一个条件,该条件只有完成舞蹈,然后执行“与女士交谈”行为。
Tree condition: "dance state" == "finish" while "talk_to_lady" sequence move_to_position talk while "dance" sequence dance_move_1 dance_move_2