写在开头
大家好,我是程峰啊游戏搭建,一名在游戏行业工作了4年多的年轻策划。写这篇文章的主要原因是想回顾一下自己以前的工作经历,希望让自己的知识体系更加深刻完整,也希望对刚入行或者对这方面有兴趣的朋友有所帮助。不过这些只是根据自己目前的认知水平总结出来的,所以还有很多不足之处,欢迎大家交流指正。
为什么技能框架构建如此重要?
造成这个问题的原因在于前期策划做战斗的时候没有用框架思维,程序员也不知道你以后还要扩展什么功能。随着后续版本的技能越来越多、越来越复杂,维护起来也变得极其繁琐和不稳定。本文的意义在于帮大家梳理出一套可扩展、易用的技能实现思路,可以运用在你以后的任何一个项目中。看完之后,你应该有以下收获:
更深层次理解技能底层机制和动态表现的实现逻辑
整理并解释技能表中的所有字段
技能表数据结构,带模板
如何创建一个高度可扩展且易于使用的技能框架?
为了满足强扩展性和易用性的要求,我认为关键有三点:
方案后期易于扩展。一般在项目DEMO阶段就要搭建好战斗系统,但一开始就规划好所有技能效果是不可能的,尤其是内容导向型的游戏。你永远不知道战斗策划师的下一个“奇怪”想法会是什么。
功能可重用。目的是为了降低开发成本。比如有两个技能 A、B,都会造成减速效果,但触发条件不同,则无需创建新的减速技能,只需增加新的触发条件类型即可。聪明的老师们发现,这种思路其实就是将一个技能拆分成多个模块,只实现缺失的模块,然后与其他已有模块快速组装成一个新的技能。
配置时间成本低。技能相关字段繁多,如果所有字段都放在同一张表中,势必会降低浏览速度和排错效率。建立多个分表非常重要,比如主技能表、BUFF表、伤害表、动态表现表。文章最后我会放一套模板,供大家参考,我花了一周时间整理,真心希望大家点赞支持我。
废话不多说,下面是我整理的一个框架,从技能能不能发布,到可以发布给谁,再到能产生效果,任何技能都会经历这个过程。
1. 发布类型
1、主动释放:满足释放条件,玩家主动按下按钮释放。
2、自动释放:满足释放条件时自动释放。
《明日方舟》天使的3个技能能量满后会自动释放
3、被动释放:玩家在战斗中达成某些事件来触发。被动其实是一个大类,其实又细分成很多小类:比如被击中x次、生命值低于x%,不受伤害x秒、处于异常状态等等。
卡夫卡:星形铁路
4、混合型:以上类型的组合,如主动、被动等。玩家主动按下按钮后,需要满足一定的事件才可以触发。比如LOL布兰德中,Q技能引发烈焰,会同时叠加,当达到3层时爆炸造成百分比魔法伤害。前者烈焰是主动类型,只要按下按钮就会触发。后者爆炸伤害是被动的,需要满足叠加层数才能触发。
“LOL”火人
2. 发布前提条件
1、技能CD:以秒(s)计算,符合大部分人的认知,降低领悟力。
2.技能消耗:
打开之后分为:
《明日方舟》中角色头顶的黄色数字是其已充能的次数,下方的绿色条是能量值,会随着时间推移而恢复。
3.触发范围:
形状类型:圆形、矩形、扇形等。
形状和尺寸:用于对应类型的参数设置
中心点绑定位置:比如对象所在的圆形,或者前方的矩形。
特殊:比如棋类游戏中,以网格为最小单位,然后组装成各种形状。
《天地劫》
4.目标选择:
目标选择对于技能的释放至关重要,相对于普通攻击,技能是低频率、高收益的行为,精准瞄准目标才能发挥出最大的收益。
例如一技能:对单体目标造成500%伤害,并造成流血;二技能:对流血状态下的敌人额外造成100%伤害。
技能一为单体爆发技能,在攻击精英/BOSS时效果最明显,技能二可以增加对流血目标的伤害,两者搭配可以用于攻击精英/BOSS。
BOSS比较有策略性,选择要点: ①一个技能支持多种目标类型; ②每种目标类型逐层选择1个。
1、一技能支持多种目标类型共存:单技能可能同时拥有两种效果,每种效果释放在不同的对象上。例如英雄联盟中蕾欧娜的W技能游戏搭建,可以在对敌人造成伤害的同时增加自身的抗性。
2.逐层选择每个目标类型的一个目标:每个效果都要经过这个过程,先选择类型,然后配置该类型下的最大有效目标数量。
总结:最终的逻辑是一个技能支持扩展多种效果类型,选择一种效果类型即可,可以通过配置表结构来控制程序执行的优先顺序。
5. 损害计算
战斗公式:
战斗公式包含属性项、乘数项、计算方式,业内常见的战斗公式可分为减法、乘法两大类,两种计算方式各有特点。
减法公式
减法公式示例:伤害 = {[攻击 (1 + 属性乘数) - 防御] (1 + 技能乘数)} (1 + 最终伤害乘数)
乘法公式
乘法公式示例:伤害 = {[攻击 (1 + 属性乘数) (1-伤害免疫率)] (1 + 技能乘数)} (1 + 最终伤害乘数)
注:由实战公式可以看出,项所属的乘法区域的位置直接影响其值,并且公式中各项项的代表意义需要通过程序进行约束。
伤害类型:常见的有物理、法术、真实、治疗,不同的伤害类型使用不同的计算公式。
伤害等级:技能每次释放的次数,本次的总伤害=伤害公式得到的值*等级。相信很多同学开始疑惑了,为什么要用这么复杂的等级设计,打完一次就直接折算成一样的总伤害量不就行了吗?答案是真的不行。我直接说一下我个人的理解吧:
和战斗公式有关,技能倍率乘积计算后的字段会影响最终的伤害,比如公式里最后一项格挡,格挡数=段数。
单次换算成多次,优点是伤害不容易溢出,缺点是增加了输出时间,跟技能DPS的定位有关。
与动画的表现有关,为了给人一种真实感。例如,有些技能会造成持续伤害
DNF:波浪破碎者
6.附加BUFF
属性buff:比如以百分比或者固定值的形式改变某种属性。
控制buff:如减速,晕眩,冰冻,束缚,恐惧,魅惑,击飞等。
伤害buff:比如每xx秒扣除xx点伤害,值为负数时,扣除的伤害相当于治疗。
驱散buff:清除某类buff,并使其无效。
功能性buff:改变战斗相关功能或者资源的buff,比如阻止目标释放技能,改变攻击范围,或者改变经济成本。
其他增益效果:位移,瞬间移动,重生,增加印记等。
BUFF分组:不同分组的BUFF直接叠加,同一分组的BUFF按照以下规则叠加。
最大叠加层数:同一组内的BUFF达到指定的最大层数后,便无法继续叠加。
叠加方式:效果叠加,持续时间刷新如下。
叠加时长刷新:1-不刷新,保持原有的剩余有效时间;2-刷新,重置时长。
7.动画性能
1. 攻击者
运动轨迹:1-直线;2-螺旋;3-抛物线
轨迹参数:根据类型配置相应参数。
是否实时跟随:飞行过程中是否刷新目标位置并实时跟随。
飞行速度:决定玩家做出反应的时间部分。
2. 被攻击方
8. 技能表参考