游戏中子弹的工作原理

作者:Tristan Jung @ medium Real游戏引擎开发者 2019-12-30



自1992年《沃芬斯坦3D》大爆发以来,第一人称射击(FPS)游戏便一直是电子游戏产业的主要产品。从那以后,随着图像升级、巨额预算和电子竞技生态系统的发展,这一类型游戏也在不断演变。但它的核心——射击机制呢?我们在这方面进展如何?为什么有些枪让人觉得是真的,而有些人觉得是玩具?

Hitscan

早期时候,许多游戏都依赖于一种叫做raycasting的技术去将3D环境呈现到2D图像(即屏幕)上。Raycasting还允许引擎确定射线相交的第一个对象。开发人员随后开始思考,“如果那道光线来自于模拟子弹的枪口呢?”有了这个想法后,hitscan便诞生了。


raycasting的一个示例


在大多数基于hitscan的武器实现中,当玩家射击一颗子弹时,物理引擎会:

  • 找出枪指着的方向。
  • 从枪口射出一束光线,直到一定范围内。
  • 使用raycasting来确定光线是否击中了一个物体。


如果引擎确定某个物体在火线内,它会用一条消息通知该物体被子弹“击中”。然后目标可以做所有需要的计算来记录伤害。


unity的一个示例,点A表示枪发射射线直到其最大点B。射线与立方体接触,引擎会告诉它已经被击中


Hitscan本质上很简单,但是可以做很多不同的修改来支持其他逻辑:

如果我们让射线穿过它击中的第一个物体,我们就可以穿透同一条线上的多个物体,就像《雷神之锤》中的轨道炮一样。

移除射线的最大范围意味着我们可以发射出一束激光,它会一直持续到我们击中某物为止。

把某些表面设计成反光的,能把子弹弹回来。

使用raycasting的主要优点是它非常快。它计算速度快,不需要额外的内存或处理时间来构建新的物理对象。这意味着保持多客户端同步所需的网络通信是最少的,因为服务器只需要跟踪射线的方向。后座力很容易添加,因为添加一个小扰动的目的,枪将模拟的效果。

因此,许多游戏使用hitscan作为射击逻辑也就不足为奇了。《沃尔芬斯坦3D》和《毁灭战士》都是经典的例子,但即使是最近的游戏也使用了这种技术。像《守望先锋》中的76号士兵、麦克里和Widowmaker等角色都拥有hitscan武器,而《使命召唤》中的大多数武器也是hitscan。



*《守望先锋》,源氏偏转是反射表面的一个例子。




守望先锋




使命召唤




沃尔芬斯坦3D


那么为什么不是所有的游戏都使用这种方法呢?

首先,你可能已经注意到射线有一个无限的移动速度,因此立即到达目的地。当你射出一颗子弹并击中一个物体后,就没有时间旅行了。这意味着如果一束射线正对目标,即使目标在几英里之外,也不可能躲避子弹。

其次,hitscan的大多数实现都使用直线射线。这意味着很难添加风、重力和其他可能影响子弹离开枪膛的外部因素。程序员可以向射线添加扭结和弯曲来帮助它模拟真实的回合,但是一旦玩家射出射线,就没有真正的方法去修改射线的中间路径。


光环。注意枪口的耀斑和地面的撞击效果是如何同时出现


许多“休闲”游戏最终都使用了hitscan方法,因为它简化了大多数新手的学习曲线。但是那些旨在创造一种“身临其境和真实的”射击体验的游戏呢?他们无法在这些限制内实现其目标,因此我们需要另一种方法。

弹射弹道(Projectile Ballistics)

这听起来很神奇,但高层次的想法很简单:从武器中射出的每一颗子弹或射弹都会在环境中产生一个新的物理对象。它有自己的质量,速度,和hitbox,引擎将跟踪这个新对象。


Max Payne 3


