怪物AI的框架设计

在经历了两个ARPG项目,我发现战斗部分的内容开发卡点挺多的,原因要么是配置繁琐比如技能开发,一眼盯帧;要么是战斗机制或者怪物AI,大脑过载。配置部分我也没有特别好的办法,就先拿烧脑子的部分先总结一下我是怎么优化生产管线的吧,抛砖引玉,期待回复讨论。

从入行到现在,我写过不少游戏角色AI,怪物的有,玩家角色的也有。其中在怪物AI上我迭代的版本是最多的,它见证了我的成长历程。最早,我生怕别人说我写的怪物AI蠢,就写的非常简单粗暴,打一会儿就进霸体,技能CD短,并且哪个技能好了就冲到设定的攻击距离内,对着玩家放技能。单个小怪这样做还好,熟悉了怪物的技能和攻击节奏还能压制,但如果这个怪的技能数量足够多,或者是怪物的数量足够多,玩家就疲于招架了。其实写个AI把玩家按着捶一顿,非常容易,AI有啥不知道的啊,但这不是目的,应该是像教拳的师傅一样,通过对练的方式引导玩家进入心流,逐渐熟练战斗技巧。所以这里就出现了3个需要实现的课题:

1.当怪物数量足够多时,怎么稳住战斗节奏

2.当单个怪技能足够多时,如何像ACT一样,不会无间歇地攻击玩家,让玩家能够有喘歇和反击的空档

3.当单个怪技能足够多时,如何能让所有技能都以近似的频率展示给玩家体验

在公司的第一个项目上线前,大体上搓出来了第二个课题的原型,在不增加功能代码的情况下,用行为树实现了技能连招和共CD的基础原型,大概结构如下(以前的版本实在是找不到了,只能拿现有的大致连一连,图中使用的接口我已重构代码,以前版本会更难用):

4c521d1ee27b46bea641076c16bd1a86.png

技能0和技能1通过配置锁一定会连续释放,然后穿插加入其他CD较长的技能,怪物的不同阶段都按这种方式重新编排,基本实现了在时间足够的情况下打一个怪,能够见完这个怪的技能列表,并且通过共CD的方式控制这个怪的进攻间歇(设定上需要进连招的技能,不配置CD,保证AI调用的时候一定能放出来)。

在后面新项目中,我有小弟了(开心),这样我就有了大量的时间钻研战斗部分的东西(在新项目的战斗部分,我设计开发了很多以前欠缺的东西,有机会的话都一一扔上来)

在后续研究ACT主机游戏后,我发现怪物的AI还是得具有一些特性:

1.强化博弈性:根据战斗局面,实时判断自身应该采用哪种战斗策略,并打出对应的连招

2.简化配置:如果设计上AI本身有太多的策略和连招,加上额外设置的一些系统级的战斗机制(比如破甲眩晕,受击打断连招等),逻辑会相当复杂,十分不方便配置

3.遗留问题:当怪物数量足够多时,怎么稳住战斗节奏

为了解决前两个问题,我重新设计了怪物的AI架构:用List<string>配置各个阶段BOSS不同策略下基础循环的连招,和每个连招对应的技能序列,AI的逻辑流程大概就是观察 -> 思考 -> 执行,每次循环都会观察目标(即玩家)的状态,观察自身的状态,从而判断得出结论自己需要干什么(进攻?防守?佯攻?),并开启对应策略中,对应序列的的连招,最终执行连招。

a1fb1d74e7ef4f4f9a0b3e56eac804c4.png

b425da5bb7d54e4db6218df7f43cce21.png

因为项目使用的是疼训已经停止维护的行为树,非常难用,看起来结构还是比较复杂,但我已经尽力做封装了,负责配置的同学在这里基本上只用关心技能的编排和释放规则,思考决定和执行技能部分已经做了封装,算是模板了,任何怪物的AI复制过来改改策略连招的配置和技能的释放方式就能使用,还打得挺有套路。

(由于设定过于复杂,怪物的AI会被各种奇形怪状的原因打断,所以整个行为树被我改成了策略树,不会阻塞在当前执行的action中,AI一直都在循环判断,根据实际的情况,尝试是否更换到新的行为流程,当然如果action执行顺利的话也会保留在当前行为中)。另外整个流程设计还兼顾了高优先级连招打断,方便加入boss半血强制执行转阶段连招的设计。

那么就还剩一个问题,怎样把控箱庭中多个怪整体的进攻节奏。在刺客信条中,当玩家陷入重重包围时,对战体验永远是一群怪围着玩家转,每次只会有1到3个小怪轮番上前进攻,就像是早期的香港动作片一样,毕竟小怪一拥而上,玩家双拳难敌四手,只能被胖揍。我在上个项目中做过尝试,让决定进攻的某个怪,向其他怪物发出广播:“我要进攻了,你们先停一下”,结果就造成了类似网络风暴的现象:大家都停了,并且永久卡住。所以还得是由单例的第三方来当交警,指挥怪物组群的进攻。

这样就形成了一个新的流程:怪物决定进攻时,先向箱庭管理者发起进攻申请,进入排队序列,管理者按照关卡设定的节奏,分批次允许队列中的进攻者实际执行进攻策略,在进攻者执行完攻击连招后,自己主动申请退出进攻组;如果当前正在执行进攻的成员陷入了异常状态,无法正常进攻时,则管理者及时将异常的成员提出进攻组,让它下次再申请进入进攻队列。

这样的流程有点类似班车机制,到点就发,只不过每次要进攻的成员和成员数量,都是动态的,只是有数量上限充当减压阀,稳定多个怪存在时的战斗节奏;当怪物仅剩一只时,就不用判断执行这个流程了,战斗节奏也不会因为怪物数量变少而陡然降低。

这套框架运行下来,整体运行稳定,关卡同学的需求也能覆盖个七七八八,目前看起来怪物开发的卡点已经从AI转移到了技能机制上了,后面项目频繁更换和增加战斗环境机制时,我也能在几分钟内统一搞定,效率大大提高。

 

 

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值