学习行为树的心得,以及如何使用BehaviorTree.js

首先给大家推荐两篇个人认为最好的,讲行为树的文章 行为树原理

还有Unreal引擎的这篇,应该算是进阶版 行为树进阶

然后自己在github上面找了一个相对比较受欢迎的行为树框架 BehaviorTree.js

README.md 中有两种方法

  1. 方法一: 一个个建立节点 BehaviorTree.register()
  2. 方法二: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
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值