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