在现实主义至上的游戏中,使用弹射弹道的优势会让你的游戏大放异彩。由于每个抛射体都是独立存在的,你现在可以把风、摩擦、重力、温度等因素考虑进去,以及其它任何可以作用在子弹上的力。现在你可以改变物理,玩家可以使用武器而不是简单的枪和激光;你现在可以添加手榴弹和火箭到你的军火库。

由于这个系统下的子弹不会以光速移动,你也可以实现时间特性:

“子弹时间”是可行的。

子弹的飞行时间,这意味着如果你要进行长距离射击(或射击一个缓慢移动的子弹),瞄准前方变得至关重要。

延迟爆炸的炮弹,如手榴弹。

有了这些额外的计算,与使用hitscan相比,处理更加费力。服务器将不得不做更多的工作来确保所有对象是同步的,客户端之间的逻辑差异或冲突必须得到解决,否则同一服务器上的玩家将有不一致的游戏体验。


Superhot




Battlefield 1




Overwatch


有许多方法可以解决这个问题,从而尽可能地提高性能。引擎优化的一个例子是在游戏开始前加载一个对象池,并在需要时“插入并启用”它们。一旦它击中一个表面,你可以播放一个弹道动画和并将子弹保存到对象池。这种方法将减少由于反复创建和销毁对象而产生的一些计算和内存开销。

计算的方式也有多种,但高层次(high level)的区别在于他们决定处理游戏的“tick”,即测量时间的单位:

tick是与渲染逻辑分开计算的,这意味着即使存在帧跳,游戏也能更准确地表示对象。需要更多的逻辑来计算自上次渲染以来经过的确切时间。

计算每一帧的tick;将物理绑定到帧速率。如果您禁用帧速率上限或开始删除帧,您可以看到世界上的加速或波动效果。

当投射物的移动速度快到足以覆盖小物体(如蜱虫)之间的大量距离时,将运动与蜱虫联系起来的后果就很明显了。您可能会遇到这样的情况,在这种情况下,对象似乎互相“交错”,因为它们在引擎中从来没有重叠。

所有这些听起来都很新奇,因此许多人认为这是一种相对较新的方法;但实际上它早于hitscan!在FPS游戏之前,已经有许多自上而下的射击游戏,如《小行星》、《太空入侵者》或《银河号》。这是70年代的街机游戏,尽管有些原始,但当时已经实现了射弹弹道学。

小行星,子弹有点看不清,但它们就在那里!

即使有了所有这些特性,我们也无法创建现实世界的真实再现。有没有一种方法可以同时兼顾两种方法的优点?


混合系统(Hybrid Systems)

大多数游戏引擎可以处理两种类型的子弹模拟:hitscan和射弹弹道。这给了我们拥有多种武器的选择:像《光环》、《GTA》和《半条命》这样的游戏都有支持这两种物理的武器。


Halo, 突击步枪使用hitscan




针刺者使用射弹弹道


开发人员还可以混合使用两种技术来解决每个系统的弱点,从而提供更加生活化的体验。例如,为了解决从弹射弹道的角度来确定物体之间的相位问题,每颗子弹都可以在引擎的每一次跳动中画出一条射线。这有助于引擎看到任何光线是否会在tick之间相交,在半空中相撞。

它们也可以被混合以增强游戏的功能。《狙击精英》系列就是一个很好的例子;扣动扳机后,引擎使用hitscan来确定射击是否足够接近任何可探测的目标来触发慢动作。如果是真的,它将在子弹时间内发射出一颗子弹。


狙击精英


这篇文章涵盖了子弹如何在视频游戏中工作的基本知识,有趣的是,该领域更关注于较小的改进,而不是大规模的检修。在最初几款革命性游戏发行后,并没有取得显着的进展。这咱混合方法并不会很快消失,因为它提供了额外的功能,但很多改进可能将发生在弹射弹道学上。随着我们不断增加tick计算的频率(随着CPU能力的增加),我们将能够接近“真实”子弹模拟的渐进极限。


作者:Tristan Jung @ medium
来源:Real游戏引擎开发者
最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多