npm 包 behavior3ts 使用教程

前言

行为树(Behavior Tree)是一种常用于游戏开发和人工智能领域的算法,相比传统的有限状态机(FSM)和任务队列(BT)等方法,它更加灵活和易于扩展。在前端开发领域,我们也经常需要使用行为树来实现复杂的用户交互逻辑等。

本文将介绍一款使用 TypeScript 实现的行为树框架 behavior3ts,通过实例演示其使用方法,帮助读者掌握行为树的编写和使用技巧。

安装与导入

behavior3ts 可以通过 npm 包管理工具来进行安装,只需在项目根目录中运行如下命令即可:

--- ------- -----------

然后,在 TypeScript 代码中,我们需要通过引入 BehaviorTree、Composite、Decorator 等相关模块,来使用 behavior3ts 提供的各种类和方法:

------ - ------------- ----------- ---------- ---------- ------- --------- - ---- --------------

行为树结构

行为树是由节点(Node)和连接线(Edge)组成的树形结构,其中每个节点代表一种行为或决策,每个连接线则代表行为之间的联系和逻辑顺序。行为树的结构一般分为三种类型:组合节点(Composite)、装饰节点(Decorator)和行为节点(Action/Condition)。

组合节点

组合节点是行为树中的容器节点,可以组合多个子节点,形成一个完整的行为序列。组合节点主要分为如下几类:

  • Sequence
  • Priority
  • Parallel
  • RandomSequence
  • RandomPriority
  • MemSequence
  • MemPriority

以 Sequence 为例,它将所有子节点按照顺序执行,只有当所有子节点都返回 success 才返回 success,否则返回 failure。实现这个结构,我们可以这样编码:

-- --------
----- ------------ - --- ---------------- ------------------
----- ---------- - --- -------------

-- -------
----- -------------- ------- --------- -
  ------------- -
    --------
    ------------- - -
      --- ------------------------------- ----- --------- --- -- ---- -
      --- ------------------------------- ----- --------- --- -- ---- -
      --- ------------------------------- ----- --------- --- -- ---- -
    --
  -

  -- --------
  ------ ------------- --------------------- -
    ------ - ----------- ---------- --
  -
-

-- ---------
--------- --------------------- ------- ------------- -
  ----------- -----------
-

-- ------------ ------ --- -------- ----- ------------- -------- ---
----- -------- ------- ---------------------- ------- ------------- -
  ------ ------------------- ------- - ----- ------ -- -
    -------------------
  -
  --------- ----------------- --- ----- -
    --------------- ----------- ---------------
    ------ --------------
  -
-

组合节点的作用相当于编程语言中的分支结构,可以按照一定的规则判断子节点的执行顺序和停止条件。在 behavior3ts 中,组合节点还提供了多种预设的混合类型,可以更好地适配各种行为树需求。

装饰节点

装饰节点是行为树中的修饰性节点,可以用来修改或限制节点的执行情况,例如执行次数、执行时间、优先级等。装饰节点的常用类型有以下几种:

  • Repeater
  • MaxTime
  • Inverter
  • Succeeder
  • Failer
  • Error
  • UntilSuccess
  • UntilFailure

以 Repeater 为例,它将子节点无限次执行,直到某个子节点返回 failure 或达到指定执行次数为止。实现这个结构,我们可以这样编码:

-- --------
----- ------------ - --- ---------------- ------------------
----- ---------- - --- -------------

-- -------
----- -------------- ------- -------------------------------- -
  ------------- -
    --------
    ---------- - --- ------------------------------- ----- -------- --- -- ----
    -------------- - --- --------------------------------- -------- - --- -- ----
  -

  -- --------
  ------ ------------- --------------------- -
    ------ - ----------- ---------- --
  -
-

-- ---------
--------- --------------------- ------- ------------- -
  ----------- -----------
-

-- ------------ ------ --- -------- ----- ------------- -------- ---
----- -------- ------- ---------------------- ------- ------------- -
  ------ ------------------- ------- - ----- ------ -- -
    -------------------
  -
  --------- ----------------- --- ----- -
    --------------- ----------- ---------------
    ------ --------------
  -
