mirror of
https://github.com/gongxh0901/kunpocc-behaviortree.git
synced 2025-12-26 16:48:56 +00:00
行为树详细介绍的文档
This commit is contained in:
252
docs/BehaviorTree.md
Normal file
252
docs/BehaviorTree.md
Normal file
@@ -0,0 +1,252 @@
|
||||
# 硬核游戏开发 - 使用BehaviorTree实现游戏AI决策的开发详解
|
||||
|
||||
## 🎮 一个让策划抓狂的Bug
|
||||
|
||||
> "这个BOSS太蠢了!它明明看到玩家了,为什么还在那里发呆?"
|
||||
|
||||
这是我在某公司实习时,听到最多的一句话。那是一个魔幻RPG项目,我负责实现一个"智能"的龙王BOSS。按照策划的设计文档,这个BOSS应该能够:
|
||||
|
||||
- 🔍 **侦察阶段**:在玩家进入领域前巡逻,警戒四周
|
||||
- ⚔️ **战斗阶段**:发现玩家后立即进入战斗状态,根据距离选择近战或远程攻击
|
||||
- 🩸 **血怒阶段**:血量低于30%时进入狂暴模式,攻击力翻倍
|
||||
- 🛡️ **防御阶段**:受到大量伤害时短暂防御,恢复少量血量
|
||||
- 💨 **逃跑阶段**:血量极低时尝试逃跑,寻找掩体
|
||||
|
||||
听起来很简单对吧?我天真地用了一堆 `if-else` 语句:
|
||||
|
||||
```javascript
|
||||
function updateBoss() {
|
||||
if (boss.hp < 0.1 * boss.maxHp) {
|
||||
if (canEscape()) {
|
||||
escape();
|
||||
} else if (canDefend()) {
|
||||
defend();
|
||||
} else {
|
||||
attack();
|
||||
}
|
||||
} else if (boss.hp < 0.3 * boss.maxHp) {
|
||||
if (playerInRange()) {
|
||||
berserkerAttack();
|
||||
} else {
|
||||
moveToPlayer();
|
||||
}
|
||||
} else if (playerDetected()) {
|
||||
if (playerDistance() < 5) {
|
||||
meleeAttack();
|
||||
} else {
|
||||
rangedAttack();
|
||||
}
|
||||
} else {
|
||||
patrol();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**结果?** 一场灾难!
|
||||
|
||||
- BOSS经常在攻击和防御之间疯狂切换
|
||||
- 有时候明明发现了玩家,却突然开始巡逻
|
||||
- 血怒状态下居然还会尝试逃跑
|
||||
- 最要命的是:每次策划要求调整优先级,我都要重写整个逻辑!
|
||||
|
||||
三个通宵后,我的代码变成了一个800行的意大利面条,连我自己都看不懂了。更糟糕的是,每次修复一个bug,就会产生三个新bug。
|
||||
|
||||
**直到我遇到了行为树...**
|
||||
|
||||
一周后,同样的BOSS逻辑,我用行为树重新实现了:
|
||||
|
||||
```
|
||||
龙王BOSS行为树:
|
||||
根节点(优先选择器)
|
||||
├── 逃跑分支(血量 < 10%)
|
||||
│ ├── 寻找掩体
|
||||
│ └── 快速移动
|
||||
├── 防御分支(受到重击)
|
||||
│ ├── 播放防御动画
|
||||
│ └── 恢复少量血量
|
||||
├── 血怒分支(血量 < 30%)
|
||||
│ ├── 进入狂暴状态
|
||||
│ └── 疯狂攻击
|
||||
├── 战斗分支(发现玩家)
|
||||
│ ├── 距离判断
|
||||
│ ├── 近战攻击 OR 远程攻击
|
||||
│ └── 追击玩家
|
||||
└── 巡逻分支(默认行为)
|
||||
├── 沿路径移动
|
||||
└── 警戒四周
|
||||
```
|
||||
|
||||
**奇迹发生了!**
|
||||
|
||||
- ✅ BOSS行为逻辑清晰,优先级明确
|
||||
- ✅ 策划可以直接看懂并提出修改意见
|
||||
- ✅ 新增行为只需要添加新分支,不影响现有逻辑
|
||||
- ✅ 调试时可以清楚看到每一步的决策过程
|
||||
- ✅ 代码从800行缩减到200行,可读性提升10倍!
|
||||
|
||||
更重要的是,当策划说"能不能让BOSS在血量50%时召唤小怪"时,我只需要在行为树中插入一个新分支,5分钟搞定!
|
||||
|
||||
---
|
||||
|
||||
**这就是行为树的魅力。**
|
||||
|
||||
作为一名游戏开发者,你是否也遇到过类似的问题?当游戏中的怪物、NPC需要表现出复杂行为时——巡逻、追击、逃跑、施法、观察环境并做出判断——背后往往不应该是一条又一条 if-else 的堆叠,而是一套清晰、可扩展、可调试的决策框架:**行为树(Behavior Tree)**。
|
||||
|
||||
本指南将带你从零开始认识行为树,让你也能构建出让策划赞不绝口的游戏 AI 决策系统!
|
||||
|
||||
## 一、开篇
|
||||
|
||||
行为树是一种用于描述 AI 决策逻辑的树形结构:由根节点驱动,组合节点(如「选择器」「序列」)负责控制流程,装饰节点用于修饰行为,叶子节点则执行具体动作或进行条件判断。相较有限状态机(FSM),行为树更易组合与复用,能自然表达“尝试 A 否则 B”“按顺序执行直到成功”等复杂模式,并且非常适合可视化编辑与热更新。
|
||||
|
||||
## 二、行为树执行流程 - 一个哥布林的日常决策
|
||||
|
||||
想象一下,你是一只聪明的哥布林守卫,正在洞穴门口值班。每一秒钟,你的大脑都在运转着一套复杂的决策系统——这就是行为树!
|
||||
|
||||
### 1. 三种人生状态(节点状态)
|
||||
|
||||
就像人生一样,行为树中的每个节点都只有三种可能的状态:
|
||||
|
||||
* **成功** ✅ - "太好了!任务完成!"
|
||||
* **失败** ❌ - "唉,这条路走不通..."
|
||||
* **运行中** ⏳ - "别催,我还在努力呢!"
|
||||
|
||||
这就像你在思考"今晚吃什么"时的状态:要么想到了(成功),要么放弃了(失败),要么还在纠结中(运行中)。
|
||||
|
||||
### 2. 决策节点大家族 - 每个都有自己的性格
|
||||
|
||||
#### 2.1 选择节点 - "备胎专家"
|
||||
|
||||
**性格特点**:永不放弃的乐观主义者,总是有Plan B、Plan C...
|
||||
|
||||
想象你是个饿肚子的哥布林,面前有三个选择:
|
||||
1. 去厨房找剩菜
|
||||
2. 去花园抓虫子
|
||||
3. 啃树皮充饥
|
||||
|
||||
选择节点就像一个不死心的你:
|
||||
- 先试试厨房有没有剩菜(第一个子节点)
|
||||
- 如果厨房空空如也(失败),那就去花园抓虫子(第二个子节点)
|
||||
- 虫子也没有?那就啃树皮吧(第三个子节点)
|
||||
- 只要有一个成功了,选择节点就满意地说:"搞定!"
|
||||
|
||||
**执行规则**:
|
||||
```
|
||||
从左到右挨个试:
|
||||
✅ 子节点成功 → "太好了!" → 选择节点成功
|
||||
❌ 子节点失败 → "下一个!" → 继续尝试
|
||||
⏳ 子节点运行中 → "等等..." → 选择节点也运行中
|
||||
```
|
||||
|
||||
#### 2.2 顺序节点 - "完美主义者"
|
||||
|
||||
**性格特点**:严格按计划执行,一步都不能错
|
||||
|
||||
还是那只饿肚子的哥布林,但这次你决定做一顿大餐:
|
||||
1. 先洗手
|
||||
2. 然后准备食材
|
||||
3. 接着开火做饭
|
||||
4. 最后享用美食
|
||||
|
||||
顺序节点就像一个强迫症患者:
|
||||
- 必须先洗手,洗不干净就不继续
|
||||
- 洗手成功了,才能准备食材
|
||||
- 食材准备好了,才能开火
|
||||
- 任何一步失败,整个计划泡汤!
|
||||
|
||||
**执行规则**:
|
||||
```
|
||||
严格按顺序来:
|
||||
✅ 子节点成功 → "很好,下一步!" → 继续执行
|
||||
❌ 子节点失败 → "完蛋了!" → 顺序节点失败
|
||||
⏳ 子节点运行中 → "慢慢来..." → 顺序节点等待
|
||||
```
|
||||
|
||||
#### 2.3 行为节点 - "实干家"
|
||||
|
||||
**性格特点**:话不多说,撸起袖子就是干
|
||||
|
||||
这是真正干活的节点,比如:
|
||||
- "巡逻10秒钟"
|
||||
- "攻击敌人"
|
||||
- "播放死亡动画"
|
||||
|
||||
行为节点就像一个靠谱的员工,给它一个任务,它会:
|
||||
- 立即开始执行(返回"运行中")
|
||||
- 完成后汇报结果("成功"或"失败")
|
||||
- 有些任务需要时间,会持续返回"运行中"
|
||||
|
||||
#### 2.4 条件节点 - "侦察兵"
|
||||
|
||||
**性格特点**:眼观六路,耳听八方,专门负责收集情报
|
||||
|
||||
条件节点就像哨兵,负责观察环境:
|
||||
- "敌人在视野内吗?"
|
||||
- "血量低于30%吗?"
|
||||
- "身上有钥匙吗?"
|
||||
|
||||
它们动作很快,瞬间给出答案:要么"是"(成功),要么"不是"(失败),没有"也许"。
|
||||
|
||||
### 3. 一个完整的哥布林决策故事
|
||||
|
||||
让我们看看一只哥布林守卫的完整思考过程:
|
||||
|
||||
```
|
||||
哥布林的行为树:
|
||||
根节点(选择)
|
||||
├── 战斗分支(顺序)
|
||||
│ ├── 条件:发现敌人?
|
||||
│ ├── 行为:冲向敌人
|
||||
│ └── 行为:攻击
|
||||
├── 巡逻分支(顺序)
|
||||
│ ├── 条件:在巡逻路径上?
|
||||
│ └── 行为:继续巡逻
|
||||
└── 待机分支
|
||||
└── 行为:原地等待
|
||||
```
|
||||
|
||||
**执行过程**:
|
||||
|
||||
1. **第一轮思考**:
|
||||
- 选择节点:"让我看看该做什么..."
|
||||
- 尝试战斗分支 → 检查"发现敌人?" → 没有敌人(失败)
|
||||
- 尝试巡逻分支 → 检查"在巡逻路径上?" → 是的(成功)→ 开始巡逻(运行中)
|
||||
|
||||
2. **第二轮思考**(巡逻进行中):
|
||||
- 选择节点:继续之前的决策
|
||||
- 巡逻分支:巡逻还在进行中...
|
||||
|
||||
3. **第三轮思考**(突然发现敌人):
|
||||
- 选择节点:重新评估
|
||||
- 尝试战斗分支 → "发现敌人?" → 有敌人!(成功)→ 冲向敌人(运行中)
|
||||
|
||||
这就是行为树的魅力:每一帧都在重新评估,动态调整策略,就像一个真正在思考的智能体!
|
||||
|
||||
### 4. 可视化流程图 - 让抽象变具体
|
||||
|
||||
看完了哥布林的故事,让我们用更直观的方式来理解行为树的执行过程。
|
||||
|
||||
#### 4.1 一颗简单的行为树结构
|
||||
|
||||

|
||||
|
||||
这就是我们刚才讲的哥布林决策树的可视化版本。每个方块代表一个节点,箭头表示执行流向。
|
||||
|
||||
#### 4.2 执行流程的"心跳"
|
||||
|
||||
行为树就像一颗跳动的心脏,每一帧(通常是1/60秒)都会从根节点开始"心跳"一次:
|
||||
|
||||

|
||||
|
||||
**执行流程就像这样**:
|
||||
1. **心跳开始** - 从根节点开始
|
||||
2. **向下探索** - 根据节点类型决定如何执行子节点
|
||||
3. **状态回传** - 叶子节点的结果层层向上传递
|
||||
4. **等待下次心跳** - 一帧结束,等待下一帧继续
|
||||
|
||||
这种"心跳式"的执行方式让AI能够:
|
||||
- 🔄 **实时响应**:每帧都重新评估环境
|
||||
- 🎯 **优先级明确**:重要的行为总是先被考虑
|
||||
- 🔧 **易于调试**:可以清楚看到每一步的决策过程
|
||||
- 🚀 **性能友好**:只执行必要的节点,避免浪费
|
||||
|
||||
> **小贴士**:想象行为树就像一个永不疲倦的大脑,每一瞬间都在问自己:"现在最应该做什么?"然后立即行动!
|
||||
237
docs/GUI-USED.md
Normal file
237
docs/GUI-USED.md
Normal file
@@ -0,0 +1,237 @@
|
||||
# 行为树使用指南
|
||||
|
||||
本指南将详细介绍如何使用 kunpocc-behaviortree 库和行为树编辑器。
|
||||
|
||||
## 一、开发环境
|
||||
- 引擎版本:Cocos Creator 3.8.6
|
||||
- 编程语言:TypeScript
|
||||
|
||||
|
||||
- 支持引擎版本:Cocos Creator 3.7 及之后的所有版本
|
||||
|
||||
|
||||
## 二、安装
|
||||
1. 安装 kunpocc-behaviortree
|
||||
```
|
||||
npm install kunpocc-behaviortree
|
||||
```
|
||||
|
||||
2. 下载扩展插件(bt-editor)
|
||||
|
||||
3. 项目脚本中引入库文件
|
||||
```typescript
|
||||
// 比如在项目代码目录下添加一个文件 header.ts
|
||||
// 写上如下代码
|
||||
import * as BT from "kunpocc-behaviortree";
|
||||
export { BT };
|
||||
```
|
||||
|
||||
4. 重启creator
|
||||
|
||||
5. 启用插件
|
||||
* 在 Cocos Creator 中选择 `扩展` -> `扩展管理器` -> `已安装扩展`
|
||||
* 找到 `bt-editor` 并启用
|
||||
|
||||
6. 打开扩展面板
|
||||
* 在 Cocos Creator 顶部菜单栏中选择 `extension or 扩展` -> `kunpo` -> `行为树编辑器`
|
||||
|
||||
|
||||
## 三、编辑器介绍
|
||||
|
||||
#### 快捷键
|
||||
|
||||
- **打开编辑器**: `Ctrl+Shift+K` (Windows) / `Cmd+Shift+K` (Mac)
|
||||
- **导出配置**: `Ctrl+Shift+L` (Windows) / `Cmd+Shift+L` (Mac)
|
||||
|
||||
#### 菜单访问
|
||||
|
||||
在 Cocos Creator 顶部菜单栏中选择 `extension or 扩展` -> `kunpo` -> `行为树编辑器`
|
||||
|
||||
|
||||
### 编辑器功能介绍
|
||||
|
||||
行为树编辑器提供了一个直观的可视化界面,让你可以轻松创建和管理复杂的行为树结构。
|
||||
|
||||
#### 可视化节点编辑
|
||||
- **拖拽创建**:从左侧节点库拖拽节点到画布中
|
||||
- **分组管理**:节点按功能分组显示,便于查找
|
||||
- **实时预览**:节点显示类型图标和描述信息
|
||||
|
||||
#### 属性参数配置
|
||||
- **类型校验**:支持数字、字符串、布尔值、对象、数组等类型
|
||||
- **默认值**:自动填充装饰器中定义的默认值
|
||||
- **约束验证**:支持最小值、最大值、步长等约束条件
|
||||
|
||||
#### 连接线管理
|
||||
- **可视连接**:通过拖拽连接点创建父子关系
|
||||
- **自动布局**:连接线自动避让,保持界面整洁
|
||||
- **连接验证**:防止创建非法的节点连接关系
|
||||
|
||||
#### 画布操作
|
||||
- **缩放平移**:鼠标滚轮缩放,拖拽平移画布
|
||||
- **多选操作**:支持框选多个节点进行批量操作
|
||||
|
||||
#### 节点管理
|
||||
- **别名设置**:为节点设置有意义的别名,便于理解
|
||||
- **复制粘贴**:快速复制节点及其子树结构
|
||||
- **删除操作**:删除节点时自动清理相关连接
|
||||
|
||||
### 导出文件使用
|
||||
|
||||
#### 在项目中使用导出配置
|
||||
|
||||
##### 1. 导出文件格式
|
||||
|
||||
```json
|
||||
{
|
||||
"boss1": [
|
||||
{
|
||||
"id": "1758206972710_bhxebhy7o",
|
||||
"className": "Sequence",
|
||||
"parameters": {},
|
||||
"children": [
|
||||
"1758090634327_mf36nwkdt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1758090634327_mf36nwkdt",
|
||||
"className": "Selector",
|
||||
"parameters": {},
|
||||
"children": [
|
||||
"1758206988178_55b7kk5va"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1758206988178_55b7kk5va",
|
||||
"className": "BTAnimation",
|
||||
"parameters": {
|
||||
"_name": "",
|
||||
"_loop": false
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
##### 2. 配置文件放入项目资源目录
|
||||
将从编辑器导出的JSON文件放入项目资源目录
|
||||
自行加载配置数据
|
||||
|
||||
```
|
||||
assets/
|
||||
├── resources/
|
||||
│ └── config/
|
||||
│ ├── bt_config.json // 所有行为树的信息都在这个里边
|
||||
```
|
||||
|
||||
##### 3. 创建行为树实例
|
||||
|
||||
```typescript
|
||||
// entity参数 可以是任意想要关联的类型
|
||||
let btTree1: BT.INodeConfig[] = this.bt_config.json["bt-tree1"]
|
||||
this._tree = BT.createBehaviorTree(btTree1, entity);
|
||||
```
|
||||
|
||||
## 四、扩展编辑器节点池
|
||||
|
||||
### 节点装饰器
|
||||
|
||||
装饰器系统是连接自定义节点和编辑器的桥梁
|
||||
只有通过装饰器装饰的节点,才能在编辑器中的节点池中显示
|
||||
|
||||
* 行为节点装饰器 ***ClassAction***
|
||||
* 条件节点装饰器 ***ClassCondition***
|
||||
* 组合节点装饰器 ***ClassComposite***
|
||||
* 装饰节点装饰器 ***ClassDecorator***
|
||||
* 属性装饰器 ***prop***
|
||||
|
||||
下面我们通过一段示例代码来展示一下装饰器的使用
|
||||
|
||||
```typescript
|
||||
// BT.ClassAction 是行为节点装饰器
|
||||
// MyNode参数需要和类名相同
|
||||
@BT.ClassAction("MyNode", { name: "显示名称", group: "节点分组", desc: "节点描述" })
|
||||
export class MyNode extends BT.LeafNode {
|
||||
|
||||
// 基础类型参数装饰器
|
||||
// type: 参数类型
|
||||
// description: 参数描述
|
||||
// defaultValue: 参数默认值
|
||||
// min: 参数最小值
|
||||
// max: 参数最大值
|
||||
// step:
|
||||
|
||||
@BT.prop({ type: BT.ParamType.string, description: "动画名称", defaultValue: "idle" })
|
||||
private animationName: string = "idle";
|
||||
|
||||
@BT.prop({ type: BT.ParamType.float, description: "速度", min: 0, max: 10, step: 0.1, defaultValue: 1.0 })
|
||||
private speed: number = 1.0;
|
||||
|
||||
@BT.prop({ type: BT.ParamType.bool, description: "是否循环" })
|
||||
private loop: boolean = false;
|
||||
|
||||
// 对象参数
|
||||
@BT.prop({
|
||||
type: BT.ParamType.object,
|
||||
description: "位置信息",
|
||||
properties: {
|
||||
x: { type: BT.ParamType.int, min: 0 },
|
||||
y: { type: BT.ParamType.int, min: 0 }
|
||||
}
|
||||
})
|
||||
private position: { x: number, y: number };
|
||||
|
||||
// 数组参数
|
||||
@BT.prop({
|
||||
type: BT.ParamType.array,
|
||||
description: "巡逻点列表",
|
||||
itemType: BT.ParamType.object,
|
||||
itemProperties: {
|
||||
x: { type: BT.ParamType.float },
|
||||
y: { type: BT.ParamType.float },
|
||||
name: { type: BT.ParamType.string }
|
||||
}
|
||||
})
|
||||
private patrolPoints: Array<{ x: number, y: number, name: string }>;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
为节点添加可在编辑器中配置的参数。
|
||||
|
||||
|
||||
#### 参数类型详解
|
||||
|
||||
| 类型 | BT.ParamType | 描述 | 支持属性 |
|
||||
|------|--------------|------|----------|
|
||||
| 整数 | `int` | 整数类型 | `min`, `max`, `step`, `defaultValue` |
|
||||
| 浮点数 | `float` | 浮点数类型 | `min`, `max`, `step`, `defaultValue` |
|
||||
| 字符串 | `string` | 字符串类型 | `defaultValue` |
|
||||
| 布尔 | `bool` | 布尔类型 | `defaultValue` |
|
||||
| 对象 | `object` | 对象类型 | `properties` |
|
||||
| 数组 | `array` | 数组类型 | `itemType`, `itemProperties` |
|
||||
|
||||
|
||||
## 五、更新声明
|
||||
|
||||
## 0.0.1 (2025-09-23)
|
||||
- 首版本
|
||||
|
||||
## 六、联系作者
|
||||
|
||||
* 邮箱: gong.xinhai@163.com
|
||||
* 微信: G0900901
|
||||
* 扫码加微信:
|
||||
|
||||
|
||||
## 七、版权声明
|
||||
此插件源代码可商业使用
|
||||
|
||||
商业授权范围仅限于在您自行开发的游戏作品中使用
|
||||
|
||||
不得进行任何形式的转售、租赁、传播等
|
||||
|
||||
|
||||
## 八、购买须知
|
||||
本产品为付费虚拟商品,一经购买成功概不退款,请在购买前谨慎确认购买内容。
|
||||
335
docs/USED.md
335
docs/USED.md
@@ -1,335 +0,0 @@
|
||||
# 行为树使用指南
|
||||
|
||||

|
||||
|
||||
本指南将详细介绍如何使用 kunpocc-behaviortree 库和行为树编辑器。
|
||||
|
||||
## 一、开发环境
|
||||
- 引擎版本:Cocos Creator 3.8.6
|
||||
- 编程语言:TypeScript
|
||||
|
||||
|
||||
- 支持引擎版本:Cocos Creator 3.7+
|
||||
|
||||
|
||||
## 二、安装
|
||||
1. 安装 kunpocc-behaviortree
|
||||
```
|
||||
npm install kunpocc-behaviortree
|
||||
```
|
||||
|
||||
2. 下载扩展插件(bt-editor)
|
||||
|
||||
3. 项目脚本中引入库文件
|
||||
```typescript
|
||||
// 比如在项目代码目录下添加一个文件 header.ts
|
||||
// 写上如下代码
|
||||
import * as BT from "kunpocc-behaviortree";
|
||||
export { BT };
|
||||
```
|
||||
|
||||
4. 重启creator
|
||||
|
||||
5. 启用插件
|
||||
* 在 Cocos Creator 中选择 `扩展` -> `扩展管理器` -> `已安装扩展`
|
||||
* 找到 `bt-editor` 并启用
|
||||
|
||||
6. 打开扩展面板
|
||||
* 在 Cocos Creator 顶部菜单栏中选择 `kunpo` -> `行为树编辑器`
|
||||
|
||||
7. 创建第一颗行为树 (见下方 `导出文件使用` 部分)
|
||||
|
||||
|
||||
|
||||
## 三、自定义节点 (扩展编辑器节点池)
|
||||
|
||||
### 节点装饰器
|
||||
|
||||
装饰器系统是连接自定义节点和编辑器的桥梁
|
||||
只有通过装饰器装饰的节点,才能在编辑器中的节点池中显示
|
||||
|
||||
#### @ClassAction - 行为节点装饰器
|
||||
|
||||
用于装饰执行具体逻辑的叶子节点。
|
||||
|
||||
```typescript
|
||||
@BT.ClassAction("NodeName", { name: "显示名称", group: "节点分组", desc: "节点描述" })
|
||||
export class MyActionNode extends BT.LeafNode {
|
||||
public tick(): BT.Status {
|
||||
// 执行逻辑
|
||||
return BT.Status.SUCCESS;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### @ClassCondition - 条件节点装饰器
|
||||
|
||||
用于装饰判断条件的节点。
|
||||
|
||||
```typescript
|
||||
@BT.ClassCondition("ConditionName", { name: "条件名称", group: "条件分组", desc: "节点描述" })
|
||||
export class MyCondition extends BT.Condition {
|
||||
protected isEligible(): boolean {
|
||||
// 返回判断结果
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### @ClassComposite - 组合节点装饰器
|
||||
|
||||
用于装饰控制子节点执行流程的组合节点。
|
||||
|
||||
```typescript
|
||||
@BT.ClassComposite("CompositeName", { name: "组合名称", group: "组合分组", desc: "节点描述" })
|
||||
export class MyComposite extends BT.Composite {
|
||||
public tick(dt: number): BT.Status {
|
||||
// 控制子节点执行逻辑
|
||||
for (const child of this.children) {
|
||||
const status = child._execute(dt);
|
||||
if (status !== BT.Status.SUCCESS) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
return BT.Status.SUCCESS;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### @ClassDecorator - 装饰节点装饰器
|
||||
|
||||
用于装饰修改单个子节点行为的装饰节点。
|
||||
|
||||
```typescript
|
||||
@BT.ClassDecorator("DecoratorName", { name: "装饰名称", group: "装饰分组", desc: "节点描述" })
|
||||
export class MyDecorator extends BT.Decorator {
|
||||
public tick(dt: number): BT.Status {
|
||||
// 装饰逻辑,修改子节点行为
|
||||
return this.children[0]._execute(dt);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 节点属性装饰器 (扩展节点参数)
|
||||
|
||||
为节点添加可在编辑器中配置的参数。
|
||||
|
||||
```typescript
|
||||
@BT.ClassAction("NodeName", { name: "显示名称", group: "节点分组", desc: "节点描述" })
|
||||
export class MyNode extends BT.LeafNode {
|
||||
// 基础类型参数
|
||||
@BT.prop({ type: BT.ParamType.string, description: "动画名称", defaultValue: "idle" })
|
||||
private animationName: string = "idle";
|
||||
|
||||
@BT.prop({ type: BT.ParamType.float, description: "速度", min: 0, max: 10, step: 0.1, defaultValue: 1.0 })
|
||||
private speed: number = 1.0;
|
||||
|
||||
@BT.prop({ type: BT.ParamType.bool, description: "是否循环" })
|
||||
private loop: boolean = false;
|
||||
|
||||
// 对象参数
|
||||
@BT.prop({
|
||||
type: BT.ParamType.object,
|
||||
description: "位置信息",
|
||||
properties: {
|
||||
x: { type: BT.ParamType.int, min: 0 },
|
||||
y: { type: BT.ParamType.int, min: 0 }
|
||||
}
|
||||
})
|
||||
private position: { x: number, y: number };
|
||||
|
||||
// 数组参数
|
||||
@BT.prop({
|
||||
type: BT.ParamType.array,
|
||||
description: "巡逻点列表",
|
||||
itemType: BT.ParamType.object,
|
||||
itemProperties: {
|
||||
x: { type: BT.ParamType.float },
|
||||
y: { type: BT.ParamType.float },
|
||||
name: { type: BT.ParamType.string }
|
||||
}
|
||||
})
|
||||
private patrolPoints: Array<{ x: number, y: number, name: string }>;
|
||||
}
|
||||
```
|
||||
|
||||
#### 参数类型详解
|
||||
|
||||
| 类型 | BT.ParamType | 描述 | 支持属性 |
|
||||
|------|--------------|------|----------|
|
||||
| 整数 | `int` | 整数类型 | `min`, `max`, `step`, `defaultValue` |
|
||||
| 浮点数 | `float` | 浮点数类型 | `min`, `max`, `step`, `defaultValue` |
|
||||
| 字符串 | `string` | 字符串类型 | `defaultValue` |
|
||||
| 布尔 | `bool` | 布尔类型 | `defaultValue` |
|
||||
| 对象 | `object` | 对象类型 | `properties` |
|
||||
| 数组 | `array` | 数组类型 | `itemType`, `itemProperties` |
|
||||
|
||||
|
||||
## 四、编辑器介绍
|
||||
|
||||
#### 快捷键
|
||||
|
||||
- **打开编辑器**: `Ctrl+Shift+K` (Windows) / `Cmd+Shift+K` (Mac)
|
||||
- **导出配置**: `Ctrl+Shift+L` (Windows) / `Cmd+Shift+L` (Mac)
|
||||
|
||||
#### 菜单访问
|
||||
|
||||
在 Cocos Creator 顶部菜单栏中选择 `kunpo` -> `行为树编辑器`
|
||||
|
||||
|
||||
### 编辑器功能介绍
|
||||
|
||||
行为树编辑器提供了一个直观的可视化界面,让你可以轻松创建和管理复杂的行为树结构。
|
||||
|
||||
#### 核心功能
|
||||
|
||||
##### 可视化节点编辑
|
||||
- **拖拽创建**:从左侧节点库拖拽节点到画布中
|
||||
- **分组管理**:节点按功能分组显示,便于查找
|
||||
- **实时预览**:节点显示类型图标和描述信息
|
||||
|
||||
##### 属性参数配置
|
||||
- **智能表单**:根据`@prop`装饰器自动生成配置界面
|
||||
- **类型校验**:支持数字、字符串、布尔值、对象、数组等类型
|
||||
- **默认值**:自动填充装饰器中定义的默认值
|
||||
- **约束验证**:支持最小值、最大值、步长等约束条件
|
||||
|
||||
##### 连接线管理
|
||||
- **可视连接**:通过拖拽连接点创建父子关系
|
||||
- **自动布局**:连接线自动避让,保持界面整洁
|
||||
- **连接验证**:防止创建非法的节点连接关系
|
||||
|
||||
##### 画布操作
|
||||
- **缩放平移**:鼠标滚轮缩放,拖拽平移画布
|
||||
- **多选操作**:支持框选多个节点进行批量操作
|
||||
|
||||
##### 节点管理
|
||||
- **别名设置**:为节点设置有意义的别名,便于理解
|
||||
- **复制粘贴**:快速复制节点及其子树结构
|
||||
- **删除操作**:删除节点时自动清理相关连接
|
||||
|
||||
##### 编辑器界面布局
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 顶部工具栏 │
|
||||
│ [设置导出路径] [过滤行为树] [选择行为树▼] [导出配置] │
|
||||
├─────────────┬─────────────────────────────────────────────┬─────────────────┤
|
||||
│ │ │ │
|
||||
│ 节点库 │ │ 右侧面板 │
|
||||
│ (左侧) │ │ │
|
||||
│ │ ┌───────────────────────────────────────┐ │ ┌──────────────┐│
|
||||
│ • 行为节点 │ │ 画布工具栏 │ │ │ 行为树名称 │ │
|
||||
│ • 条件节点 │ │ [缩放] [重置] [清空] [复制] [粘贴] │ │ │ 行为树描述 │ │
|
||||
│ • 组合节点 │ └─────────────────────────────────────────┘ │ └──────────────┘ │
|
||||
│ • 装饰节点 │ │ │
|
||||
│ • 内置节点 │ ┌─────────────────────────────────────────┐ │ ┌──────────────┐ │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ 画布操作区 │ │ │ 节点参数区 │ │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ ┌─────┐ │ │ │ • 节点名称 │ │
|
||||
│ │ │ │根节点│ │ │ │ • 参数配置 │ │
|
||||
│ │ │ └──┬──┘ │ │ │ • 描述信息 │ │
|
||||
│ │ │ │ │ │ │ • 别名设置 │ │
|
||||
│ │ │ ┌──▼──┐ ┌──────┐ │ │ │ │ │
|
||||
│ │ │ │子节点│ │子节点│ │ │ └──────────────┘ │
|
||||
│ │ │ └─────┘ └──────┘ │ │ │
|
||||
│ │ │ │ │ ┌──────────────┐ │
|
||||
│ │ │ │ │ │ [删除行为树] │ │
|
||||
│ │ └────────────────────────────────────────┘ │ │ [创建新树] │ │
|
||||
│ │ │ └──────────────┘ │
|
||||
└────────────┴──────────────────────────────────────────────┴──────────────────┘
|
||||
```
|
||||
|
||||
### 导出文件使用
|
||||
|
||||
#### 在项目中使用导出配置
|
||||
|
||||
##### 1. 配置文件格式
|
||||
|
||||
```json
|
||||
{
|
||||
"boss1": [
|
||||
{
|
||||
"id": "1758206972710_bhxebhy7o",
|
||||
"className": "Sequence",
|
||||
"parameters": {},
|
||||
"children": [
|
||||
"1758090634327_mf36nwkdt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1758090634327_mf36nwkdt",
|
||||
"className": "Selector",
|
||||
"parameters": {},
|
||||
"children": [
|
||||
"1758206988178_55b7kk5va"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1758206988178_55b7kk5va",
|
||||
"className": "BTAnimation",
|
||||
"parameters": {
|
||||
"_name": "",
|
||||
"_loop": false
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
##### 2. 配置文件放入项目资源目录
|
||||
将从编辑器导出的JSON文件放入项目资源目录
|
||||
自行加载配置数据
|
||||
|
||||
```
|
||||
assets/
|
||||
├── resources/
|
||||
│ └── config/
|
||||
│ ├── bt_config.json // 所有行为树的信息都在这个里边
|
||||
```
|
||||
|
||||
##### 3. 创建行为树实例
|
||||
|
||||
* BT.createBehaviorTree(config["boss1"], entity);
|
||||
|
||||
* 函数详解
|
||||
|
||||
```typescript
|
||||
// 工厂函数签名
|
||||
function createBehaviorTree<T>(config: INodeConfig[], entity: T): BehaviorTree<T>
|
||||
|
||||
// 内部工作流程:
|
||||
// 1. 验证配置格式
|
||||
// 2. 创建节点映射表 (id -> config)
|
||||
// 3. 递归创建节点树
|
||||
// - 通过className查找构造函数
|
||||
// - 根据节点类型选择创建方式
|
||||
// - 设置节点参数
|
||||
// - 建立父子关系
|
||||
// 4. 返回行为树实例
|
||||
```
|
||||
|
||||
## 五、更新声明
|
||||
|
||||
## 0.0.1 (2025-09-23)
|
||||
- 首版本
|
||||
|
||||
## 六、联系作者
|
||||
|
||||
* 邮箱: gong.xinhai@163.com
|
||||
* 微信: G0900901
|
||||
* 扫码加微信:
|
||||
|
||||
|
||||
## 七、版权声明
|
||||
此插件源代码可商业使用
|
||||
|
||||
商业授权范围仅限于在您自行开发的游戏作品中使用
|
||||
|
||||
不得进行任何形式的转售、租赁、传播等
|
||||
|
||||
|
||||
## 八、购买须知
|
||||
本产品为付费虚拟商品,一经购买成功概不退款,请在购买前谨慎确认购买内容。
|
||||
Reference in New Issue
Block a user