游戏数值干货:RPG战斗数值开源示范

作者:apm43 2019-04-15
一、概述

去年的时候我开源发布了一个完整的游戏文档,以excel为工具,构建游戏的属性、经济、付费、生态模型,不需要程序美术把游戏做出来,策划直接验证玩法。

现在我给这个项目打一个补丁,就是用数值模型构建一个RPG战斗玩法,并一步到位的生成直接可用的配置表。

在这个补丁项目里,我选了差别很大的5个职业,演示了在电竞游戏的平衡性标准下,会变身的肉盾、AOE输出、施加debuff控制节奏、召唤怪物以多打少、高输出脆皮放风筝这些玩法是如何做到彼此平衡又在自己擅长的环境下发挥出自己的特点的。

如果把职业属性的调整视为前端,那么把调整完毕的属性落实在角色、强化、装备上就可以视为后端。前端玩法我是以MOBA类游戏为参照对象,既有英雄间的单路对抗,也有英雄间的骚扰、团战和追杀,英雄们的技能也是以这样的游戏玩法为依据设计的。

但是因为MOBA类市场也就能容下LOL、王者荣耀等几款产品,而我希望这个项目能影响更多的产品,所以我把后端做成了一个MMO的玩法。每个职业都有100级,每10级可以更新一套装备,有白绿蓝紫金5个档次的装备,差的装备只有1条属性,好的装备一件有5条属性。

也就是说,如果你想做一个MOBA类的游戏,你可以截取项目的前端,参照其职业和技能设计,以5个最大差异化的职业为边界,铺开大量更为中庸的职业,并且给这套数值设计一套成长30分钟的装备和天赋,就是一个MOBA游戏。

如果你想做一个MMO,前端只是给你一段质量比较高的职业属性,你可以参照后端的流程把这段属性分解到一个个属性子系统里。为了减小工作量,我没有加入怪物属性,仅有的2个是英雄召唤出来的怪物,所以这需要自己补上。之前的项目有如何设计怪物属性,可以参考。

这个项目除了游戏数值如何设计和调整的方法外,我认为最有价值的地方在于如何把玩法概括为数值模型的方法。我觉得我以前做得不好的一个很重要的原因就是对玩法的理解太肤浅,不能把复杂的玩法总结成简单的设计指标,所以在设计和调整游戏数据的时候就缺乏明确的目标,而没有目标自然就谈不上好的结果。所以下一章我会重点讲解玩法的数值构建。

另外由于excel文档大量使用了代码自动生成中间数据和最终数据,所以可能会有人因为对excel公式代码不熟悉而不理解。但是这个讲解起来比较繁琐,我在之前的项目中已经讲解过这里就不重复了,如果有质疑可以自行验算。我虽然不敢保证全篇一定没有错误,但是我相信整体质量还是有保障的。


提取码:n4ck

注意。本文后续内容需要下载excel文档并对照着阅读。

二、玩法构建数据模型2.1、数值设计的难点

如果由程序定义好配置表并让一个初学者去填,他肯定是可以填出来的,因为英雄的血量、攻击等等属性都很形象,只要有一定的游戏基础,就可以填的差不多。

但是有2件事是初学者很难做好的,1是成体系的填表,2是控制各个数值在游戏中的最终效果。

一个游戏不是填个属性填个技能伤害就行了,它会升级、技能也会升级、会解锁更多技能、全身上下会穿满装备,装备有不同的档次,每过一个等级段又会有新的一套装备,还有强化淬炼镶嵌打造……如果有多个不同的职业还意味着有多条属性发展方向。

这么大的工程量,而且过程非常枯燥,很容易瞎填,比如说上一格填3,这一格填4,下一格填5,这种没有任何设计指标,为了填完而填完的方式会在测试时暴露大量的问题,但你让策划顶着这么枯燥的工作反复改,很容易倦怠。

