behaviortree

package
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2026 License: Apache-2.0 Imports: 0 Imported by: 0

Documentation

Overview

Package behaviortree 提供泛型行为树原语,用于游戏 AI 决策(小兵/怪物/NPC)。

解决的问题:FSM 处理线性状态转换简洁,但复杂 AI(MOBA 小兵"追击→攻击→ 撤退→巡逻"且可被打断)用 FSM 会变成意大利面状的状态爆炸。行为树通过树形 结构组合「条件检查」和「动作执行」,天然支持优先级打断与多帧异步任务。

与相邻原语的关系:

  • fsm 适合「生命周期状态流转」(房间、订单),行为树适合「每帧 AI 决策」;
  • gameloop/match 的 OnTick 内对每个 AI 实体调用 root.Tick(ctx);
  • 行为树不管 tick 调度——它是纯同步的"给定上下文,返回状态",调度在 gameloop。

核心设计(机制而非策略):

  • 三种状态:Running(进行中)、Success(成功)、Failure(失败);
  • 四种节点:Sequence(顺序)、Selector(选择)、Parallel(并行)、Decorator(装饰);
  • 叶子节点由业务定义(Action/Condition),本包只提供组合机制;
  • 泛型参数 T 是黑板(Blackboard)类型——AI 的共享上下文(目标位置、血量等), 业务自定义结构体,行为树只透传。

并发安全:Tick 本身不加锁(每个 AI 实体独立调用);节点定义(树结构)构建后只读。 零值不可用:用 Sequence/Selector/Parallel 等构造函数组装树。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Action

type Action[T any] func(bb *T) Status

Action 把普通函数适配为叶子节点。函数返回 Status 以支持多帧任务(Running)。

func (Action[T]) Tick

func (a Action[T]) Tick(bb *T) Status

type Condition

type Condition[T any] func(bb *T) bool

Condition 把布尔判断适配为叶子节点:true → Success,false → Failure。

func (Condition[T]) Tick

func (c Condition[T]) Tick(bb *T) Status

type Node

type Node[T any] interface {
	Tick(bb *T) Status
}

Node 是行为树的节点接口。T 是黑板类型(业务自定义的 AI 上下文)。

func Cooldown

func Cooldown[T any](ticks int, child Node[T]) Node[T]

Cooldown 冷却装饰器:子节点执行成功后,在 ticks 次 Tick 内跳过执行(返回 Failure)。 适合"技能 CD"或"巡逻间隔"等需要冷却的 AI 行为。 非并发安全(每个 AI 实体独占)。

func Guard

func Guard[T any](cond func(bb *T) bool, child Node[T]) Node[T]

Guard 守卫节点:先检查条件,条件通过才执行子节点;条件失败直接返回 Failure。 等价 Sequence(condition, child),但语义更清晰。

func Inverter

func Inverter[T any](child Node[T]) Node[T]

Inverter 取反:子节点 Success → Failure,Failure → Success,Running 不变。

func MemSelector

func MemSelector[T any](children ...Node[T]) Node[T]

MemSelector 记忆型选择节点:从上次返回 Running 的子节点继续。

func MemSequence

func MemSequence[T any](children ...Node[T]) Node[T]

MemSequence 记忆型顺序节点:从上次返回 Running 的子节点继续,而非每次从头。 适合多帧动画/寻路等需要跨 Tick 连续执行的场景。 非并发安全(每个 AI 实体独占)。

func Parallel

func Parallel[T any](policy ParallelPolicy, children ...Node[T]) Node[T]

Parallel 并行执行所有子节点(每次 Tick 全部都执行),按 policy 判定结果。 常用于"一边移动一边攻击"等并发行为。

func RepeatUntilFail

func RepeatUntilFail[T any](child Node[T]) Node[T]

RepeatUntilFail 重复执行子节点直到返回 Failure,然后返回 Success。 子节点返回 Running 时暂停,下次 Tick 继续。

func Repeater

func Repeater[T any](n int, child Node[T]) Node[T]

Repeater 重复执行子节点 n 次。子节点返回 Failure 时提前中止并返回 Failure; 子节点返回 Running 时暂停本次迭代,下次 Tick 继续当前迭代。 n <= 0 表示无限重复(只能被 Failure 中止)。 非并发安全(每个 AI 实体独占)。

func Selector

func Selector[T any](children ...Node[T]) Node[T]

Selector 选择执行子节点:依次 Tick 每个子节点,任一返回 Success 则立即返回 Success;任一返回 Running 则返回 Running;全部 Failure 则返回 Failure。 语义等价逻辑 OR(优先级选择)。

func Sequence

func Sequence[T any](children ...Node[T]) Node[T]

Sequence 顺序执行子节点:依次 Tick 每个子节点,任一返回 Failure 则立即返回 Failure;任一返回 Running 则返回 Running(下次 Tick 从头开始);全部 Success 则返回 Success。语义等价逻辑 AND。

注意:无记忆(stateless)——每次 Tick 从第一个子节点重新开始。 需要"从上次 Running 处继续"的场景用 MemSequence。

func Succeeder

func Succeeder[T any](child Node[T]) Node[T]

Succeeder 强制成功:无论子节点返回什么,都返回 Success(Running 除外)。

type ParallelPolicy

type ParallelPolicy int

ParallelPolicy 定义 Parallel 节点的成功/失败判定策略。

const (
	// RequireAll 所有子节点 Success 才 Success(任一 Failure 即 Failure)。
	RequireAll ParallelPolicy = iota
	// RequireOne 任一子节点 Success 即 Success(全部 Failure 才 Failure)。
	RequireOne
)

type Status

type Status int

Status 是行为树节点的执行结果。

const (
	// Running 表示节点尚未完成,下次 Tick 继续执行。
	Running Status = iota
	// Success 表示节点成功完成。
	Success
	// Failure 表示节点执行失败。
	Failure
)

func (Status) String

func (s Status) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL