战斗中的简单行为树的一点思考

  最近打算接入行为树,来更好的控制战斗单位的行为。项目采用了有限状态机,加上一些简单逻辑,实现了一定程度上的自动战斗,但是,一个是设计上很不美观,一个是很不利于需求的修改。最近策划同学重新提出了新的AI需求,固坚决提出了引入行为树设计的想法,并开始付诸行动。

  在开始写代码之前,个人想提前思考一些东西。包括使用行为树的必要性,行为树设计和实现的一些难点,一些具体功能的实现逻辑。

  使用行为树的必要性。提到这一点,就需要说一下行为树和状态机的区别。有限状态机,首先主要是由技术人员维护,策划提出需求,技术挖掘总结出有限的状态,然后实现设计各个状态,状态的切换由状态互斥表配置。在这个情况下,策划的自由度会很小,所以经常会出现现有功能,无法满足策划需求的情况。在项目开发时间的限制下,可能经常会出现技术实现反限制策划情况,而这不是我们想要的结果。而行为树恰恰可以改变这种情况,技术只需要设计开发行为节点,而具体战斗过程,由策划设计。既满足策划同学的需求,又解放了技术同学。

  我不打算舍弃有限状态机,计划将行为树和有限状态机结合在一起,行为树和有限状态机共同组成一套AI体系。具体还没有想好,怎么去设计,朦胧的想到是,有一些行为节点,可以直接去转换到一种状态上。感觉可是这样试试,每一个行为树的行为节点,都是切换到一种态。而要这样做,就会遇到一个问题,就是状态的输入参数,怎么传递。比如:我们有一个需求是,单位在加载初始化完毕后,需要走到一个指定的战斗点位置后,才可以开始攻击。我设计了一个准备战斗的状态A,A状态的输入参数有一个目标点位置的参数。而如果用行为树加上状态机来设计的化,我需要怎么给节点传一个数据。当然,最简单的方法,是设计一个专有的节点,专门用来“走到战斗点”。在这个节点内,获取单位战斗点的数据,然后在节点内再且切换到状态。但是我想设计一个通用的行为节点,就是切换到一个指定状态。不同的状态,输入的参数类型不同,这个应该怎么设计好点呢?

  一个具体的问题分析。攻击行为。攻击,包含三大阶段。寻找目标,选择技能,对目标施法。在我现有的设计里,跑向目标的过程,也是在攻击状态里。对目标施法,也可以分成两个阶段,一个是跑向目标,直到到达施法范围内,一个是释放技能。这个地方,我用的是寻找“目标”,而不是寻找敌方,因为技能的施法目标,有可能是对己方单位,比如护盾,回血等。那这个攻击行为要怎么设计呢?首先,我先考虑,是先寻找目标,还是先选择技能?因为先选择技能,因为技能有施法范围和施法目标,而这两个参数,都会影响寻找目标这一步。所以第一步,我先选择哪个技能可以释放,首先要判断,单位当前是否可以释放技能,条件节点,主要检查buff状态和当前是否正在释放技能,若可以释放技能,根据行为树节点的优先级,自由配置先判断普通攻击技能,还是先判断主动技能,我们的游戏设计简单,主动技能可以释放的时候,就先释放主动技能,选择好技能后,得到施法目标和目标类型,那一步就是寻找目标,这个时候,需要一个功能,就是寻找目标节点需要获取选择技能节点最后得到的技能数据,也就是有限节点间的数据共享。自定义分享数据SharedSkillData。寻找目标节点,找到目标,进入下一步,跑向目标点。跑向目标点需要上一步”寻找目标“节点的目标位置信息。又是一个有限节点间的数据共享。跑向指定位置,应该设计成一个通用的行为节点。“跑向目标节点”又要考虑一种情况,当过程中,目标脱离了施法范围,怎么处理?是重新寻找目标,还是锁定目标,继续跑向指定目标。如果是重新寻找目标,那是立即寻找,还是等一下轮询?如果是锁定目标,如果目标死亡,怎么处理?我的设计是,当目标脱离了施法范围,就继续跑向指定的目标,如果当前目标死亡了,则重新寻找目标,直到本次攻击结束,或战斗结束。或者更好的设计是,将这一选择交给策划。将这两种处理逻辑,都写处理,由策划同学配置。嗯,这种方法更好一些,更自由一些。

  还有一个问题。行为树之外的状态打断了行为树的节点操作,怎么处理?比如单位正在自动攻击中,玩家手动释放了主动技能,这时应该去执行玩家的操作,可是怎么在行为树中打断自动攻击的节点呢?还有各种buff,都有可能打断攻击节点。跑向过程中,被眩晕,被击退了,怎么打断行为树行为?我要再好好想想。

 

posted on 2021-11-06 20:02  施琅水月  阅读(367)  评论(0编辑  收藏  举报

导航