子弹在视频游戏中如何工作?

自1992年最受欢迎的Wolfenstein 3D问世以来,FPS游戏(第一人称射击,第一人称射击)已成为视频游戏行业不可或缺的一部分。 从那时起,游戏类型不断发展:图形得到改善,开发预算增加,电子竞技生态系统也得到了发展。 但是他们的基础-射击技师呢? 在这方面的发展如何? 为什么在某些游戏中武器看起来是真实的,而在另一些游戏中武器却像玩具?

扫描扫描


在上一个时代,许多将3D场景渲染为2D图像的游戏都使用一种称为raycasting的技术。 射线投射使引擎可以确定光束相交的第一个对象。 但是随后,开发人员提出了一个问题:“如果让光束从武器的枪管中射出来模拟子弹,那该怎么办?”由于这个想法,一台hitcan诞生了(“ hit scan”)。


光线投射示例

在具有Hitscan的武器的大多数实现中,当玩家开火时,物理引擎执行以下操作:

  • 定义武器指向的方向。
  • 从武器枪管以预定距离释放光束。
  • 使用光线投射确定光线是否已击中对象。

如果引擎确定物体在火线上,那么他将告知他,说子弹“击中”了他。 然后,目标可以执行记录损坏所需的所有计算。


来自Unity 点A表示向最大点B发射光束的武器。光束与立方体碰撞,引擎报告立方体被击中。

Hitscan本质上很简单,但是可以进行许多不同的修改以添加其他逻辑:

  • 如果我们将光束继续延伸到它撞到的第一个物体之外,就可以刺穿线上的多个物体,例如Quake中的 the弹枪
  • 如果我们从光束上移开最大范围,那么我们将得到一个永远飞舞的激光,直到它撞到某物
  • 您可以通过编程使某些表面具有反射性,以使子弹从表面反弹


守望先锋 源氏字符偏转能力是反射表面的一个例子。

射线投射的主要优点是其巨大的处理速度。 它可以快速计算,不需要额外的内存或处理器时间即可创建新的物理对象。 这意味着同步多个客户端所需的网络代码将最少,因为服务器只需要跟踪光束的方向即可。 为了模拟这种效果,还可以简单地实现后坐力,足以增加武器视线的轻微偏差。

因此,在许多游戏的射击逻辑中使用hitscan并不奇怪。 Wolfenstein 3DDoom是经典的例子,但是现代游戏中也使用了这项技术。 士兵76,麦克莱和守望先锋寡妇之类的角色都使用Hitscan武器,《 使命召唤》中的大多数武器也是基于hitscan的。




《守望先锋》,《使命召唤》,德军总部3D

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

首先,您可能已经注意到,射线具有无限高的运动速度,即它们立即到达终点。 没有时间让子弹在发射子弹和击中物体之间移动。 这意味着,如果射线撞击物体,即使目标距玩家几公里,也无法避免子弹。


请注意,枪口闪光和撞击地面的效果同时发生。

其次,大多数Hitscan实现使用直接光束。 这意味着很难考虑风,重力和其他可能会影响子弹从后备箱中飞出的外部因素。 程序员可以添加各种技巧,以使光束模仿真实的子弹,但是一旦玩家“射击”了光束,就无法在中间改变其路径。

在许多休闲游戏中,仍然使用hitscan,因为它简化了大多数新手的学习曲线。 但是,那些试图传达射击真实感的游戏又如何呢? 有了这样的限制,这是不可能实现的,因此需要一种不同的方法。

飞行物体的弹道学


这个术语可能看起来很复杂,但是从抽象的角度来看,这个想法很简单。 用武器发射的每个子弹或弹丸都会在场景中创建一个新的物理对象。 它具有自己的质量,速度和联系方式的边界框(hitbox),游戏引擎会对其进行跟踪。


麦克斯·佩恩3