-

装饰节点的作用相当于编程语言中的函数或方法,可以对子节点进行递归或循环调用,并在适当的时候返回或传递数据。

行为节点

行为节点是行为树中的基本执行单元,用来实现具体的行为操作或状态判断。行为节点的类型一般分为 Action(直接执行某项操作)和 Condition(判断某项条件)两种。例如:

-- ------------
----- -------- ------- --------------------------- -
  ------------------- ------- - ----- ------ -- -
    -------------------
  -
  --------- ----------------- ---------------- -
    --------------- ----------- ---------------
    ------ --------------
  -
-

-- ------------
----- ----------- ------- ------------------------------ -
  ------------------- ------- - ----- ------ -- -
    -------------------
  -
  --------- ----------------------- ---------------- -
    ------ -----
  -
-

-- -----
--------- --------------- ------- ------------- -
  -- ---
-

-- --------
----- -------- --------------- - - ----------- ---------- --

实际上,以上三种节点的区别并不是非常明显,它们的代码实现都很相似,都需要重写父类的 doAction 或 checkCondition 方法,并在其中进行具体的执行或判断操作。

实例演示

下面,我们通过一个实际的场景来演示 behavior3ts 的使用方法。该场景是一个玩具汽车遥控器的示例,用户可以通过控制器上的四个方向按钮,控制玩具车沿同一方向前进或后退。具体来说,该场景需要实现如下功能:

  • 当用户按下前进或后退按钮时,玩具车会向前或向后移动一定距离,然后停止。
  • 当用户再次按下同一方向的按钮时,玩具车会再次移动,直到再次按下另一方向的按钮或到达终点位置。
  • 当用户按下相反方向的按钮时,玩具车会停止前一种移动方式,立即转向并开始相反方向的移动。

按照上述需求,我们可以设计如下的行为树结构:

--------------
  -- --------------
       -- --------------
       -    -- --------------
       -         -- ----------
       -         -- ----------
       -- ------------

其中,Sequence 表示按一定的顺序执行两个子节点,Selector 表示按优先级执行两个子节点中的一项,Repeater 表示循环执行一个子节点,直到达到指定次数或条件不满足为止,Move 表示控制玩具车向前或向后移动一定距离,Wait 表示等待一段时间,Action 表示停止玩具车。

在代码中,我们可以这样实现这个行为树:

------ - ------------- ----------- ---------- ---------- ------- ----- - ---- --------------

-- --------
----- ------------ - --- ---------------- ------------------
----- ---------- - --- -------------

-- -------
----- -------------- ------- -------------------------------- -
  ------------- -
    --------
    ------------- - -
      -- ----
      --- ---------------------------------
        --------- -
          -- ----
          --- ---------------------------------
            --------- -
              -- ----
              --- --------------------------------- ------ -- -- ----- -- - -------- - -- ------ -- ---
              -- ----
              --- ------------------------------- ----- ------ ---
            --
          ---
          -- ----
          --- ------------------------------- ----- --------- ---
        --
      ---
    --
  -

  -- --------
  ------ ------------- --------------------- -
    ------ - ----------- ---------- --
  -
-

-- ---------
--------- --------------------- ------- ------------- -
  ----------- -----------
  -- ----------- ------ ----- ---
  ---------- -------
  -- -------
  -- -------
  -- -------
  -------- -------
-

-- --------
----- ---- ------- ----------------------------- -
  --------- ----------------- ---------------------- -
    --------------- ----------- ---------------
    --------- -- ----------------- - ---
    ------ --------------
  -
-
----- ---- ------- ----------------------------- -
  --------- ----------------- ---------------------- -
    --------------- ----------- ---------------
    ------ --------------
  -
-
----- ---- ------- ----------------------------- -
  --------- ----------------- ---------------------- -
    --------------- ----------- ---------------
    ----------------- - --
    ------ --------------
  -
-
----- ------- ------- ----------------------------- -
  --------- ----------------- ---------------------- -
    --------------- ----------- ---------------
    ----------------- - --
    --------- - --
    --------------- - --
    ------ --------------
  -
