godot 行为树
游戏 AI 行为树的 GDScript 实现,基于本机 Godot 节点并使用内置场景树编辑器。
C# 版本 -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
安装
- 将“addons”文件夹复制到项目的主目录中。
- 从项目设置中启用插件,然后重新启动 Godot,否则它将无法识别新类(这是引擎的错误)。
- 或者,您还可以将 bt_example 文件夹拖到项目的主目录中。
- 要查看示例的工作情况,请运行 agent.tscn 场景。 ex_behavior_tree.tscn 场景是如何构建树的示例。
指示:
- 单击节点创建图标。您应该会看到新的节点可用(如果没有,请重新启动 Godot)。您必须使用 BehaviourTree 作为根节点,它应该只有一个子节点。该子节点可以是 BTNode 类别下的任何节点,它们都继承自 BTNode 类。
- 创建行为树后,您必须指定 AI(代理)的所有者以及正在使用的 Blackboard。黑板可以放在任何地方(假设它在树外),甚至可以在不同的树之间共享。该系统足够灵活,允许您决定如何以及何时更新黑板数据。例如,您可以使用处理更新黑板的脚本创建一个普通节点,例如。使用信号回调,甚至在 process() 中。或者,您可以从其他任何地方进行操作,甚至可以从树内部进行操作,只需确保以您可以维护和跟踪的方式进行设计即可。
- 行为树流程执行其每个子级,这些子级返回某种成功或失败状态。只有成功节点之后的分支才会被执行。 BTNode 必须返回成功或失败,并且只能通过yield() 调用来暂停执行,之后它将保持运行状态直到执行完成。当 BTNode 处于运行状态时,树将逐渐暂停执行(唯一的例外是 BTParallel ),直到所有子节点完成执行。这是出于优化目的。
- 树的流程由所谓的复合节点定义:BTSequence、BTSelector、BTRandomSelector、BTRandomSequence、BTParallel,它们都继承自 BTComposite。如果所有子级都成功,则序列成功;如果其中一个子级失败,则序列失败。选择器的逻辑相反,如果一个子级成功,则选择器成功;如果所有子级都失败,则选择器失败。并行将运行所有子级,并且无论如何都会成功,而无需等待子级完成执行。基本复合节点运行所有子节点并始终成功,但它也会等待执行完成。
- 你的AI行为的动作是在BTLeaf节点中进行的。添加 BTLeaf,然后执行“扩展脚本”。现在您可以通过重写_tick()方法在此脚本中定义您自己的行为。你的行动将在这里进行。请务必阅读基本脚本中的注释以了解最佳实践。还要记住 BTLeaf 不应该有孩子。
- BTDecorator 用于自定义子节点的执行。他们只能生育一个孩子。
- BTCConditional 是最常见的装饰器类型。添加 BTConditional 并扩展脚本,然后重写 _ pre_tick()方法来定义子进程的执行条件。请务必阅读评论,因为那里有一个有用的示例。
- BTGuards 是可用于临时锁定分支的装饰器。或者,您可以分配一个解锁器,这将覆盖指定的锁定时间。还可以选择分配储物柜。 BTGuard 可以使您的行为变得非常丰富、反应灵敏,并且经过优化,因为它们避免了不必要的分支和重复。
- 其他装饰器允许您循环执行、反转tick的结果等等。通过装饰器自定义执行可以做很多事情。
- 好的做法是使用提供的节点并遵循行为树的设计模式。但由于这是一个纯粹基于代码的实现,没有任何可视化编辑器,因此您对设计有很大的控制权,因此有一定的误差范围。这些只是有用的脚本,遵循一些“良好实践”,但如果没有一些基本规则,则不受它们的约束。由您决定如何设计行为树,但请记住,如果您误用它,您将无法从行为树模式的强大功能中受益。 (例如,您甚至可以将基本 BTNode 用于所有内容,然后每次都扩展它,尽管这会很混乱)
- 您可以拥有一个巨大的行为树,但最佳实践是遵循 Godot 的组件哲学,并为场景的每个组件制作几个较小的行为树。例如,你的运动控制器的一棵树,你的武器控制器的一棵树,你的探路者组件的一棵树,等等。行为树只能有一个黑板,但同一个黑板可以被许多树使用,所以这是如果您想拥有几棵树而不同时制作多个黑板,那么特别方便。就我个人而言,我之所以将黑板作为解耦组件,是因为我想让敌人小队共享相同的数据但行为独立,所以这是一个用例。此外,我的演员中通常有多个组件,并且我想对不同的树使用相同的数据库。