跳到主要内容

快速开始

安装

需要 Go 1.23 或更高版本。

go get github.com/henrytien/behavior-tree

包声明和导入名称需要区分:module path 是 github.com/henrytien/behavior-tree,根包声明应为 package behaviortree。Go 包名不能包含连字符,因此不会存在 package behavior-tree。示例中使用 b3 作为显式导入别名,方便调用 b3.SUCCESS 等 behavior3 风格常量。

从树文件加载

最常见的用法是在在线编辑器中设计行为树,导出为 JSON,然后在 Go 中加载执行。

package main

import (
"fmt"

b3 "github.com/henrytien/behavior-tree"
"github.com/henrytien/behavior-tree/config"
. "github.com/henrytien/behavior-tree/core"
"github.com/henrytien/behavior-tree/loader"
)

// 自定义 Action 节点
type LogTest struct {
Action
info string
}

func (n *LogTest) Initialize(setting *config.BTNodeCfg) {
n.Action.Initialize(setting)
n.info = setting.GetPropertyAsString("info")
}

func (n *LogTest) OnTick(tick *Tick) b3.Status {
fmt.Println("logtest:", n.info)
return b3.SUCCESS
}

func main() {
// 1. 加载导出的树配置
treeConfig, ok := config.LoadTreeCfg("tree.json")
if !ok {
panic("load tree failed")
}

// 2. 注册自定义节点
maps := b3.NewRegisterStructMaps()
maps.Register("Log", new(LogTest))

// 3. 构建行为树
tree := loader.CreateBehaviorTreeFromConfig(treeConfig, maps)
tree.Print() // 打印树结构

// 4. 每个对象一块黑板,循环 Tick
board := NewBlackboard()
for i := 0; i < 5; i++ {
tree.Tick(i, board)
}
}

关键点

  • Tick(target, blackboard)target 可以是任意对象(一般是 AI 的拥有者),内建节点不使用它,仅供自定义节点访问。
  • blackboard 是必须的:树本身不存状态,状态全在黑板里。一棵树可以配多块黑板驱动多个对象。
  • 自定义节点通过 RegisterStructMaps.Register(name, instance) 注册,name 对应编辑器里节点的 name 字段。

更多加载方式见示例(从工程文件、原生工程文件、子树等加载)。