mirror of
https://github.com/Gongxh0901/kunpolibrary
synced 2025-04-10 21:51:04 +00:00
142 lines
3.4 KiB
Markdown
142 lines
3.4 KiB
Markdown
## 行为树
|
|
|
|
> 行为树是一种强大的 AI 决策系统,用于实现复杂的游戏 AI 行为。
|
|
|
|
#### 基本概念
|
|
|
|
1. 节点状态
|
|
```typescript
|
|
enum Status {
|
|
SUCCESS, // 成功
|
|
FAILURE, // 失败
|
|
RUNNING // 运行中
|
|
}
|
|
```
|
|
|
|
2. 节点类型
|
|
- **动作节点 (Action)**:执行具体行为的叶子节点
|
|
- **组合节点 (Composite)**:控制子节点执行顺序的节点
|
|
- **条件节点 (Condition)**:判断条件的节点
|
|
- **装饰节点 (Decorator)**:修饰其他节点行为的节点
|
|
|
|
#### 使用示例
|
|
|
|
```typescript
|
|
import {
|
|
BehaviorTree,
|
|
Sequence,
|
|
Selector,
|
|
Parallel,
|
|
Success,
|
|
Failure,
|
|
WaitTime,
|
|
Agent,
|
|
Blackboard
|
|
} from 'kunpocc';
|
|
|
|
// 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. 组合节点
|
|
|
|
```typescript
|
|
// 顺序节点:按顺序执行所有子节点,直到遇到失败或运行中的节点
|
|
new Sequence(childNode1, childNode2, childNode3);
|
|
|
|
// 选择节点:选择第一个成功或运行中的子节点
|
|
new Selector(childNode1, childNode2, childNode3);
|
|
|
|
// 并行节点:同时执行所有子节点
|
|
new Parallel(childNode1, childNode2, childNode3);
|
|
|
|
// 记忆顺序节点:记住上次执行的位置
|
|
new MemSequence(childNode1, childNode2, childNode3);
|
|
|
|
// 记忆选择节点:记住上次执行的位置
|
|
new MemSelector(childNode1, childNode2, childNode3);
|
|
|
|
// 随机选择节点:随机选择一个子节点执行
|
|
new RandomSelector(childNode1, childNode2, childNode3);
|
|
```
|
|
|
|
2. 动作节点
|
|
|
|
```typescript
|
|
// 成功节点
|
|
new Success(() => {
|
|
// 执行动作
|
|
});
|
|
|
|
// 失败节点
|
|
new Failure(() => {
|
|
// 执行动作
|
|
});
|
|
|
|
// 运行中节点
|
|
new Running(() => {
|
|
// 持续执行的动作
|
|
});
|
|
|
|
// 等待节点
|
|
new WaitTime(2); // 等待2秒
|
|
new WaitTicks(5); // 等待5个tick
|
|
```
|
|
|
|
3. 使用黑板共享数据
|
|
|
|
```typescript
|
|
// 在节点中使用黑板
|
|
class CustomAction extends Action {
|
|
tick(ticker: Ticker): Status {
|
|
// 获取数据
|
|
const data = ticker.blackboard.get("key");
|
|
|
|
// 设置数据
|
|
ticker.blackboard.set("key", "value");
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
}
|
|
```
|
|
|
|
|
|
#### 注意事项
|
|
|
|
1. 节点状态说明:
|
|
- `SUCCESS`:节点执行成功
|
|
- `FAILURE`:节点执行失败
|
|
- `RUNNING`:节点正在执行中
|
|
2. 组合节点特性:
|
|
- `Sequence`:所有子节点返回 SUCCESS 才返回 SUCCESS
|
|
- `Selector`:任一子节点返回 SUCCESS 就返回 SUCCESS
|
|
- `Parallel`:并行执行所有子节点
|
|
- `MemSequence/MemSelector`:会记住上次执行位置
|
|
3. 性能优化:
|
|
- 使用黑板共享数据,避免重复计算
|
|
- 合理使用记忆节点,减少重复执行
|
|
- 控制行为树的深度,避免过于复杂
|
|
|
|
|