项目说明

本行为树的代码使用Lua编写,所有的内容也建立的Lua的基础语法之上

因为公司项目需求,需要一套Lua的行为树代码,所以尝试从饥荒中抽离了行为树相关的代码。绝大多数节点行为与饥荒中相同,不过部分节点因为也许需求也有部分变动

通用说明

行为树状态基本分为4种
READY:准备状态,节点还没有被调用过。或者已经调用结束被Reset之后的状态
RUNNING:正在运行的状态,通常父节点会等待子节点Runing结束才会将自己的状态标示为结束,当然部分节点不会理会子节点的Runing状态
SUCCESS:运行成功
FAILED:运行失败 绝大部分节点都有对应的中文名字,不过部分节点我也不知道怎么翻译 行为树会有被打断的情况,被打断时。子节点的Reset函数会被调用。必要的情况下重写Reset函数可以处理被打断的情况 行为树在某些情况下也会被暂停。这棵树中留下相关的暂停(Suspend)与重启(Restart)函数。需要树被暂停的时候外部调用,这个方法内部会将对应的方法传播到每一个节点之中

节点说明

BehaviourTree

树节点,主要用于子节点的调用,状态保存等。没有实际的业务功能

BehaviourNode

所有节点的父节点,没有实际的业务意义,主要是维护了各种基础状态的方法

DecoratorNode(装饰节点)

没有实际的业务意义,不过通常是只有一个子节点的节点的父类

ConditionNode(判定节点)

创建这个节点的时候传入一个能够获取判定值的方法,这个节点会根据运行到这个节点时,传入方法的调用后返回的值,改变当前节点的状态。nil 或者 false 转换为FAILED,否则转换为SUCCESS

ConditionWaitNode(条件等待节点)

与判定基本相同。不同的是在原本会判定为FAILED的情况下判定为RUNNING

ActionNode(动作节点)

创建这个节点的时候传入一个函数。当运行到这个节点的时候。会调用这个函数,并且将节点的状态标示为SUCCESS

WaitNode(等待节点)

创建这个节点时传入一个时间值。当运行到这个节点时,从开始到时间结束这个节点的状态会一直是RUNNING。等待时间结束后,节点状态会修改为SUCCESS。
PS:等待过程中,这个节点会休眠。用于减少性能消耗,其他类似功能节点在编写时,应该也需要做出适当的休眠

SequenceNode(顺序节点)

创建这个节点时,需要传入一个节点队列。当运行到这个节点时。他的子节点会一个接一个的运行。如果他的子节点状态是SUCCESS,那么他会运行下一个;如果他的子节点状态是RUNNING,那么他会将自身也标识成RUNNING,并且等待节点返回其他结果;如果他的子节点状态是FAILED,那么他会把自己的状态标识为FAILED并且直接返回。所有节点都返回结尾为SUCCESS那么他会将自身标识成为SUCCESS并且返回。

SelectorNode(选择节点)

与顺序节点类似,创建时需要传入一个节点列表,当运行到这个节点时,他的节点会一个接一个的运行。如果他的子节点是SUCCESS,那么他会将自身标识成为SUCCESS并且直接返回;如果他的子节点状态是RUNNING,那么他会将自身也标识成RUNNING,并且等待节点返回其他结果;如果他的子节点状态是FAILED,那么他会运行下一个。任何一个节点都没有返回SUCCESS的情况下,他将会将自身标识成为FAILED并且返回

NotDecorator(取反节点)

创建这个节点的时候需要传入一个子节点。并且将子节点的运行结果除了RUNNING外颠倒下结果并且返回

FailIfRunningDecorator

创建这个节点的时候需要传入一个子节点。并且将子节点的除了RUNNING结果以外标示为自己的结果;如果子节点的状态是RUNNING那么就讲自身的状态标识为FAILED。并且返回

RunningIfFailDecorator

创建这个节点的时候需要传入一个子节点。并且将子节点的除了FAILED结果以外标示为自己的结果;如果子节点的状态是FAILED那么就讲自身的状态标识为RUNNING。并且返回

LoopNode(循环节点)

创建这个节点的时候需要传入一个节点队列和最多循环的次数。循环节点将尝试执行N次后将自身标识为SUCCESS后返回结果。运行中的状态与顺序节点的逻辑大体一致,子节点的RUNNING会阻止下一个的运行,子节点的FAILED会中断运行

RandomNode(随机节点)

创建这个节点的时候需要传入一个节点队列和可以不传的列表对应的权重。在没有权重的情况下,所有的子节点完全随机。在有权重的情况下,子节点会按照权重的设置值来选择某一个节点来运行,并且将这个节点的运行结果标识为自己的状态,并且返回。
PS:权重的个数可以与子节点列表的个数不同。权重个数不足的将以1填充,超过的部分会被截断

ParallelNode(并行节点)

创建这个节点的时候需要传入一个节点队列。一个接一个的运行子节点。如果子节点的状态是FAILED,那么它会将自己标识为FAILED并且直接返回;如果子节点的状态是SUCCESS或者RUNNING,那么它会运行下一个节点。只有所有的节点都标识为SUCCESS它会将自己的标识为SUCCESS并且返回,否则他会将自己标识为RUNNING。
PS:部分节点(ConditionNode、NotDecorator)会在运行前被强制重启,用于判定