另一个问题是如果你想把游戏做得好玩,就必须引入大量很难量化的东西。如果游戏只是战法牧站桩输出,那游戏的趣味性就很弱,但是如果我加入了冲锋、嘲讽、无敌、隐身等等内容,那这些效果到底该折算成多少伤害才算是合理的呢?

还有像暴击碾压这样的概率出现的伤害,如何量化和测试也是个问题。像抽卡那种简单的功能都整出那么多玄学,更不要说这种更抽象更缺乏标准的功能了。

如何成体系的填表以前说过我就不展开了,文档里3张excel文档:技能规划、属性原型、配置表输出都是按照自动生成数据的规范制作的,都是把机械枯燥的工作交给机器,人只要填重要参数并根据最终结果返回去调整参数就可以了。

2.2、流程

在讲如何控制数值最终效果之前,我要先介绍一下属性设计的基本流程。

1、概要的设计职业玩法

见技能规划的职业设计A1C6,这里先把想法写出来就行,后面细化的时候有新想法可以再返回来改,这个做法均适用于后面的规划性工作。

2、设计各个职业的每个技能

见技能规划的职业设计A11F56。

3、设计玩家操作

见技能规划的操作设计,这里要确定英雄在杀死敌人之前该用哪些,以什么顺序使用这些技能以达到最大或者最稳的输出。同时也要把CD时间、法力消耗、控制效果等等和操作顺序有关的数据都确定。

4、设计战斗公式

见属性原型的公式和参数表。

5、设计职业属性

见属性原型的属性设计。

我这里是按每10级一个节点全等级的属性都填出来了。虽然我在A12J18设计了职业之间的属性差异,但是属性并不会严格按照这个参数表执行。在Y到AA列,我会每个职业选1个属性进行微调。

6、填写技能参数和技能升级表

见技能规划的技能参数和技能升级表。这里同样是把全等级的技能数据填完。

7、对部分职业计算其真正的实战属性

见技能规划的实战属性。

所谓真正的实战属性是指战斗中开启某些buff使自己的战时属性比纸面属性要高。例如我这里力士有一个光环技能和一个变身技能,那么力士真正的属性就是在光环和变身综合加成下达到的属性。

8、构思每个职业之间战斗的策略、效果、把平衡性变成具体的设计指标

见技能规划的职业PK规划以及后面大量的 “某职业对某职业”的标签页。

到这里准备工作就做完了,进入数值调整阶段。

2.3、调整

先点开力士对力士标签。

                              

如图,左上角是两个职业PK时,根据右上角公式直接算出它们在各个等级段打出碾压、暴击、卸力、化解等特殊效果的概率。这些特殊效果的策划规则我这里就不展开了,很多MMO里都有类似的功能,详情可以查看公式。

A19以后是10级之后每个等级段的PK模拟,之所以不模拟1级,是因为刚进游戏很可能是剧情和任务密集的时候,很多功能都锁着不开放,所以这个时候去做职业平衡没有意义。10级之后技能已经学全,装备已经穿满,不论游戏此时是否开放PK,起码职业平衡的条件是成熟了。

每一个PK模拟都是一个模块,以A19J27为例,A20和B20分别填参战攻方和守方的英雄ID。如果像力士这样参战有buff加成的,就是填它的实战ID。例如这里如果调用力士的模板属性,就要填1010,但是如何加上天官赐福和天官下凡的buff,则要填图中的11101。

A22到A25填的是攻方英雄战斗中使用的技能(如果攻守双方是1个人,就用同一个模块就行)。D列和E列会把技能的操作耗时和当前英雄等级对应的技能等级检索到,C列需要设计者填入或者自动计算出从开始到打死对手这段时间里这些技能要使用多少次。

F到H列会自动计算出当前等级该英雄打出多少伤害。I列和J列是特殊效果对技能伤害的修正。I列填技能对伤害的修正,J列是碾压暴击等特殊效果的修正。

