Files
kunpocc-behaviortree/README.md

187 lines
5.0 KiB
Markdown
Raw Normal View History

2025-09-02 17:05:46 +08:00
# 行为树
2025-06-04 23:10:59 +08:00
2025-09-02 17:05:46 +08:00
一个轻量级、高性能的 TypeScript 行为树库专为游戏AI和决策系统设计。
## 特性
- 🚀 **高性能**: 优化的节点执行机制,最小化运行时开销
- 🎯 **类型安全**: 完整的 TypeScript 支持,严格的类型检查
- 🧩 **模块化**: 清晰的节点类型体系,易于扩展
- 🔄 **记忆节点**: 支持记忆型组合节点,优化复杂决策流程
- 📦 **零依赖**: 不依赖任何第三方库
- 🎮 **游戏优化**: 专为游戏场景优化的黑板系统和状态管理
## 安装
```bash
npm install kunpocc-behaviortree
```
## 快速开始
```typescript
import {
BehaviorTree,
Action,
Condition,
Sequence,
Selector,
Status
} from 'kunpocc-behaviortree';
// 定义AI角色
interface Character {
health: number;
hasWeapon: boolean;
}
const character: Character = {
health: 80,
hasWeapon: true
};
// 创建条件节点
const isHealthLow = new Condition((char: Character) => char.health < 30);
const hasWeapon = new Condition((char: Character) => char.hasWeapon);
// 创建行动节点
const flee = new Action(() => {
console.log("逃跑!");
return Status.SUCCESS;
});
const attack = new Action(() => {
console.log("攻击!");
return Status.SUCCESS;
});
// 构建行为树:生命值低时逃跑,否则攻击
const tree = new BehaviorTree(character,
new Selector(
new Sequence(isHealthLow, flee),
new Sequence(hasWeapon, attack)
)
);
// 执行行为树
tree.tick(); // 输出: "攻击!"
```
2025-06-04 23:10:59 +08:00
#### 基本概念
1. 节点状态
```typescript
enum Status {
SUCCESS, // 成功
FAILURE, // 失败
RUNNING // 运行中
}
```
2. 节点类型
- **动作节点 (Action)**:执行具体行为的叶子节点
- **组合节点 (Composite)**:控制子节点执行顺序的节点
- **条件节点 (Condition)**:判断条件的节点
- **装饰节点 (Decorator)**:修饰其他节点行为的节点
#### 常用节点
1. 组合节点
```typescript
// 顺序节点:按顺序执行所有子节点,直到遇到失败或运行中的节点
new Sequence(childNode1, childNode2, childNode3);
// 选择节点:选择第一个成功或运行中的子节点
new Selector(childNode1, childNode2, childNode3);
2025-09-02 17:05:46 +08:00
// 并行节点:同时执行所有子节点,全部成功才成功
2025-06-04 23:10:59 +08:00
new Parallel(childNode1, childNode2, childNode3);
2025-09-02 17:05:46 +08:00
// 并行任一成功节点:同时执行所有子节点,任一成功即成功
new ParallelAnySuccess(childNode1, childNode2, childNode3);
2025-06-04 23:10:59 +08:00
// 记忆顺序节点:记住上次执行的位置
new MemSequence(childNode1, childNode2, childNode3);
// 记忆选择节点:记住上次执行的位置
new MemSelector(childNode1, childNode2, childNode3);
// 随机选择节点:随机选择一个子节点执行
new RandomSelector(childNode1, childNode2, childNode3);
```
2. 动作节点
```typescript
2025-09-02 17:05:46 +08:00
// 行动节点 - 返回指定状态
new Action(() => {
console.log("执行动作");
return Status.SUCCESS; // 或 Status.FAILURE, Status.RUNNING
2025-06-04 23:10:59 +08:00
});
2025-09-02 17:05:46 +08:00
// 条件节点 - 检查条件返回成功或失败
new Condition((subject) => {
return subject.health > 50; // 返回 true 表示成功false 表示失败
2025-06-04 23:10:59 +08:00
});
// 等待节点
new WaitTime(2); // 等待2秒
new WaitTicks(5); // 等待5个tick
```
2025-09-02 17:05:46 +08:00
3. 装饰节点
```typescript
// 反转节点 - 反转子节点的成功/失败状态
new Inverter(childNode);
// 重复节点 - 重复执行子节点指定次数
new Repeat(childNode, 3);
// 重复直到失败 - 重复执行直到子节点失败
new RepeatUntilFailure(childNode, 5);
// 重复直到成功 - 重复执行直到子节点成功
new RepeatUntilSuccess(childNode, 5);
// 时间限制节点 - 限制子节点执行时间
new LimitTime(childNode, 5); // 5秒
// 次数限制节点 - 限制子节点执行次数
new LimitTimes(childNode, 3);
```
4. 使用黑板共享数据
2025-06-04 23:10:59 +08:00
```typescript
// 在节点中使用黑板
2025-09-02 17:05:46 +08:00
class CustomAction extends BaseNode {
tick<T>(tree: BehaviorTree<T>): Status {
// 获取数据 - 使用节点实例作为命名空间
const data = tree.blackboard.get<string>("key", this);
2025-06-04 23:10:59 +08:00
2025-09-02 17:05:46 +08:00
// 设置数据 - 使用节点实例作为命名空间
tree.blackboard.set("key", "value", this);
2025-06-04 23:10:59 +08:00
return Status.SUCCESS;
}
}
```
#### 注意事项
1. 节点状态说明:
- `SUCCESS`:节点执行成功
- `FAILURE`:节点执行失败
- `RUNNING`:节点正在执行中
2. 组合节点特性:
- `Sequence`:所有子节点返回 SUCCESS 才返回 SUCCESS
- `Selector`:任一子节点返回 SUCCESS 就返回 SUCCESS
- `Parallel`:并行执行所有子节点
- `MemSequence/MemSelector`:会记住上次执行位置
3. 性能优化:
- 使用黑板共享数据,避免重复计算
- 合理使用记忆节点,减少重复执行
2025-09-02 17:05:46 +08:00
- 控制行为树的深度,避免过于复杂