-

-- -------------
--------------------------- -- ---
------------------- -- ---
------------------------- ---- ---
-- -----
--------------------

在上面的代码中,我们首先定义了一个行为树类 MyBehaviorTree,该类继承自 Composite 类,表示组合节点顺序执行两个子节点。其中,第一个子节点是一个 Selector 选择节点,表示按照一定的优先级执行两个子节点中的一个。具体来说,该选择节点包含了两个子节点:一个循环节点 Repeater,一个行为节点 Action。

循环节点 Repeater 表示按照一定的次数(如 3 次)执行一个子节点,该子节点在具体实现中,会判断当前行动方向(direction)并执行前进或后退操作。该循环节点包含了一个 Sequence 顺序节点,用来按照一定的顺序执行两个子节点:行动(Move)和等待(Wait)。行动节点 Move 的作用是让玩具车向当前行动方向前进或后退一定距离(如 10px),等待节点 Wait 则是停顿一段时间(如 1s),以模拟玩具车到达目的地的效果。

行为节点 Action 则表示停止当前的移动操作,该节点实现中,会将当前行动方向(direction)置为 0,从而停止所有的移动操作。

最后,我们在代码中通过 blackboard 对象来设置行为树的上下文信息,包括当前行动方向(direction)、玩具车当前位置(x)和目标位置(targetX)。在行为树运行时,首先会执行 MyBehaviorTree 类的构造函数,生成一条完整的行为树,然后调用 Composite.tick() 方法来执行该树,并根据子节点的执行结果,返回 success 或 failure。

总结

通过以上代码实例,我们可以看到,行为树在前端开发领域中有着广泛的应用场景和实现方法。无论是游戏编程、人工智能还是用户交互等领域,行为树都可以提供一种简洁高效的算法实现,优化程序运行效率,提高代码的可读性和可维护性。

另外,使用 behavior3ts 框架可以大大简化行为树的实现和调试过程,提高开发效率,减少出错的可能性。虽然 behavior3ts 的学习门槛较高,但一旦掌握了其中的设计思想和使用技巧,就可以轻松实现各种复杂的行为树结构和逻辑,为项目的开发和部署提供了强有力的支持。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/600572c881e8991b448e8f29


