跳转至

BehaviorTree 纯代码行为树

BehaviorTree 扩展提供轻量的纯代码行为树。它适合敌人、NPC 或自动化流程中比状态机更灵活的优先级决策,但不绑定编辑器树、业务类型、异步任务取消或黑板字段规范。

核心模型

  • BTNode 是行为树节点基类,tick(blackboard) 返回 FRESHSUCCESSFAILURERUNNINGABORTED
  • SequenceSelectorParallel 和随机组合节点负责编排子节点。
  • InverterAlwaysSucceedCooldownTimeLimitRepeat 等装饰器只改变控制流,不解释业务语义。
  • Runner 持有根节点、黑板和运行时副本,并提供 tick 统计和调试快照。

最小流程

var check_hp := GFBehaviorTree.Condition.new(func(bb): return bb.hp < 30)
var flee_act := GFBehaviorTree.Action.new(func(_bb): return GFBehaviorTree.Status.SUCCESS)
var attack_act := GFBehaviorTree.Action.new(func(_bb): return GFBehaviorTree.Status.SUCCESS)

var root := GFBehaviorTree.Selector.new([
    GFBehaviorTree.Sequence.new([check_hp, flee_act]),
    attack_act,
])

var runner := GFBehaviorTree.Runner.new(root)
runner.blackboard = {"hp": 100}
runner.tick()

运行态与调试

SequenceSelector 会在子节点返回 RUNNING 时保留当前子节点索引,下次 tick() 从该位置继续;返回终态后重置索引。RandomSelectorRandomSequenceProbability 可传入 RandomNumberGenerator,便于固定种子测试、回放或模拟。

Runner 默认通过 duplicate_runtime() 复制运行树,让同一棵配置树可以安全交给多个 agent。自定义节点只要持有独立运行态、游标或缓存,就应重写 duplicate_runtime() 并返回自身类型的新实例。

get_debug_snapshot() 会输出根节点状态、tick 次数、耗时和黑板键;节点和 Runner 都可以清理调试状态,便于测试断言或运行时面板刷新。

使用边界

BehaviorTree 只提供节点组合、运行态复制、随机控制和调试快照。具体 AI 感知、目标选择、技能释放、导航、动画、网络同步和长期状态仍应由项目系统、黑板数据或项目自定义节点负责。

API Reference

完整类、方法和信号列表见 Behavior Tree API Reference