遊戲中子彈的工作原理


遊戲中子彈的工作原理

原文作者:Tristan Jung @ medium

自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能力的增加),我們將能夠接近“真實”子彈模擬的漸進極限。


分享到:


相關文章: