项目说明

本行为树的代码使用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. HTTP常用状态码分析

    不管是面试还是工作中,经常会碰到需要通过HTTP状态码去判断问题的情况,比如对于后台RD,给到前端FE的一个接口,出现502或者504 error错误,FE就会说接口存在问题,如果没有知识储备,那就只 ...

  2. 前端学HTTP之实体和编码

    前面的话 每天都有各种媒体对象经由HTTP传送,如图像.文本.影片以及软件程序等.HTTP要确保它的报文被正确传送,识别.提取以及适当处理.为了实现这些目标,HTTP使用了完善的标签来描述承载内容的实 ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-Web打印

    系列目录 前言 1.本次主要弥补工作流,用户表单数据的打印 2.使用JQprint做为web打印插件 3.兼容:FireFox,Chrome,IE. 4.没有依赖也没有配置,使用简单 代码下载:htt ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理

    系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...

  5. OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)

    上一节我们启用了 Open vSwitch,本节将查看当前的网络状态并介绍 Open vSwitch 涉及的各种网络设备 初始网络状态 查看一下当前的网络状态. 控制节点 ifconfig 显示控制节 ...

  6. CSS 3学习——边框

    在CSS 3中可以设置边框圆角.边框阴影和边框图像,分别通过border-radius.border-image和box-shadow属性设置. 边框圆角 border-radius属性是以下4个属性 ...

  7. LoadRunner函数百科叒叒叒更新了!

    首先要沉痛通知每周四固定栏目[学霸君]由于小编外派公干,本周暂停. 那么这周就由云层君来顶替了,当然要要说下自己做的内容啦,DuangDuang! <LoadRunner函数百科>更新通知 ...

  8. 使用git进行源代码管理

    git是一款非常流行的分布式版本控制系统,使用Local Repository追踪代码的修改,通过Push和Pull操作,将代码changes提交到Remote Repository,或从Remote ...

  9. 2DToolkit官方文档中文版打地鼠教程(一):初始设置

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  10. Openfire集群源码分析

    如果用户量增加后为了解决吞吐量问题,需要引入集群,在openfire中提供了集群的支持,另外也实现了两个集群插件:hazelcast和clustering.为了了解情况集群的工作原理,我就沿着open ...