猜你喜欢

  • npm 包 bind-once 使用教程

    什么是 bind-once bind-once 是一个能够性能优化 AngularJS 等前端框架的 npm 包。该包可减少 AngularJS 的脏值检测次数,提高数据绑定及页面渲染的效率。

    3 年前
  • npm 包 srt-webvtt 使用教程

    前言 随着视频的普及,字幕逐渐成为了观影的必要元素之一。字幕一般分为 SRT 和 WebVTT 两种格式。SRT 是一种简单易用的字幕格式,而 WebVTT 则可扩展性更好,支持更多样式和功能。

    3 年前
  • npm 包 ngx-scroll-viewport 使用教程

    近年来,前端领域的发展突飞猛进,各类前端包层出不穷。其中一个备受瞩目的 npm 包 ngx-scroll-viewport 可以帮助开发者实现全局滚动条控制,提升用户体验。

    3 年前
  • npm 包 vue-gridlex 使用教程

    前言 在前端开发中,有时需要实现栅格布局,而在使用 Bootstrap 以外的框架或者自建框架时,可以考虑使用 vue-gridlex 这个 npm 包。vue-gridlex 是一个 Vue 组件库...

    3 年前
  • npm 包 angular-file-picker-fixed 使用教程

    在前端开发过程中,文件上传功能是常见的需求之一。为了方便处理文件上传,常常会使用第三方库或框架。其中一个很优秀的解决方案就是 angular-file-picker-fixed npm 包。

    3 年前
  • npm 包 chem-constants 使用教程

    概述 chem-constants 是一款 npm 包,它提供了化学常数和物理常数的集合。在前端开发中,有时会需要使用这些常数,这时就可以使用 chem-constants 来简化开发。

    3 年前
  • npm 包 @kbye/ghcd 使用教程

    简介 在前端项目开发中,我们经常需要使用 Git 作为代码版本管理工具。与此同时,我们也经常需要在本地环境快速切换 Git 仓库分支。为了方便开发者进行分支切换,@kbye/ghcd 是一款基于 No...

    3 年前
  • npm 包 neutrino-middleware-extractstyles 使用教程

    neutrino-middleware-extractstyles 是一个基于 Neutrino 框架的 npm 包,用于将 .scss 和 .css 文件提取为单独的文件,并自动添加 link 标签...

    3 年前
  • npm 包 peer-crdt 使用教程

    简介 peer-crdt 是一个构建在 topological-crdt 之上的 npm 包。它的作用是用于实现无中心的多个端点之间的协同编辑。 在这篇文章中,我们将介绍 peer-crdt 的原理,...

    3 年前
  • npm 包 peer-crdt-bind-codemirror 使用教程

    前言 在 Web 前端开发中,使用 CodeMirror 框架来实现实时编码及协作是一个比较常见并且有用的需求,但是对于多用户协作时的数据同步及冲突处理,解决起来就比较棘手了。

    3 年前
  • npm包 iothon-serverside 使用教程

    序言 iothon-serverside 是一款基于Node.js 的 npm 包,可以让前端开发人员通过简单的配置,将 Vue 或 React 等前端框架的数据流进行离线处理,并实现数据存储。

    3 年前
  • npm 包 iothon-clientside 使用教程

    介绍 iothon-clientside 是一款前端的 npm 包,可以帮助开发人员实现集成 IOT 系统。 iothon 是一款全球化的物联网平台,提供了多种工具来协助用户更便捷地接入和操作物联网设...

    3 年前
  • npm 包 nodejs-easyapi 使用教程

    介绍 nodejs-easyapi 是一个基于 Node.js 的轻量级 Web 框架,它能够帮助开发者快速搭建 RESTful API。nodejs-easyapi 主要特点有以下几个方面: 支持...

    3 年前
  • npm 包 react-native-keyboard-mgr 使用教程

    React Native 是一款目前十分流行的移动端框架,它使得开发者能够用一种统一的语言、React 的语法,快速地完成跨平台应用的开发。但是在实际开发中,我们常常会面临键盘弹出、收起等一些问题,这...

    3 年前
  • npm 包 utility-kit 使用教程

    简介 npm 是 Node.js 的包管理器,提供了大量的常用模块供前端和后端进行开发。utility-kit 是一个实用的 npm 包,包括了常用的函数和工具库,便于前端开发人员调用。

    3 年前
  • 使用@kingstinct/react-native-ios-notification-actions实现iOS通知的交互

    前言 在iOS应用开发中,推送通知是一种常用的应用程序交互方式。应用程序可以在通知中使用某些操作让用户可以在通知中直接执行一些操作,例如,点击一个通知触发应用程序打开,或者从通知中直接回复一条消息。

    3 年前
  • npm 包 @plrthink/rollup-plugin-postcss 使用教程

    前言 在现代的 Web 开发过程中,CSS 样式已经成为前端开发必须的一部分。而随着样式表的逐渐增大和结构的复杂化,我们需要使用一些构建工具来帮我们处理和优化 CSS。

    3 年前
  • npm 包 find-this-value 使用教程

    在前端开发的过程中,我们经常需要从数据中找到特定的值来进行处理。此时,我们就需要使用一个可以快速定位到特定值的工具。在这里,我向大家介绍一个非常实用的 npm 包:find-this-value。

    3 年前
  • npm 包 incredible 使用教程

    在前端开发中,使用 npm 包已经成为不可或缺的一部分,它大大提高了开发效率,同时优化了代码质量和可维护性。其中,incredible 这个 npm 包是一个十分强大的工具,它可以用于创建交互式的命令...

    3 年前
  • npm 包 play-music-at-coup 使用教程

    随着社会与科技的快速发展,音乐已经成为现代生活中不可或缺的一部分。而在前端开发中,经常需要使用到音乐播放功能。为了更加方便地实现这一需求,npm 社区中涌现了很多优秀的音乐播放包。

    3 年前

相关推荐

    暂无文章