Artificial intelligence 行为树中的类状态动作

Artificial intelligence 行为树中的类状态动作,artificial-intelligence,behavior-tree,Artificial Intelligence,Behavior Tree,根据我对行为树的理解,每个行为都应该是一个简短的面向目标的动作,可以在几次迭代中完成 例如,下面是一个行为树的图像: 现在让我们假设,驱车前往敌人行为需要在树中进行多次迭代。因此,在每次传递时,都会调用“驱车前往敌人”,因为它现在处于运行状态 问题是如果附近有敌人,我想叫躲避敌人。考虑到驱车前往敌人总是被称为“躲避敌人”,我从来没有机会叫“躲避敌人”(可能应该被称为“躲避敌人”) 无论当前正在运行什么操作,每次通过时是否都要遍历树 我这样做对吗 处理这种行为的正确方法是什么 我想说,如果下面

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

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

现在让我们假设,驱车前往敌人行为需要在树中进行多次迭代。因此,在每次传递时,都会调用“驱车前往敌人”,因为它现在处于运行状态

问题是如果附近有敌人,我想叫躲避敌人。考虑到驱车前往敌人总是被称为“躲避敌人”,我从来没有机会叫“躲避敌人”(可能应该被称为“躲避敌人”)

  • 无论当前正在运行什么操作,每次通过时是否都要遍历树
  • 我这样做对吗
  • 处理这种行为的正确方法是什么

我想说,如果下面的想法对你不起作用,那么每次都要一路返回顶端将是你最后的选择:

正如Alex Champandard在其网站aigamedev.com中所建议的那样,最基本的想法是,当你处于“驱敌”行为时,你必须确保这种行为仍应继续

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

它看起来是这样的:

  • 主选择器:
    • 避敌
      • 定位敌人
      • 向相反方向行驶
    • 并行
      • 附近有敌人吗?
      • 追敌
        • 找到通往敌人的路
        • 投敌
        • 火力武器
    • 追逐旗
      • 定位标志
      • 找到路径
      • 驶向旗帜
  • 并行节点将重复不断地评估“附近有敌人吗?”节点(以合理的速度),即使执行深入到“追逐敌人”子树中。当“附近有敌人吗?”返回失败时,平行机将立即返回失败并跳过完成“追逐敌人”行为。因此,对您的树的下一次评估将达到“躲避敌人”行为

    “敌人在附近吗?”条件则充当一种断言检查或早期退出检查。本质上,它就像一个事件驱动的特性,您的树可以响应事件,即使它还没有完成迭代


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

    这是一个有趣的解决方案。我还使用了一个游戏引擎,它不太适合多线程,所以我喜欢你的工作。我将尝试实现类似的功能。另外,我看过Alex Champandard的教程,他的选择器似乎在整个树上迭代,即使某个节点正在“运行”,至少他的根选择器是这样做的。