【干货系列】坦克类游戏弹道系统设计指导

发表于2016-05-19
评论1 4k浏览

 

今天我们讲讲类似坦克世界这种仿真模拟的游戏,命中和伤害判定是怎么做的


  但是我估计各位看到这里的时候一定直接会说:直接物理运算啊!


  但是我要说一句:物理他奶奶个腿!


  首先这里边一共有两个东西

 

  1:炮弹


  2:被命中目标

 

  但是呢,会包含3个子系统


  1):飞行弹道


  2):命中判定


  3):伤害判定


  我们先来看第一个东西


  炮弹


  对于一个游戏来说,肯定会有很多的元素。比如,坦克起码二三十种吧,炮弹也有七八种吧。那么肯定不同的坦克,不同的炮弹,会有不同的散布,射程,穿深,等差异化表现


  这时候很多人就以为,这一定是一个很复杂的系统,参与管理的属性一定很多。比如什么炮弹质量啊,重力加速度啊,空气阻力啊,惯性啊,就差没有把北半球自转的角动惯量给加进去了。


  然后也有很多人直接就以为:用物理计算就好了呗。好吧,我先假设你要输入“物理计算”四个汉字,它就能给你自动物理计算了。但是这样你这么多炮弹和坦克还是得有差异,你还是得有不同的属性表现,你得有参数控制啊,你得想好哪些参数控制啊,哪怕你能列出重量直径长度密度重心等不同的参数都行啊


  我曾经多次强调一句话:策划,要用最简单的办法来处理最复杂的需求。


  因为如果你非要搞得很复杂,那么到时候你维护起来还不是得自找不自在。


  回到炮弹本身,我们回顾一下有多少差异化需要表现


  1:射程


  2:飞行速度


  3:命中散布


  4:穿深


  不同的游戏项目,对现实的拟真度是不一样的。比如坦克世界的拟真度就不是很高。现在我们尽量以更拟真的需求来做例子。


  首先是射程。


  这个其实很简单,抛物线在数轴上的前后端最大距离即可,可以用椭圆曲线,也可以用展弦公式,也可以用其他,这个可以看大家的爱好,因为这一块并不复杂,不同公式效率也没什么差别。


  接着,飞行速度


  现实中,炮口初速是衡量一门炮优劣的重要战术指标。但是大家也注意到了,这是“炮口”初速。因为炮弹在飞行过程中,由于空气阻力,减速效应是非常大的,比如现代坦克的破甲弹,炮口初速可能在1000米/S上下,但是当它飞到2000米的时候,速度会急剧下降到300米/S以下,而这才经过了多少时间?


  那游戏设计时,如果要模拟这个情况要怎么做?


  很简单,递减公式大家其实都很熟悉了。。对于速度的控制,直接用递减公式的参数就可以做出不同炮弹的飞行速度差异化,而不需要给每一种炮弹配置一套速度计算公式。


  比如速度V=Y-T*X


  V=速度


  Y=初速


  T=时间


  X=速度递减修正倍数参数


  不同的速度曲线只要修改X的值就可达到。


  这时候,我们得到第二个炮弹属性:速度递减参数。


  接下来,到了命中散布的问题。


  炮弹飞行像目标,肯定不会像CS一样一定命中你的十字准星正中间,而是有一定的散布范围。


  很明显,不同的炮和不同的弹药都有各自的散布属性。


  那么游戏设计时,如何让两者都起作用,而不互相冲突?


  首先大家都知道,炮有一个身管倍径的参数。这个长径比越长,炮弹的射程越远,速度越快。当然在动能的加持下,散布也会相应缩小一些。


  然后炮弹本身怎么办?炮弹也是有不同的散布的,因为不同的炮弹形状不同,飞行气动参数不同。


  于是,可以给炮弹绑定一个散布属性:散布半径。


  比如半径是30CM。那么以弹道轴线为圆心,半径30CM的圆内,随机出弹着点 。利用0.0坐标随机+-数值就可以得到四象限随机分布。由于炮并非连射武器,所以并不需要像FPS那样设计枪械连续弹着点那样去设计散布分布。(相信聪明的同学已经想到,这里可是个吸钱的好设定)


  这时候可能有人问,炮管的属性怎么办?炮管确实对炮弹散布有帮助。那么给炮管一个属性:增加或缩减炮弹的散布半径。


  就可以做到两者属性都起作用,又能最大限度的扩大差异化。


  第四个,穿深。


  这个问题需要对以上3个设定进行回顾。


  每一种炮弹都有各自的质量以及速度,也就是有不同的动能携带量,直接体现就是命中目标后的穿透能力。


  但是之前,炮弹经过了发射,飞行,直到命中目标。


  嗯,打是打上去了,但是我们依然还需要进行一次命中判定。


  有的坦克,比如炮弹,它是个半圆形,有的,则是很大角度的楔形。那么在现实中,是有可能发生跳弹的。


  这时候,就需要先判定有没有跳。这个,则需要进行炮弹和命中目标面的角度检查,当角度大于多少时,则发生跳弹。


  不过呢,二战时的坦克,有一种风帽穿甲弹,还有一种叫平头穿甲弹,这两种炮弹命中非垂直目标面时,会有自转正效应,也就是不会发生跳弹,反而会增加穿透的概率。


  那么这里又出现两个新属性


  1:炮弹类型,用于是否无视跳弹


  2:装甲厚度,用于判定是否穿透。


  但是第二个属性它并不是直接就参与作用。对于非垂直面,不发生跳弹的情况下,炮弹穿透装甲的过程是不一样的




  不同角度下,穿透装甲所需要经过的行程是不同的

 

  所以,当炮弹类型属于无视跳弹 时,计算装甲厚度直接取值装甲自身厚度。


  当炮弹类型不属于无视跳弹,则根据三角函数计算要穿透的行程。


  这时候,一个新的问题出现了:没有跳弹,开始穿透了。那么是穿透了还是没穿透呢?


  这时候,我们需要更明确的炮弹属性:炮弹飞了这么久,还有多少战斗力?


  我们之前有了炮弹的速度参数,可以得到炮弹飞到目标前,速度还有多少。


  那么,我们还要增加一个炮弹的参数:质量。


  当然,这个质量并非真实的质量,只是一个用来做量化差异的参数。


  比如一个质量为10的的炮弹,速度还有700米/S。那么我们可以做一个简单的公式,两者相乘再除法。


  (10X700)/100=70  |举例


  来定义这枚炮弹还剩余穿透70毫米厚度装甲的能力。


  这时候回头检查装甲行程。如果小于70即可判定击穿,大于70则可判定未击穿


  击穿后的处理如何做?


  部位损伤,大家都很熟悉了。简单的子模块碰撞检测,炮弹碰到了,好损伤,相应功能失效。


  也可以给每一个子模块定义分值。类似血条世界那样当你分值扣完就GAME OVER


  回头来看,炮弹有多少属性呢?


  1:散布设定


  2:速度递减参数


  3:是否无视跳弹 是|或直接定义跳弹角度参数


  4:穿深质量参数


  是不是和大家最开始想的有很大不同?


  炮的属性


  1:散布属性加成


  2:射程


  3:转速


  4:装填速度


  到了被命中物体


  1:角度


  2:厚度


  3:不同材质的厚度效果加成


  4:子模块碰撞判定

 

  涉及到的数学公式


  1:抛物线|展弦|椭圆曲线  (任选)


  2:递减公式


  3:三角函数


  4:简单运算

 

  有人看完了可能会问,似乎漏了点什么?比如风偏。


  实际上由于坦克交战距离短,而炮弹自身动能极大,除非你在台风天里对几乎看不到的目标射击,否则以游戏中的可见交战距离来说意义并不大。


  当然,真要做的话也相当简单,只需要给炮弹套上一个位移BUFF即可。 是不是物理它奶奶个腿? 

看了上面的文章 热爱游戏创作的你是不是已经开始热血沸腾了呢?是不是迫不及待的想加入游戏团队成为里面的一员呢?

福利来啦~赶快加入腾讯GAD交流群,人满封群!每天分享游戏开发内部干货、教学视频、福利活动、和有相同梦想的人在一起,更有腾讯游戏专家手把手教你做游戏!

腾讯GAD游戏策划交流群486822377Gad策划交流群

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引