状态与行为树中的行为相似

时间:2013-03-18 23:56:02

标签: artificial-intelligence

根据我对行为树的理解,每个行为应该是一个简短的目标导向行动,可以在几次迭代中完成。

因此,例如,下面是行为树的图像:

enter image description here

现在让我们假设 Drive To Enemy 行为在树中进行了多次迭代。因此,在每次传递时都会调用 Drive To Enemy ,因为它现在处于运行状态。

问题是,如果敌人在附近,我想打电话给 Evade Enemy 。考虑到 Drive To Enemy 总是被召唤,我永远不会有机会打电话给 Evade Enemy 应该叫做“避免敌人”)。

  • 无论当前正在运行什么操作,我都应该遍历树 EACH 传递吗?
  • 我是以正确的方式来做这件事的吗?
  • 处理此类行为的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

如果下面的想法对你不起作用,我会说每次遍历到最顶层都是你的最后选择:

正如Alex Champandard在他的网站aigamedev.com中建议的那样,基本的想法是,当你处于“驱动敌人”行为时,你include some sort of way to run some additional checks要确保仍然继续行为。< / p>

Alex的方法是使用parallel composite:一种同时运行其所有子节点的行为树节点。

看起来像这样:

  1. MainSelector:
    • 逃避敌人
      • 找到敌人
      • 以相反的方向行驶
    • <强>并行
      • Enemy在附近吗?
      • Chase Enemy
        • 寻找敌人的路径
        • 开车去敌人
        • 消防武器
    • 追逐旗帜
      • 找到标志
      • 查找路径
      • 开车标志
  2. Parallel节点将反复继续评估“Is Enemy Nearby?”节点(以合理的速度),即使执行深入“追逐敌人”子树。 “Enemy在附近?”返回失败,并行将立即返回失败并跳过完成“Chase Enemy”行为。因此,对树的下一次评估将达到“逃避敌人”的行为。

    “敌人在附近吗?”条件然后,作为一种断言检查或提前检查。从本质上讲,它就像一个事件驱动的特性,即使它还没有完成迭代,你的树也可以响应事件。

    我设计我的系统的方式,我不使用并行行为(不能使用我使用的第三方游戏引擎多线程)。相反,我有一个复合物做了几乎相同的事情,只是它评估每个子项遍历之间的检查。就像一种交错的,从正常执行到评估检查的来回跳跃。只有检查失败,我们才会跳回到顶部。