## 行为树

> 行为树是一种强大的 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. 性能优化:
   - 使用黑板共享数据,避免重复计算
   - 合理使用记忆节点,减少重复执行
   - 控制行为树的深度,避免过于复杂