Fre*_*cer 4 artificial-intelligence behavior-tree
根据我对行为树的理解,每个行为应该是一个简短的面向目标的行动,可以在几次迭代中完成。
例如,下面是行为树的图像:

现在让我们假设“驶向敌人”行为在树中需要多次迭代。因此,每次传递Drive To Enemy都会被调用,因为它现在处于运行状态。
问题是如果附近有敌人,我想呼叫躲避敌人。考虑到“Drive To Enemy”总是被称为“Drive To Enemy”,我从来没有机会调用“ Evade Enemy”(可能应该被称为“Avoid Enemy”)。
我想说,如果下面的想法不适合你,那么每次都回到顶部将是你最后的选择:
正如 Alex Champandard 在他的网站 aigamedev.com 中建议的那样,基本思想是,当您处于“驶向敌人”行为时,您可以采用某种方式来运行一些额外的检查,以确保该行为仍应继续。
Alex 的方法是使用并行复合:一种同时运行其所有子节点的行为树节点。
它看起来像这样:
并行节点将反复不断地评估“敌人在附近吗?” 节点(以合理的速度),即使执行位于“追逐敌人”子树的深处。“敌人在附近吗?”的那一刻 返回失败,并行将立即返回失败并跳过完成“追逐敌人”行为。因此,对你的树的下一次评估将达到“躲避敌人”行为。
“敌人在附近吗?” 然后,条件充当一种断言检查或提前检查。本质上,它就像一个事件驱动的功能,即使树尚未完成迭代,它也可以响应事件。
不过,按照我设计系统的方式,我不使用并行行为(无法与我使用的第 3 方游戏引擎正确地进行多线程)。相反,我有一个复合体,它执行几乎相同的操作,只是它评估每个子级遍历之间的检查。就像一种交错,从正常执行到评估检查来回跳转。只有当检查失败时我们才会跳回顶部。