如何设计一个易扩展的ARPG游戏战斗机制系统

在公司的ARPG项目中曾复刻过崩三,战双,原神的角色机制,也曾经做过类似崩铁的战斗机制,在项目之后想做个总结,和大家一起探讨一下。

在同类游戏中,一个技能的战斗机制大体上都是由什么条件触发,从而给自身或者触发目标附加了什么效果,一个技能往往设定上存在多个这样的触发机制。在这样的设计下,我们需要分解每一个触发情况,和每一种效果实际上干了什么事情,按照当前项目业务逻辑的执行顺序进行调用,就能实现设定的机制效果了。

这样我们可以把战斗机制大体上拆分为触发器(因为什么条件触发) + 效果器(具体干了什么事),这样就类似于微服务架构,每个环节只用负责自身业务,通过数据关联来实现联动,这样代码逻辑能够通过配置(数据表或者行为树)就能实现完整的战斗机制业务链条,单次功能开发就可以用在各种机制里,极大减少了代码冗余和维护成本。

触发器可以调用效果器里的任何效果,效果器之间也可以互相调用,比如触发了一个被动效果,要发射一个子弹飞向触发目标,命中后给目标附加一个状态。这样每个业务环节都可以自由的排列组合,完全可以实现由配置实现一条战斗机制的业务链。

找一个崩三的角色,尝试按照这套框架来拆解一下技能机制:

【崩坏三:瞒天乐游·曙影·必杀技】

l 特性一:开启必杀技后造成66%*6+166%攻击力的物理伤害,必杀技开启无能量消耗限制,开启后消耗全部能量,每消耗1点能量,必杀技额外造成8.5%攻击力的物理伤害,最多额外造成1166%攻击力的物理伤害。释放必杀技期间角色处于无敌状态并触发(状态:【时滞领域】效果期间角色、敌人身上的技能效果以及关卡都会停止计时)

l 特性二:来自【命运之轮】的加护,获得此加护的角色在星环爆发状态下可触发影侍的助战攻击;命运之轮激活时,星环爆发状态下释放必杀技后将退出星环爆发状态,并根据剩余的星之环持续时间,返还剩余比例25%的星之环能级(星之环系统的能量)

l 特性三:命运之轮激活时:释放必杀技后恢复必杀技消耗能量5%的星之环能级(星之环系统的能量),当瞒天乐游·曙影作为队长时,额外回复3%,单次必杀技最多回复12点,触发间隔20秒;开启星环爆发状态时必杀技冷却时间降低3秒,触发间隔20s

l 特性四:释放必杀技后每秒回复3.0点能量,持续10秒,重复触发刷新持续时间;星环爆发状态下,发动2/3次神光·展妙戏(技能:瞒天乐游,曙影在贯金神光形态下的分支攻击)时,必杀技造成的全伤害提高20.0%/80.0%, 神光·展妙戏额外造成466%/1666%攻击力的物理伤害,退出星环爆发状态时移除

一个必杀技带这么多特性,应该算是比较高规格的吧,我们选其中一条来分析。特性一中开启必杀技造成伤害,我们直接按照技能内调用伤害判定的方式正常实现即可(伤害判定可以基于Unity的Trigger功能来实现,还可以额外加上Animation内置的Curve来实现根据时间控制Trigger的开关,实现多个目标的同时多段判定)。

然后接下来是一个重点:必杀技无能量消耗限制,开启后消耗全部能量,并根据消耗的能量,每消耗1点换算成额外8.5%攻击力的物理伤害,并且这个额外伤害有1166%攻击力的上限。从米游社官方公布的属性面板来看,这个角色能量上限为153,单从属性来看,可能会有153 * 0.085 * 角色攻击力的伤害情况,其实不然,实际伤害的计算是被卡了上限的,上限为1166 / 8.5 ,约等于 137.1765倍(其实按理说倍率的值应该是整型的,估计是中间伤害计算中途有什么浮动比例吧),我们这里先按照137倍来计算。

为了能稳定获得消耗了多少能量,最好不要在技能系统层就先扣除掉能量,而是先配置成无能量消耗,这样也满足了设定上的释放时无能量消耗限制(主要目的是规避一些时序上的问题,防止机制查询不到正确的能量消耗值)。在播放技能时,触发一次被动机制_A,将当前拥有的能量存储为Buff_01的层数,并且Buff_01的层数上限为137(这里可以给Buff_01数据加个别名,方便其他战斗机制去查询),将我们需要的伤害倍率存储好之后,就可以消耗掉当前角色拥有的所有能量了。

在必杀技能的伤害判定生效时,触发新的被动机制_B,根据Buff_01的层数给伤害判定的目标附加Buff_02,Buff_02的效果为造成伤害,可指定伤害属性类型,伤害量会根据Buff_02的层数翻倍(在层数附加完之前,不要让buff生效,这里Buff可以用Unity的生命周期方法,在Trigger时才执行业务,附加Buff时不立即执行)。另外必杀技释放时角色无敌和时停,则直接在技能期间给自身附加上对应效果的Buff或者调用事件即可实现。

这个做法只是实现方式的一种,由于是通过Buff追加的伤害,可能会出现其他机制的判定问题和多一个伤害数字,不同的实现方式具有不同的特性,具体要看设计上需要什么样的效果。(如果需要整合伤害数字和判定机制的话,就得换个实现方式,在伤害计算时,获取Buff_01的层数来计算额外伤害,最后整合所有的伤害值到最终伤害上,再去设置目标的血量)。 其他机制也是类似的原理,拆解细化成原子态,只是在最终给玩家传达上,包装成一条战斗机制即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值