在经历了两个ARPG项目,我发现战斗部分的内容开发卡点挺多的,原因要么是配置繁琐比如技能开发,一眼盯帧;要么是战斗机制或者怪物AI,大脑过载。配置部分我也没有特别好的办法,就先拿烧脑子的部分先总结一下我是怎么优化生产管线的吧,抛砖引玉,期待回复讨论。
从入行到现在,我写过不少游戏角色AI,怪物的有,玩家角色的也有。其中在怪物AI上我迭代的版本是最多的,它见证了我的成长历程。最早,我生怕别人说我写的怪物AI蠢,就写的非常简单粗暴,打一会儿就进霸体,技能CD短,并且哪个技能好了就冲到设定的攻击距离内,对着玩家放技能。单个小怪这样做还好,熟悉了怪物的技能和攻击节奏还能压制,但如果这个怪的技能数量足够多,或者是怪物的数量足够多,玩家就疲于招架了。其实写个AI把玩家按着捶一顿,非常容易,AI有啥不知道的啊,但这不是目的,应该是像教拳的师傅一样,通过对练的方式引导玩家进入心流,逐渐熟练战斗技巧。所以这里就出现了3个需要实现的课题:
1.当怪物数量足够多时,怎么稳住战斗节奏
2.当单个怪技能足够多时,如何像ACT一样,不会无间歇地攻击玩家,让玩家能够有喘歇和反击的空档
3.当单个怪技能足够多时,如何能让所有技能都以近似的频率展示给玩家体验
在公司的第一个项目上线前,大体上搓出来了第二个课题的原型,在不增加功能代码的情况下,用行为树实现了技能连招和共CD的基础原型,大概结构如下(以前的版本实在是找不到了,只能拿现有的大致连一连,图中使用的接口我已重构代码,以前版本会更难用):
技能0和技能1通过配置锁一定会连续释放,然后穿插加入其他CD较长的技能,怪物的不同阶段都按这种方式重新编排,基本实现了在时间足够的情况下打一个怪,能够见完这个怪的技能列表,并且通过共CD的方式控制这个怪的进攻间歇(设定上需要进连招的技能,不配置CD,保证AI调用的时候一定能放出来)。
在后面新项目中,我有小弟了(开心),这样我就有了大量的时间钻研战斗部分的东西(在新项目的战斗部分,我设计开发了很多以前欠缺的东西,有机会的话都一一扔上来)
在后续研究ACT主机游戏后,我发现怪物的AI还是得具有一些特性:
1.强化博弈性:根据战斗局面,实时判断自身应该采用哪种战斗策略,并打出对应的连招
2.简化配置:如果设计上AI本身有太多的策略和连招,加上额外设置的一些系统级的战斗机制(比如破甲眩晕,受击打断连招等),逻辑会相当复杂,十分不方便配置
3.遗留问题:当怪物数量足够多时,怎么稳住战斗节奏
为了解决前两个问题,我重新设计了怪物的AI架构:用List<string>配置各个阶段BOSS不同策略下基础循环的连招,和每个连招对应的技能序列,AI的逻辑流程大概就是观察 -> 思考 -> 执行,每次循环都会观察目标(即玩家)的状态,观察自身的状态,从而判断得出结论自己需要干什么(进攻?防守?佯攻?),并开启对应策略中,对应序列的的连招,最终执行连招。
因为项目使用的是疼训已经停止维护的行为树,非常难用,看起来结构还是比较复杂,但我已经尽力做封装了,负责配置的同学在这里基本上只用关心技能的编排和释放规则,思考决定和执行技能部分已经做了封装,算是模板了,任何怪物的AI复制过来改改策略连招的配置和技能的释放方式就能使用,还打得挺有套路。
(由于设定过于复杂,怪物的AI会被各种奇形怪状的原因打断,所以整个行为树被我改成了策略树,不会阻塞在当前执行的action中,AI一直都在循环判断,根据实际的情况,尝试是否更换到新的行为流程,当然如果action执行顺利的话也会保留在当前行为中)。另外整个流程设计还兼顾了高优先级连招打断,方便加入boss半血强制执行转阶段连招的设计。
那么就还剩一个问题,怎样把控箱庭中多个怪整体的进攻节奏。在刺客信条中,当玩家陷入重重包围时,对战体验永远是一群怪围着玩家转,每次只会有1到3个小怪轮番上前进攻,就像是早期的香港动作片一样,毕竟小怪一拥而上,玩家双拳难敌四手,只能被胖揍。我在上个项目中做过尝试,让决定进攻的某个怪,向其他怪物发出广播:“我要进攻了,你们先停一下”,结果就造成了类似网络风暴的现象:大家都停了,并且永久卡住。所以还得是由单例的第三方来当交警,指挥怪物组群的进攻。
这样就形成了一个新的流程:怪物决定进攻时,先向箱庭管理者发起进攻申请,进入排队序列,管理者按照关卡设定的节奏,分批次允许队列中的进攻者实际执行进攻策略,在进攻者执行完攻击连招后,自己主动申请退出进攻组;如果当前正在执行进攻的成员陷入了异常状态,无法正常进攻时,则管理者及时将异常的成员提出进攻组,让它下次再申请进入进攻队列。
这样的流程有点类似班车机制,到点就发,只不过每次要进攻的成员和成员数量,都是动态的,只是有数量上限充当减压阀,稳定多个怪存在时的战斗节奏;当怪物仅剩一只时,就不用判断执行这个流程了,战斗节奏也不会因为怪物数量变少而陡然降低。
这套框架运行下来,整体运行稳定,关卡同学的需求也能覆盖个七七八八,目前看起来怪物开发的卡点已经从AI转移到了技能机制上了,后面项目频繁更换和增加战斗环境机制时,我也能在几分钟内统一搞定,效率大大提高。