弹道的好处充分体现在以现实为重的游戏中。 由于每个飞行物体都独立存在,因此我们可以考虑风,摩擦,重力,温度的影响-应该作用在子弹上的任何力。 现在我们已经能够改变物理原理,玩家可以使用更多种武器,而不仅仅是简单的手枪和激光; 我们可以向我们的武器库中添加手榴弹和火箭。

由于这种系统中的子弹不会以光速移动,因此也可能实现时间特性:

  • Max PayneSniper EliteSuperhot使用的子弹时间。
  • 子弹的行进时间,即长距离射击(或射击缓慢移动的弹丸)时,先发制人变得至关重要。
  • 延迟的炮弹爆炸,例如手榴弹

由于这些额外的计算,处理变得比使用hitscan更昂贵。 为了确保同步,服务器必须做更多的工作,有必要消除客户端逻辑上的差异或冲突,以便同一台服务器中的所有播放器处于相同的条件。




Superhot,《战地1》,守望先锋

有许多变通办法可以最大化生产率。 例如,引擎可以存储游戏开始之前加载的对象池,并根据需要“打开”它们。 击中表面后,您可以播放弹道动画并关闭子弹,以备将来使用。 使用此方法可以节省对象的多次创建和销毁所占用的计算资源和内存。

还有许多方法可以执行计算,但总的来说,区别在于他们决定处理游戏的“技巧”(时间单位)的地方:

  • 时钟是与渲染逻辑分开计算的,也就是说,即使跳过帧,游戏也会更精确地再现对象。 需要更多的逻辑来计算自上次渲染以来经过的确切时间。
  • 计算每一帧的度量; 物理绑定帧速率。 如果禁用对最大帧速率的限制,或者游戏开始跳过帧,那么世界的物理状态将加速或减慢。

当壳体移动得足够快以在小节之间移动相当大的距离时,将运动与小节联系起来的效果清晰可见。 当物体彼此“通过”时,可能会出现这种情况,因为在引擎中它们从未相交。

这一切看起来都很复杂,所以很多人认为这是一个相对较新的方法。 但是,它实际上是在hitscan之前出现的! 在FPS游戏之前,有许多自上而下的射击游戏,例如AsteroidsSpace InvadersGalaxian 。 这些是70年代的街机游戏,尽管相当原始,但已经实施了弹道射击。


小行星。 贝壳很难看到,但是它们确实如此!

但是,即使具有所有这些功能,我们也无法重新创建现实世界的现实模型。 有什么办法可以利用这两种方法吗?

混合动力系统


大多数游戏引擎都能够处理两种类型的子弹模拟:命中扫描和弹道模拟。 这使您可以实现多种武器选择; 《 光晕》 ,《 侠盗猎车手》和《 半条命》等游戏都拥有可以支持两种物理类型的武器。



突击步枪使用hitscan; 滚针使用弹道弹道

开发人员还可以混合使用两种技术来覆盖每个系统的弱点并提供更实际的行为。 例如,为了消除使物体彼此通过的问题,发动机的每个循环中的每个子弹都可以发射光束。 这使引擎可以查看射线之间是否有任何相交的碰撞,并碰撞到空气中。

它们也可以结合起来以改善游戏的功能。 狙击精英系列就是一个很好的例子。 拉动扳机后,引擎使用命中扫描来确定镜头是否足够靠近任何可检测的物体以触发慢动作。 如果是这样,则在“子弹时间”模式下发射子弹并进行弹道计算。


狙击精英

因此,我们研究了视频游戏中子弹行为的基础知识! 有趣的是,这方面的改进主要是小的优化和改进,而不是大规模的处理。 在发布了最初的几款革命性游戏之后,我们没有采取任何重大步骤或突破。

接下来呢? 未来该领域将如何发展?

我不认为在不久的将来混合方法会消失,因为它会带来更多好处。 但我预计,弹道的弹道将有很多改进。 时钟计算频率继续增加(因为CPU功率在增加),我们可以接近“真实世界”子弹模拟的渐近极限。

Source: https://habr.com/ru/post/zh-CN475420/


All Articles