F26J27是伤害对汇总和伤害效果的展示。例如表中数据的含义是力士打另一个力士时,在31秒时间内总共打出26.56倍的物理攻击,31倍的魔法攻击,1218的技能伤害,这些攻击扣除守方的防御,总共打出5406的伤害,而力士的最大血量是5484,这个时候谁再打一下对方就死了。31秒时倍数为1.01,32秒时倍数为0.98,我会把战斗时间调整到最接近1的位置(如果是攻守方不是一个人,也可能会调到双方倍数接近的时间)

这里我再补充一点知识。美术把模型、动作、特效等等素材做好以后,程序会对这些素材进行控制。在游戏引擎里你能看见一些关键帧,这些关键帧是透明的,和模型动作重合的。这些关键帧会控制着英雄技能打出伤害,把人击飞等等操作。

所以游戏引擎也好,游戏本身也好,都是这些动画效果的即时播放。而我用excel做得这个模拟模块,从数据调用的角度来说,和游戏程序调用配置表或者数据库的数据,并按照战斗公式计算出结果的过程是一样的;但是从数据统计的角度来说,我是统计加设计一段战斗过程的数据,这是和游戏实时播放不同的。

力士一共5个技能,在这个模块里使用到了4个,离子化是个逃命技能,开了这个技能自己也不能攻击了,所以就没在战斗模拟中使用这个技能;只要英雄ID使用了实战ID,那么天官赐福和天官下凡的技能效果就有了,其中天官赐福是被动技能,不需要操作,天官下凡是主动技能,起码有个操作时间。因为力士是一个操作简单的英雄,最高效的战斗策略就是开了变身和火焰呼吸冲上去打,所以力士的攻击次数就是战斗时间减去开启技能的时间后全除以普攻的攻击间隔。

龙女比力士要复杂。龙女有2个位移技能,还有一个需要连续普通攻击作为准备才能打出高伤害的大招,所以龙女和力士的战斗如下图:


力士会被龙女拉开距离,而它又没有快速突进的手段,只能一步一步走过去。这种位移我按照给定龙女技能的位移长度,折算成3.6秒,即力士的普攻和火焰呼吸的伤害都要扣除这段时间。

龙女的技能CD时间短,打力士耗时又长,所以技能释放次数要把战斗时间和技能CD时间和操作时间做对比,算出真正的次数。普攻因为需要准备,所以分成2部分,2次初始普攻是固定的,而被龙威加成的龙威普攻则是总时间扣除其他技能时间后算出来的。

力士和龙女的玩法相对都是比较简单的,而且力士是血量最高的英雄,龙女是单体输出最高的英雄,先调这二者可以确定游戏战斗的节奏。比如力士内战的时间在30秒左右,龙女内战在10秒左右,那么这个游戏的战斗节奏就在10秒到30秒之间。

夜叉是属性设计的基准,所以把夜叉第3个引入调整,如下图。


这里有2个要点。

1是对英雄技能及其效果的设定要做得很细。

举例来说,龙女有2个拉开距离的技能,1个是LOL里薇恩的翻滚射击,1个是爆裂箭(在箭落点把人炸开,实际就是LOL里酒桶的大招)。这种位移对付不同的英雄效果是不同的。对力士,因为不管是力士的普攻还是火焰呼吸,都得近身才能造成伤害,那么拉开距离就可以阻止力士输出伤害(这时候它的效果比夜叉的眩晕还好用)。

但是对付夜叉的时候,因为夜叉有猎命这样的突进技能,拉开距离夜叉马上用个突进技能就又贴身了,所以这种位移就不起作用,所以在夜叉和龙女的对决里,龙女的位移就不起作用。

龙女内战的时候,因为双方的射程是相同的,你拉开距离超出射程就都射不着,没超出射程都能射着,所以这个时候加射程也没有意义。

所以这种技能的效果是随着敌人的不同而不同的,这需要设计者把这种情况都考虑到才行。

2是对英雄定位有合理的判断。

平衡不一定就是一对一同时砍死对方。有的人是辅助,有的人是远程,有的人专门克制你的这个职业,那一对一单挑肯定会有输有赢,所以关键是能在每个职业在战斗中发挥优势和被克制时,其战斗能力要量化到一个合理的范围内。

