行为树中的状态类似动作

Fre*_*cer 4 artificial-intelligence behavior-tree

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

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

在此输入图像描述

现在让我们假设“驶向敌人”行为在树中需要多次迭代。因此,每次传递Drive To Enemy都会被调用,因为它现在处于运行状态。

问题是如果附近有敌人,我想呼叫躲避敌人。考虑到“Drive To Enemy”总是被称为“Drive To Enemy”,我从来没有机会调用“ Evade Enemy”可能应该被称为“Avoid Enemy”)。

  • 无论当前正在运行什么操作,我都应该每次遍历树吗?
  • 我以正确的方式处理这件事吗?
  • 处理这种行为的正确方法是什么?

Ano*_*dog 5

我想说,如果下面的想法不适合你,那么每次都回到顶部将是你最后的选择:

正如 Alex Champandard 在他的网站 aigamedev.com 中建议的那样,基本思想是,当您处于“驶向敌人”行为时,您可以采用某种方式来运行一些额外的检查,以确保该行为仍应继续。

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

它看起来像这样:

  1. 主选择器:
    • 躲避敌人
      • 找到敌人
      • 向相反方向行驶
    • 平行线
      • 敌人在附近吗?
      • 追击敌人
        • 寻找通往敌人的路径
        • 驶向敌人
        • 火武器
    • 追逐旗帜
      • 定位标志
      • 寻找路径
      • 开车去国旗

并行节点将反复不断地评估“敌人在附近吗?” 节点(以合理的速度),即使执行位于“追逐敌人”子树的深处。“敌人在附近吗?”的那一刻 返回失败,并行将立即返回失败并跳过完成“追逐敌人”行为。因此,对你的树的下一次评估将达到“躲避敌人”行为。

“敌人在附近吗?” 然后,条件充当一种断言检查或提前检查。本质上,它就像一个事件驱动的功能,即使树尚未完成迭代,它也可以响应事件。

不过,按照我设计系统的方式,我不使用并行行为(无法与我使用的第 3 方游戏引擎正确地进行多线程)。相反,我有一个复合体,它执行几乎相同的操作,只是它评估每个子级遍历之间的检查。就像一种交错,从正常执行到评估检查来回跳转。只有当检查失败时我们才会跳回顶部。