首先给大家推荐两篇个人认为最好的,讲行为树的文章 行为树原理
还有Unreal引擎的这篇,应该算是进阶版 行为树进阶
然后自己在github
上面找了一个相对比较受欢迎的行为树框架 BehaviorTree.js
README.md
中有两种方法
- 方法一: 一个个建立节点
BehaviorTree.register()
- 方法二: 用
BehaviorTreeImporter
一次性导入json
格式的行为树
第一种方法
有三种状态,actionA
, actionB
, actionC
,并且给与它们一个共同的selector
节点,此树从左向右执行,其中一种状态返回结果为SUCCESS
的话就直接返回整个树的结果 SUCCESS
,如果状态返回的是FAILURE
,那么继续执行右边的节点, 如果所有叶子节点都是FAILURE
,那么整个树返回 FAILURE
。
用一个对象来表示下:
let board = {
actionA: () => console.log("actionA"),
actionB: () => console.log("actionB"),
actionC: () => console.log("actionC"),
};
这里的board
其实就是以后要传到行为树中的blackboard
。
blackboard
是行为树中很重要的概念。我一开始也不太理解,后来想到其实就是黑板的原意。
我们把这个对象的一切行为都写在黑板上向大家展示。然后再输入到行为树的框架中,通过逻辑运算来控制,告知大家黑板上的当前行为在当前状态下如何运行。 我们先注册下每个行为:
const {
BehaviorTree,
BehaviorTreeImporter,
Sequence,
Selector,
Random,
Task,
SUCCESS,
FAILURE,
RUNNING,
} = require("behaviortree"); //npm下载以后先按需require一下
BehaviorTree.register(
"actionA", // 此行为,或者叫任务的名字
new Task({
//行为树会根据条件执行的构造函数
run: (blackboard) => {
blackboard.actionA();
return SUCCESS;
},
})
);
BehaviorTree.register(
"actionB",
new Task({
run: (blackboard) => {
blackboard.actionB();
return SUCCESS;
},
})
);
BehaviorTree.register(
"actionC",
new Task({
run: (blackboard) => {
blackboard.actionB();
return SUCCESS;
},
})
);
我们不满足于简单执行,所以我希望给其中的某一个行为加上一个修饰节点,而我加上的是条件节点。 这个条件节点是我自己写的,目的是,如果为true
,就执行此节点以及此节点为根部的所有叶子节点,如果为false
, 则直接返回 FAILURE
,而不执行这一支的节点。
const {
FAILURE, Decorator } = require("behaviortree");
module.exports = class ConditionDecorator extends Decorator {
constructor