比如说图里夜叉和龙女的战斗,夜叉是个切后排的英雄,它就是克制龙女。夜叉打龙女要16秒,龙女打夜叉要21秒。但是这完全是夜叉的技能效果。夜叉输出不高,血量也不厚,靠的是眩晕和无敌控制节奏,然后给对手下毒,一开始中毒伤害也不高,叠到很多层毒之后伤害才开始爆发。

那么如果龙女有队友帮忙拖住夜叉,龙女只管输出的话,她12秒就可以杀死夜叉。所以龙女的战斗策略要做2份,1份是单独面对夜叉时21-16被打败的战绩,1份是在团战中尽力输出12秒就打死夜叉的战绩。

我认为21-16-12的战绩是合理的,符合一个后排输出的英雄定位,那么夜叉和龙女就依然是平衡的。

3个职业调完再加入修罗,让修罗和已有4个职业各打一场,再之后调判官,让它和已有5个职业各打一场,这样5个职业都两两模拟战斗并调整过数值,那么就可以说职业是平衡的。

就算有一些理解上的偏差,比如说我觉得21-16-12是合理的,这是一种基于经验和个人偏好的主观判断,不同的人完全可能有不同的想法,比方说有人会觉得20-16-12或者一个别的比例才是合理的。不管谁的理解更准,起码框架搭起来了,要调成什么样都是可以做到的。

像力士和龙女这样的常规玩法,就是看模拟结果符合其定位就可以了,但是如果是自创玩法,则需要在模拟中确认其有效。

像夜叉的控制节奏用下毒来杀伤敌人,就是它的属性不高,但模拟中确认和力士单挑都有杀死对方的机会,那就证明其玩法是有效的。而修罗的玩法更复杂一些,所以它的设计指标也就更复杂一些。

修罗是AOE伤害,这导致在它的攻击范围内每多一个敌人输出的伤害就多一倍,所以总输出肯定是它第一,那么单挑就必然不能很强。但是这个职业又设计成一个越战越强,靠损血和抢人头积累杀意,用杀意抵消CD时间,爆发的时候不停的按键,不停的放技能,最后把所有人都带走的玩法。

要保证这个玩法是有效的,我在对不同的敌人时采用的技能次数计算方式也不同。对阵龙女时是按照能积累11杀意额外打出3次贪狼刀法计算的,对阵力士是按23杀意,额外打出7次贪狼刀法计算的,这中间的差别就是要在战斗中不断的收人头才行。所以杀龙女的时候是一个人都不杀也能杀死龙女,这样才能起步;杀到力士的时候是杀掉了4个人只剩下力士了,这个时候才能把它带走。这种对不同人不同梯度的模拟是修罗玩法实现的保证。

判官的多对一是一个很有潜力的模拟方法,它不仅可以模拟召唤师和别人的战斗,还可以模拟不同职业团战的效果。

对付召唤物有2种策略,一种是先杀小怪,再杀英雄,这是MMO里打boss常用的策略;还有一种是先杀英雄,这两种策略的关键在于输出和血量的关系。MMO的boss战你秒不掉boss,那就先去清小怪划算,如果你能秒掉boss,那就先杀boss划算。

所以别人和判官的战斗策略有2种,1种是修罗、力士、夜叉先杀英雄比较划算的策略,另一种是龙女和判官先杀小怪比较划算的策略。

修罗是靠AOE,打谁都是全打,力士的火焰呼吸是小范围AOE,自己又能抗的比较久,所以先打英雄比较划算,夜叉是需要反复对一个人攻击才能叠加中毒,所以也是打英雄划算。夜叉龙女输出高,可以快速先点掉一个小怪然后拉开距离,慢慢消耗对手。

所以我在判官对判官的N22Z32计算了一个小怪在各个职业打击下的最大存活时间,然后把这个参数代入判官对各个职业战斗的模拟中。

