项目说明

本行为树的代码使用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. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  2. CentOS7使用firewalld打开关闭防火墙与端口(转载)

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disabl ...

  3. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  4. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  5. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  6. 简单酷炫的canvas动画

    作为一个新人怀着激动而紧张的心情写了第一篇帖子还请大家多多支持,小弟在次拜谢. 驯鹿拉圣诞老人动画效果图如下 html如下: <div style="width:400px;heigh ...

  7. 似懂非懂的localStorage和sessionStorage

    一.区别 相信很多人都见过这两个关于HTML5的新名词!HTML5种的web storage包含两种存储方式:localStorage和sessionStorage,这两种方式存储的数据不会自动发给服 ...

  8. iOS网络4——Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发. 其实在网络开发中还有比较常用的就是网络 ...

  9. C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...

  10. MySQL加密

    MySQL字段加密和解密 1.加密:aes_encrypt('admin','key') 解密:aes_decrypt(password,'key') 2.双向加密 通过密钥去加密,解密的时候的只有知 ...