ParallelNodeAny

与ParallelNode基本相同,唯一不同的地方在于任何一个节点标识为SUCCESS的时候,它就会将自己的状态标识为SUCCESS并且返回

WhileNode

ParallelNode节点的扩展节点,创建这个节点的时候需要传入一个可以获取判定值的方法和一个子节点。当运行到这个节点的时候,需要先做判定,然后在执行后边的节点。如果判定失败则直接将自身标识为FAILED并且返回。否则将子节点的状态标识为自己的状态并且返回

IfNode

SequenceNode节点的扩展节点。与WhileNode节点基本一致,不同的是,判定的条件只有第一次进入的时候生效,之后的运行将直接运行后边的节点

Lua 项目地址 http://git.oschina.net/anxin1225/BehaviourTree

Lua BehaviourTree 各节点说明的更多相关文章

  1. Lua增加一个节点到文件中

    新建一个文件touch /etc/config/ddns 增加一个节点到文件中uci set ddns.newadd=config <config>:即配置文件,如ddns,ipv6等&l ...

  2. [Unity插件]Lua行为树(十):通用行为和通用条件节点

    在行为树中,需要扩展的主要是行为节点和条件节点.一般来说,每当要创建一个节点时,就要新建一个节点文件.而对于一些简单的行为节点和条件节点,为了去掉新建文件的过程,可以写一个通用版本的行为节点和条件节点 ...

  3. JavaScript jQuery 入门回顾

    ​$符号 $是著名的jQuery符号.实际上,jQuery把所有功能全部封装在一个全局变量jQuery中,而$也是一个合法的变量名,它是变量jQuery的别名: window.jQuery; // j ...

  4. 06jQuery-02-层级选择器

    因为DOM结构就是层级结构,所以我们经常要根据层级关系进行选择. 1.层级选择器 $('ancestor descendant'),选择祖先中的子孙,中间留空格: $('form[name=uploa ...

  5. 【JavaScript】jQuery

    No1: jQuery能帮我们干这些事情: 消除浏览器差异:你不需要自己写冗长的代码来针对不同的浏览器来绑定事件,编写AJAX等代码: 简洁的操作DOM的方法:写$('#test')肯定比docume ...

  6. 前端开发 - jQuery

    本节内容 一.jQuery概述 二.选择器 三.操作DOM 四.修改DOM结构 五.事件 六.动画 七.AJAX(待续) 八.扩展(待续) 一.jQuery概述 jQuery 是一个 JavaScri ...

  7. ngx_lua应用最佳实践

    引子: 以下文字,是UPYUN系统开发工程师timebug在SegmentFault D-Day南京站技术沙龙上所做分享的内容要义提炼,主题为UPYUN系统开发团队在进行业务逻辑由C模块到ngx_lu ...

  8. Luci实现框架

    转自:http://www.cnblogs.com/zmkeil/archive/2013/05/14/3078774.html 1.总述 上一篇总结了uhttpd的工作方式,openwrt中利用它作 ...

  9. JQuery入门篇

    JQuery入门篇 jQuery选择器 “$”表示JQuery对象 根据ID查找 $(‘#var’)表示将一个id值为var的DOM节点封装成一个jQuery对象,DOM节点必须以“#”开头. 例如: ...

随机推荐

  1. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  2. css中的浮动与三种清除浮动的方法

    说到浮动之前,先说一下CSS中margin属性的两种特殊现象 1, 外边距的合并现象: 如果两个div上下排序,给上面一个div设置margin-bottom,给下面一个div设置margin-top ...

  3. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  4. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  5. 关于BAPI_PATIENT_CREATE(病患主数据创建)

    第一次使用BAPI,遇到几个问题.现总结如下. CALL FUNCTION 'BAPI_PATIENT_CREATE' EXPORTING client = * INSTITUTION = '*' * ...

  6. GCC学习(1)之MinGW使用

    GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...

  7. Linux环境下常见漏洞利用技术(培训ppt+实例+exp)

    记得以前在drops写过一篇文章叫 linux常见漏洞利用技术实践 ,现在还可以找得到(https://woo.49.gs/static/drops/binary-6521.html), 不过当时开始 ...

  8. JAVA代码验证身份证信息

    java验证身份证信息代码 转自:http://www.blogjava.net/xylz/archive/2011/01/05/342330.html import java.util.Calend ...

  9. mono for android中使用dapper或petapoco对sqlite进行数据操作

    在mono for android中使用dapper或petapoco,很简单,新建android 类库项目,直接把原来的文件复制过来,对Connection连接报错部分进行注释和修改就可以运行了.( ...

  10. c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥

    对于微软开发者来说,每次BUILD大会都是值得期待的.这次也是惊喜满满,除了大众瞩目的WP8.1的发布还有一项会令开发者兴奋的技术出现:.NET NATIVE.下面就来详细了解一下其为何物. [小九的 ...