4

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

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

在此处输入图像描述

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

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

  • 无论当前正在运行什么动作,我都应该遍历 Tree EACH通道吗?
  • 我会以正确的方式解决这个问题吗?
  • 处理这种行为的正确方法是什么?
4

1 回答 1

4

如果以下想法对您不起作用,我会说每次都回到顶部将是您的最后手段:

正如 Alex Champandard 在他的网站 aigamedev.com 中所建议的那样,基本的想法是,当你处于“Drive To Enemy”行为中时,你包括某种方式来运行一些额外的检查,以确保该行为仍然应该继续.

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

它看起来像这样:

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

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

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

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

于 2013-03-31T00:40:34.237 回答