由于判官比较强,所以给它设计了一些弱点,1个是小怪会给修罗攒杀意,所以修罗非常克制判官,从模拟中可以看到小怪的输出时间和存活时间被大大压低。另一个弱点是判官的控制技能CD时间很长,所以模拟中往往会一边模拟判官用镇压控制住对手自己这边尽力输出的一边倒战斗,另一边模拟判官没有镇压,对手反而打的比判官好的战斗。

总的来说,这15个标签页的战斗模拟是基于这样一种观念:不管玩家的操作是怎么千变万化,不管你怎么排列组合技能挖掘出不同的玩法策略,最终都会落实在哪个技能使用了几次,打出多少伤害双方的损血比是多少这样的数值指标,事先想象出游戏中最重要的操作玩法,就可以让excel计算出这些数值指标,再根据这些指标返回去调整各种参数,最终确保你想象出的操作玩法是可行的,在战斗中既可以表现出职业的特点又能保持玩法的多样性。

最后,补充2点我认为需要注意的地方。

1是战斗模拟时尽量以可测试的典型战斗为准。

这句话的意思是说避免用精确的概率去修正每个技能的伤害。我在每个战斗模拟标签页左上角都给出攻守双方对打各个等级段碾压暴击等特殊效果出现的概率,在等级前期特殊效果的概率往往很低,可能打几十次才会出现1次。

那么对于那些整场战斗只使用1、2次的技能,我就不用这些概率去修正它,因为一旦修正了就表示这场战斗是几十次战斗其中有1次暴击剩下的都没暴击然后你给取了一个平均值,是假的,而不修正的值才是你测试时经常可以观测到的真实的情况。

但你也不能很消极的说只要不一定出现的我都不修正,因为碾压暴击这些属性也是这些英雄实力的一部分,你不计入战斗模拟那肯定是错误的。

所以我会在特殊效果的触发概率比较高(我在这个项目里选的是10%左右),而且技能使用次数较多的情况下加入修正值。
这样战斗模拟出的结果就是一个 “典型的”战斗。

2是要注意管理操作时间。

操作时间是指你点了技能,英雄角色播放技能动作的时间。如果你不去管理的话,很可能程序美术也不会去关注这个参数。美术做动作的时候只会看到那一段动画,他也不知道这段动画播放了几秒。程序只是把动作导入,播放动画的时候让你点技能没用,动作做完接下一个技能或者待机动作。

所以你要么等他们做完接受既成事实,把游戏真实的操作时间输入到技能参数里然后重新调整,要么就是在制作时就进行管理,让制作的动画时间符合你的期望。

还有一种做法就是程序设定一个操作时间,这个操作时间未必和动作播放时间完全一致。我记得以前看war3比赛时经常有选手操作英雄走一下打一下,认为这比放任AI自动攻击的输出效率高,这说明暴雪的程序就把操作时间设置的比动作播放时间要短,所以选手才可以半途打断英雄的技能动作然后让它立刻再执行一个新的攻击。

因为我以前做得一个项目在这方面怎么简单怎么做,所以我这里事先提出,希望以后使用这种方法的人提前和你的程序协调好。


三、数据落实到配置表

因为在之前的项目中有介绍,我这里简单介绍一下适用范围和流程。

属性分为角色、装备、装备强化,除了装备系统比较复杂外,角色和强化都是小系统。文档中的方法比较适合于以装备为中心,附带若干小系统的属性系统。

流程上分2步,第一步是以文档属性原型里属性分配1、属性分配2、属性分配3的3个标签页把整段的职业属性分配到具体的一件件装备里,分配属性的方法就是给每个子系统设定分配比例。

需要注意的是,因为整体属性已经定了,所以在分配时要注意不要让某个重要的子系统过度占用属性,导致其他子系统占用过少,这容易导致其他子系统属性不升反降。还有就是要考虑到玩家看属性面板的观感,不要弄出太极端的情况。

第二步是把分配好的属性转化为配置表的格式,转化方法见文档配置表输出,转化完成的配置表见CSV文档Attribute,虽然这里文档很大,但其实比较简单,我就不展开了。

作者:apm43
最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多