根据我对行为树的理解,每个行为应该是一个简短的目标导向行动,可以在几次迭代中完成。
因此,例如,下面是行为树的图像:
现在让我们假设 Drive To Enemy 行为在树中进行了多次迭代。因此,在每次传递时都会调用 Drive To Enemy ,因为它现在处于运行状态。
问题是,如果敌人在附近,我想打电话给 Evade Enemy 。考虑到 Drive To Enemy 总是被召唤,我永远不会有机会打电话给 Evade Enemy (应该叫做“避免敌人”)。
答案 0 :(得分:4)
如果下面的想法对你不起作用,我会说每次遍历到最顶层都是你的最后选择:
正如Alex Champandard在他的网站aigamedev.com中建议的那样,基本的想法是,当你处于“驱动敌人”行为时,你include some sort of way to run some additional checks要确保仍然继续行为。< / p>
Alex的方法是使用parallel composite:一种同时运行其所有子节点的行为树节点。
看起来像这样:
Parallel节点将反复继续评估“Is Enemy Nearby?”节点(以合理的速度),即使执行深入“追逐敌人”子树。 “Enemy在附近?”返回失败,并行将立即返回失败并跳过完成“Chase Enemy”行为。因此,对树的下一次评估将达到“逃避敌人”的行为。
“敌人在附近吗?”条件然后,作为一种断言检查或提前检查。从本质上讲,它就像一个事件驱动的特性,即使它还没有完成迭代,你的树也可以响应事件。
我设计我的系统的方式,我不使用并行行为(不能使用我使用的第三方游戏引擎多线程)。相反,我有一个复合物做了几乎相同的事情,只是它评估每个子项遍历之间的检查。就像一种交错的,从正常执行到评估检查的来回跳跃。只有检查失败,我们才会跳回到顶部。