数值模型建立
数值模型建立
前言
本文将介绍一种MMO游戏数值模型建立的流程(主要是下游战斗部分)。其实这个流程没有什么标准之说,不同的游戏有不同的方法,每个人习惯不一样做的方式也不一样,我只介绍一个我习惯用的框架,有任何建议或者问题欢迎随时与我交流(RTX:rainxia)
一般来说游戏的数值分为上游和下游两大块,下游主要跟战斗系统有关,包括伤害公式战斗力等,上游主要跟玩家成长,产出消耗,商业化有关。下游是上游的基础。
由于篇幅有限,本文重点介绍下游数值(跟战斗紧密相关)。
伤害公式一般分为两大类:减法公式和除法公式
这里将介绍两种基本的公式,清楚了它们的特点和不同之后,可以很容易的演变成其他更复杂的公式。
用att表示攻击力,用def表示防御力,dmg表示单次所受伤害,f表示1秒内的攻击频率
减法公式:dmg=att-def
经典RTS游戏星际争霸就用的是这个减法公式,它的特点是:
Ø 战斗单位不具有传递性
举个例子(hp表示生命值):
单位A: hp=1000, att=60, def=10, f=1,
单位B: hp =1000, att =50, def =30,f=1
单位C: hp =1000, att=200,def =10, f=0.25
通过简单的战斗模拟你会发现:
B可以战胜A(A对B的DPS为30,而B对A的DPS为40)
C可以战胜B(B对C的DPS为40,而C对B的DPS为42.5)
而A可以战胜C(C对A的DPS为47.5,而A对C的DPS为50)
所以出现了 A战胜B , B战胜C而A却战败于C的情况,所以单位之间没有传递性
其实很好理解,攻击频率高的单位攻击敌人时,对方的防御力起作用的次数也多,所以高攻速低攻的单位被高防御的单位克制。
这个特点让单位之间有了相互克制关系,星际争霸的单位之所以能做的那么多样而又平衡,战斗公式起了很大的作用。
Ø 同时等比例放大攻击力和防御力战斗结果不变,放大缩小hp,f也不变
还是上次的例子,我们把A,B,C的攻击力和防御力同时乘以2
单位A: hp=1000, att=120, def=20, f=1,
单位B: hp =1000, att =100, def =60,f=1
单位C: hp =1000, att =400,def =20, f=0.25
战斗结果A战胜B , B战胜C而A却战败于C,和之前一样。单独调整hp和f也一样。
这个特点可以很方便的量化属性价格,减法公式中,攻击力的价格和防御力的价格在同一阶段等比例相同,即同样100块钱可以提升20%攻击力或者20%防御力。这样还可以保持战斗的平衡性。
那有人会问,那100块钱可以提升多少血量?多少攻击速度。答案是一样的:20%。原因会在后面战斗力衡量中说到。
Ø 攻击力的边际收益递减,而防御力的边际收益递增
这个特点在理解了特点2之后其实是显而易见的结论。
举例:
假设一个单位每次输出的实际伤害是10,受到的实际伤害是10。那对于这个单位而言,每额外增加1点攻击力,所得到的伤害加成依次是10%,9.1%,8.33%...,而增加1点防御力所得到的伤害降低依次是10%,11.11%,12.5%...。
所以如果你的问题是同样增加1点攻击力或者1点防御力,那价格怎么定?
很简单,攻击力的价格比防御力要便宜。这个跟特点2中的定价并不矛盾。我们在做属性成长的平衡性的时候要从多个维度去量化和调整属性价格。成长线中每个阶段不同职业的克制关系保持一致,同一阶段不同属性提升的价格都是需要去考虑的。
下面介绍除法公式:
除法公式:dmg=att*(1-k*def/(def+C))
其中k和C为两个调整参数
当def=0时,减伤效果为k/C
当def->正无穷时,减伤效果为k
有一些除法公式还会引入等级或者自身攻击力等参数。这里只介绍一个最基本的公式,了解它之后,更复杂的变种的除法公式都很容易理解。
该除法公式的特点:
Ø 单位之间具有传递性
如果A能战胜B,B能战胜C,则A能战胜C。
这里就不加以证明了,感兴趣的同学可以自己算一算。
这个特点让策划更容易判断单位的战力强弱,同时调整平衡性。用这类公式的游戏一般来说更注重单局内玩家的操作对抗,而不是兵种相克。例如魔兽世界就是用的该除法公式的变种。
Ø 攻击和防御边际收益均递减
攻击收益递减的原因和减法公式是一样的
为了更方便观察防御收益曲线
假定:k=0.75, C=400
横轴是防御力,纵轴是减伤效果。
可以发现当防御力小于常数C时,增加防御力带来的减伤效果增加明显
当防御力大于常数C时,增加防御力带来的减伤效果增加是逐步递减的
而它的极限值就是系数k
这个特点使得防御数值的价格计算变得特殊一些,聪明的玩家会让自己的防御数值尽可能接近C,一旦超过C了,再提升防御力就不如之前划算了,可能回头去追求血量等其他属性。我要说的是这个特点并不一定是一个缺点。它让玩家有了更多样的追求,让一个数值变得有上限会让玩家计算每个属性的性价比,这本身也有一定乐趣。而对于策划来说,除法公式可以让你引入更多属性参数,抗性,韧性等等,这些数值都可以设置上限,让玩家去追求。
Ø 小结:
其实减法公式和除法公式还有一些其他的点要注意,例如减法公式在数值膨胀后容易出现不破防的问题,战力不容易计算的问题,除法公式在游戏后期容易出现消费体验的边际效应(防御力收益有上限)。不过这些问题很多策划类文章应该都有说明,也都有一些相应的解决办法。在我看来,理解了减法公式和除法公式的特点之后,这些问题都是可以解决的。例如减法公式采用分段函数,除法公式引入更多属性维度等等。
两种公式没有孰优孰劣的问题,关键要结合数值成长体验来看。
下面介绍战斗力相关的内容
何如衡量一个单位的战斗力强弱一直是一个有趣的问题。下面直接给出标准的公式:
用FC(Fight Capacity)表示战斗力,EHP表示有效生命,DPS表示秒伤
FC=EHP*DPS
就是这么简单的一个公式,如果EHP是可计算的,则FC直接决定了战斗结果(不考虑离散情况)
这个公式的正确性就不加以证明了,可以参考的文章太多。关键是EHP怎么计算的问题
答案是EHP表示了一个单位实际的承受伤害能力,在不同的伤害公式下计算方式不一样。
在除法公式下:
假定单位的各种防御属性最后加总起来得到的减伤百分比为K,则
EHP=HP/(1-k)
这个很好理解,因为你受到的每次攻击都会按系数K来减伤,那你的实际生命值会大于你的面板生命值。
所以除法公式下很好计算FC,单位的传递性也由此而来,FC可以充分表示单位的实际战斗能力。
而在减法公式下:
EHP是根据环境变化而变化的。
假定在一个环境(副本/战场)中战斗的平均时长为T,所有单位的平均攻击频率为F,则
FC=(HP+Def*T*F)*DPS
这个公式其实也好理解,有效生命值=生命值+防御力生效的次数。环境中攻击频率越高,战斗时长越长则防御属性越重要。
当然这个公式得到的并不是真实的战斗力,只是根据环境的一个评估值。有可能出现战斗力低的单位战胜战斗力高的情况。上文中也说到过减法公式下单位不具有传递性,所以减法公式下要想完美的衡量一个单位的战斗能力是不可能的,它始终受到环境的影响。
庆幸的是评估值在大多情况下足够表示战斗力了,只要算出每个环境的平均单局时长和攻击频率就可以了。
以上计算没有考虑距离对战斗的影响。如果要考虑距离因素的话,计算远程战斗力时给远程单位的EHP加上 射程/近战单位的平均移动速度*近战单位平均DPS就可以了。当然,这也是一个评估值。
除了上述计算战斗力的方法之外,还有一种简单计算战斗力的方法,就是对单位的所有属性做一个加权求和。这种方法不考虑实际战斗过程,只是给玩家一个参考值,在游戏中起到一个参考作用,或者说玩家追求的目标。
说了战斗力如何计算,那战斗力算出来到底有什么用呢?
其实这个值是整个游戏中最基础的参考值。知道了一个单位的作战能力才能对它的强弱做出判断。
在设计不同职业,做属性量化,规划成长线等等都需要用到它。有的游戏甚至把战斗过程弱化,战斗结果只跟战斗力有关。
说完了伤害公示和战斗力衡量,可以开始尝试做职业设计了。一般来说传统职业无非tank,dps,奶这三大类。分别对应吸收伤害,造成伤害,回复生命三个维度。对这三大类进一步细分可以演化出更多的职业,这里就不展开了。需要额外说明的是有时候我们做职业的时候不考虑做回复生命类职业,因为它会拖慢游戏的战斗节奏,会明显的增加战斗时长并且增加战斗力计算的复杂度。所以如果你要在游戏里增加这类职业的话,得先考虑好其增加的复杂度是否匹配的上它带来的乐趣。
属性设计包括最基本的生命,防御,攻击,攻速,闪避,暴击,幸运,爆伤等等…
一般来说我是比较倾向把属性维度做得少一点,一来是好控制,二来是玩家好理解。单个属性挖的坑足够就行。有的游戏喜欢做的特别复杂,什么维度都有,一个属性面板可以看2分钟还看不懂。这种做法一般是为那些硬核玩家准备的。
那么在实际做的时候,如何设计职业的属性倾向呢?我一般是用“加点法”。
例如有三个职业:战士,弓箭手,刺客
三个属性维度:生命,攻击力,攻击速度
那么我会假设有5个属性点。
属性点 | 生命 | 攻击力 | 攻击速度 |
战士 | 3 | 1 | 1 |
弓箭手 | 1 | 3 | 1 |
刺客 | 1 | 1 | 3 |
然后再确定每个属性点分别对应X点生命,Y点攻击力,Z的攻击速度
这个确定的过程需要不断的调试。一般来说让他们的战斗力相差不超过6%就算是相对平衡。
同时要注意的是在确定属性数值时,一个比较重要的参数是平均战斗时长。为了控制这个数值,我们一般会引入参数:单位的平均可承受伤害次数。假定设为n。
n=平均血量/平均攻击力
按照上面的例子有三个职业,可以快速算出n=X/Y,平均战斗时长T=X/(Y*Z)
那么在确定XYZ时要时刻关注n,T的变化。调整过程中也要配合战斗模拟器,或者实际游戏体验来不断的修改这两个值。
一般来说格斗游戏,回合制等游戏更看重n这个值。而即时制没有硬直概念的游戏更看重T这个值。
完成上述步骤之后只是获得了一个相对平衡的初版职业数值,接下来要进行更复杂的属性量化和拆解工作。
在游戏的上游和下游数值中,属性量化和拆解起着承上启下的作用
属性量化是指
为玩家在不同的成长阶段设定不同的数值成长速度,例如1-20级,攻击力这个数值成长速度为2,每级增加2点攻击力。
属性拆解是指
量化完成之后,把你设定的数值分配到不同的系统中,例如,玩家从30级升到31级应该获得10点攻击力,但这10点有2点是等级成长自动获得,3点是武器强化+1获得,2点是升级技能获得,3点是宝石镶嵌获得。
大致流程如下:
这个工作会比较繁琐和耗时间,但是一旦完成你将会获得一个非常清晰的玩家属性(战斗力)的成长曲线
这个量化工作是个比较纯正的体力活,硬要说什么技巧的话,我是习惯用分阶段线性函数(kx+b)来寻找相对合适的平衡点,然后根据这些点用excel拉一个函数曲线。对于除法公式的话需要多注意一下,先拉出想要的减伤效果曲线,然后根据公式反推出防御力曲线,这样比较方便控制防御力成长速度。
这里只介绍一般的方法,最后贴一个某职业战斗力拆分的效果图。
假定最大等级60级,有装备,强化,宝石,技能4个提升战力的系统。
等级 | 自身成长 | 装备 | 强化 | 宝石 | 技能 |
1-20 | 20% | 50% |
|
| 30% |
21-40 | 10% | 40% | 30% |
| 20% |
40-60 | 10% | 25% | 25% | 20% | 20% |
可以看出1-20级只开放了装备系统和技能
21-40级新开放了强化系统
41-60级新开放了宝石系统
以上只是一个示意图,最后想强调的是,这个量化和拆分是下游数值最重要的部分。游戏的坑能挖的有多深,生命周期能拉多长很大一部分就是靠下游数值决定的。
由于上游数值不是本文重点介绍的内容,所以只会介绍简单概念。
一般把玩家分为:免费玩家,小R玩家,大R玩家。
给每类玩家规划一条战力成长曲线,这个曲线决定了每类玩家的坑有多深,生命周期有多久。之后的怪物数值也会根据这个战力曲线设计不同的副本或者关卡难度。
具体不同付费玩家之间的战力差值为多少,需要设定一个“付费-战力提升百分比“曲线。这个曲线应该是有边际效应的。例如付的第一个100元可以提升当前10%战力(或者10%的战力成长速度),付的第二个100元可以提升8%,第三个6%....这样一次递减。这个在后面商业化的时候会进一步细化。
做怪物数值时,一般会在保证战斗时长符合预期的前提下,让怪物的战斗力略低于玩家(增加怪物的血量,削弱怪物攻击力)。然后设置不同难度的关卡满足不同付费玩家的需求。这个过程同样需要战斗模拟器辅助。调整每一个副本/关卡的体验。在每个成长阶段可以设置一个有难度的“卡点”,让免费玩家在打这个副本时,差一点点就能打过,刺激他付费。玩家面对这类副本的选择无非两个:花钱或者等待第二天升级之后再来挑战。
做产出消耗有一个比较通用的原则是根据消耗定产出。
一般会先根据不同系统确定消耗品和消耗的量,再根据消耗的量确定每天日常任务的产出量。
例如强化装备+1升级到+2需要5个强化石。那么再设定每天日常任务能获得2个强化石。玩家从强化1成长到强化2就需要3天时间。现在主流做产出的方式都是日常任务+主线获取(一次性),只要控制好这个产出消耗比,玩家就会按照预设的轨迹成长。
商业化:
一个好游戏是会让玩家花钱花的爽的,而不是去参与轮盘抽奖花了大笔RMB运气不好没抽到(现在都引入保底的机制)。
目前个人觉得比较好的游戏付费体验是以下3个:
1.花钱买时间
2.VIP特权
3.服装或稀有收藏品,可炫耀
他们避免了玩家可以付费直接获得超高战力的情况(可以更快的成长而不是直接获得)。COC算是一个很好的例子吧。
整个数值模型就说这么多,其实还有很多没有谈到的地方,包括战斗模拟器编写方式,技能对战斗的影响,经验值,道具模拟。每个模块其实都可以拿出来单写一篇文章。但是我相信只要梳理好了最基本的流程,不论你做什么类型的游戏,都能触类旁通。最后希望我介绍的流程还有一些方法对读者有用,有任何建议或者问题欢迎与我联系讨论。