项目重构,破坏性更新

This commit is contained in:
gongxh
2025-09-02 17:05:46 +08:00
parent 0b6b6c0be3
commit 7cd19a373b
18 changed files with 1059 additions and 989 deletions

170
README.md
View File

@@ -1,6 +1,71 @@
## 行为树
# 行为树
> 行为树是一种强大的 AI 决策系统,用于实现复杂的游戏 AI 行为
一个轻量级、高性能的 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(); // 输出: "攻击!"
```
#### 基本概念
@@ -19,44 +84,6 @@ enum Status {
- **条件节点 (Condition)**:判断条件的节点
- **装饰节点 (Decorator)**:修饰其他节点行为的节点
#### 使用示例
```typescript
import {
BehaviorTree,
Sequence,
Selector,
Parallel,
Success,
Failure,
WaitTime,
Agent,
Blackboard
} from 'kunpocc-behaviortree';
// 1. 创建行为树
const tree = new BehaviorTree(
new Sequence( // 顺序节点:按顺序执行所有子节点
new WaitTime(2), // 等待2秒
new Selector( // 选择节点:选择一个可执行的子节点
new Success(() => {
console.log("执行成功动作");
}),
new Failure(() => {
console.log("执行失败动作");
})
)
)
);
// 2. 创建代理和黑板
const agent = new Agent(); // AI代理
const blackboard = new Blackboard(); // 共享数据黑板
// 3. 执行行为树
tree.tick(agent, blackboard);
```
#### 常用节点
1. 组合节点
@@ -68,9 +95,12 @@ tree.tick(agent, blackboard);
// 选择节点:选择第一个成功或运行中的子节点
new Selector(childNode1, childNode2, childNode3);
// 并行节点:同时执行所有子节点
// 并行节点:同时执行所有子节点,全部成功才成功
new Parallel(childNode1, childNode2, childNode3);
// 并行任一成功节点:同时执行所有子节点,任一成功即成功
new ParallelAnySuccess(childNode1, childNode2, childNode3);
// 记忆顺序节点:记住上次执行的位置
new MemSequence(childNode1, childNode2, childNode3);
@@ -84,19 +114,15 @@ tree.tick(agent, blackboard);
2. 动作节点
```typescript
// 成功节点
new Success(() => {
// 执行动作
// 行动节点 - 返回指定状态
new Action(() => {
console.log("执行动作");
return Status.SUCCESS; // 或 Status.FAILURE, Status.RUNNING
});
// 失败节点
new Failure(() => {
// 执行动作
});
// 运行中节点
new Running(() => {
// 持续执行的动作
// 条件节点 - 检查条件返回成功或失败
new Condition((subject) => {
return subject.health > 50; // 返回 true 表示成功false 表示失败
});
// 等待节点
@@ -104,17 +130,39 @@ tree.tick(agent, blackboard);
new WaitTicks(5); // 等待5个tick
```
3. 使用黑板共享数据
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. 使用黑板共享数据
```typescript
// 在节点中使用黑板
class CustomAction extends Action {
tick(ticker: Ticker): Status {
// 获取数据
const data = ticker.blackboard.get("key");
class CustomAction extends BaseNode {
tick<T>(tree: BehaviorTree<T>): Status {
// 获取数据 - 使用节点实例作为命名空间
const data = tree.blackboard.get<string>("key", this);
// 设置数据
ticker.blackboard.set("key", "value");
// 设置数据 - 使用节点实例作为命名空间
tree.blackboard.set("key", "value", this);
return Status.SUCCESS;
}
@@ -136,6 +184,4 @@ tree.tick(agent, blackboard);
3. 性能优化:
- 使用黑板共享数据,避免重复计算
- 合理使用记忆节点,减少重复执行
- 控制行为树的深度,避免过于复杂
- 控制行为树的深度,避免过于复杂