参考了https://www.cnblogs.com/cnas3/archive/2011/08/14/2138445.html
和pomelo-bt:https://www.npmjs.com/package/pomelo-bt 或者 https://github.com/NetEase/pomelo-bt
个人理解:各个节点有suc,fail,waiting状态,是因为是按帧执行,没执行完的不需要返回确定的结果,所以需要有waiting状态。
以及图上的那个节点逻辑感觉有些问题,比如约会节点是选择节点,如果买花逻辑返回true了,就不去见女友了?这个逻辑说不通,其他节点没细看,大致是这么回事,这个需求的逻辑节点其实实现方式可以很灵活,也就是说主要看行为树怎么去设计,可能每个人实现的方式不同。
==================================分割线==================================================
行为树常被用来实现游戏中的AI。每次执行AI ,都会从根节点遍历整个树,父节点执行子节点,子节点执行完后将结果返回父节点。下面是基本的四个节点:
1 *顺序节点(Sequence):属于组合节点,顺序执行子节点,只要碰到一个子节点返回false,则返回false,否则返回true,类似于程序中的逻辑与。 2 *选择节点(Selector):属于组合节点,顺序执行子节点,只要碰到一个子节点返回true,则返回true,否则返回false,类似于程序中的逻辑或。 3 *条件节点(Condition):属于叶子节点,判断条件是否成立。 4 *执行节点(Action):属于叶子节点,执行动作,一般返回true。
关于更多关于行为树概念上的东西,大家很容易找到相关的资料,这里不再最赘述,主要是通过一个实际的例子来看行为树在AI上的应用。
这是AI文字表达的方式:
如果不是情人节,我们的Avatar将去球场打球,如果是情人节,他将带上一束花去见他的女友,但是他可能没带钱,所以他要先回家拿钱,然后去花店买花,再去 见他的女友,如果女友还在约会地点,则将花送给女友。
下面是用行为树表达的方式:
上面的图让我们能很容易指导我们的代码编写,我们需要完成所有的叶子节点,然后将他们按照图示,放到相应的组合节点中去,然后不停的遍历整个行为树。
我使用AS3完成了下面的demo,去实现上图中的行为树AI(如无法观看请下载最新的FlashPlayer)。
在Flash中,蓝色的圆表示AI控制的Avatar,你可以通过点击不同选择框来改变当前的条件,Avatar会根据条件做出不同的反应。
行为树很适合做AI编辑器,我们定义好一些条件和动作,策划人员通过简单的拖拽和设置即可实现复杂的游戏AI。