游戏中子弹的工作原理
自1992年《沃芬斯坦3D》大爆發(fā)以來,第一人稱射擊(FPS)游戲便一直是電子游戲產(chǎn)業(yè)的主要產(chǎn)品。從那以后,隨著圖像升級、巨額預(yù)算和電子競技生態(tài)系統(tǒng)的發(fā)展,這一類型游戲也在不斷演變。但它的核心——射擊機制呢?我們在這方面進展如何?為什么有些槍讓人覺得是真的,而有些人覺得是玩具?
Hitscan
早期時候,許多游戲都依賴于一種叫做raycasting的技術(shù)去將3D環(huán)境呈現(xiàn)到2D圖像(即屏幕)上。Raycasting還允許引擎確定射線相交的第一個對象。開發(fā)人員隨后開始思考,“如果那道光線來自于模擬子彈的槍口呢?”有了這個想法后,hitscan便誕生了。
?
在大多數(shù)基于hitscan的武器實現(xiàn)中,當(dāng)玩家射擊一顆子彈時,物理引擎會:
?
- 找出槍指著的方向。
- 從槍口射出一束光線,直到一定范圍內(nèi)。
- 使用raycasting來確定光線是否擊中了一個物體。
如果引擎確定某個物體在火線內(nèi),它會用一條消息通知該物體被子彈“擊中”。然后目標(biāo)可以做所有需要的計算來記錄傷害。
?
Hitscan本質(zhì)上很簡單,但是可以做很多不同的修改來支持其他邏輯:
如果我們讓射線穿過它擊中的第一個物體,我們就可以穿透同一條線上的多個物體,就像《雷神之錘》中的軌道炮一樣。
移除射線的最大范圍意味著我們可以發(fā)射出一束激光,它會一直持續(xù)到我們擊中某物為止。
把某些表面設(shè)計成反光的,能把子彈彈回來。
使用raycasting的主要優(yōu)點是它非常快。它計算速度快,不需要額外的內(nèi)存或處理時間來構(gòu)建新的物理對象。這意味著保持多客戶端同步所需的網(wǎng)絡(luò)通信是最少的,因為服務(wù)器只需要跟蹤射線的方向。后座力很容易添加,因為添加一個小擾動的目的,槍將模擬的效果。
因此,許多游戲使用hitscan作為射擊邏輯也就不足為奇了。《沃爾芬斯坦3D》和《毀滅戰(zhàn)士》都是經(jīng)典的例子,但即使是最近的游戲也使用了這種技術(shù)。像《守望先鋒》中的76號士兵、麥克里和Widowmaker等角色都擁有hitscan武器,而《使命召喚》中的大多數(shù)武器也是hitscan。
那么為什么不是所有的游戲都使用這種方法呢?
首先,你可能已經(jīng)注意到射線有一個無限的移動速度,因此立即到達目的地。當(dāng)你射出一顆子彈并擊中一個物體后,就沒有時間旅行了。這意味著如果一束射線正對目標(biāo),即使目標(biāo)在幾英里之外,也不可能躲避子彈。
其次,hitscan的大多數(shù)實現(xiàn)都使用直線射線。這意味著很難添加風(fēng)、重力和其他可能影響子彈離開槍膛的外部因素。程序員可以向射線添加扭結(jié)和彎曲來幫助它模擬真實的回合,但是一旦玩家射出射線,就沒有真正的方法去修改射線的中間路徑。
?
許多“休閑”游戲最終都使用了hitscan方法,因為它簡化了大多數(shù)新手的學(xué)習(xí)曲線。但是那些旨在創(chuàng)造一種“身臨其境和真實的”射擊體驗的游戲呢?他們無法在這些限制內(nèi)實現(xiàn)其目標(biāo),因此我們需要另一種方法。
彈射彈道(Projectile Ballistics)
這聽起來很神奇,但高層次的想法很簡單:從武器中射出的每一顆子彈或射彈都會在環(huán)境中產(chǎn)生一個新的物理對象。它有自己的質(zhì)量,速度,和hitbox,引擎將跟蹤這個新對象。
?
在現(xiàn)實主義至上的游戲中,使用彈射彈道的優(yōu)勢會讓你的游戲大放異彩。由于每個拋射體都是獨立存在的,你現(xiàn)在可以把風(fēng)、摩擦、重力、溫度等因素考慮進去,以及其它任何可以作用在子彈上的力。現(xiàn)在你可以改變物理,玩家可以使用武器而不是簡單的槍和激光;你現(xiàn)在可以添加手榴彈和火箭到你的軍火庫。
由于這個系統(tǒng)下的子彈不會以光速移動,你也可以實現(xiàn)時間特性:
“子彈時間”是可行的。
子彈的飛行時間,這意味著如果你要進行長距離射擊(或射擊一個緩慢移動的子彈),瞄準(zhǔn)前方變得至關(guān)重要。
延遲爆炸的炮彈,游戲賬號如手榴彈。
有了這些額外的計算,與使用hitscan相比,處理更加費力。服務(wù)器將不得不做更多的工作來確保所有對象是同步的,客戶端之間的邏輯差異或沖突必須得到解決,否則同一服務(wù)器上的玩家將有不一致的游戲體驗。
有許多方法可以解決這個問題,從而盡可能地提高性能。引擎優(yōu)化的一個例子是在游戲開始前加載一個對象池,并在需要時“插入并啟用”它們。一旦它擊中一個表面,你可以播放一個彈道動畫和并將子彈保存到對象池。這種方法將減少由于反復(fù)創(chuàng)建和銷毀對象而產(chǎn)生的一些計算和內(nèi)存開銷。
計算的方式也有多種,但高層次(high level)的區(qū)別在于他們決定處理游戲的“tick”,即測量時間的單位:
tick是與渲染邏輯分開計算的,這意味著即使存在幀跳,游戲也能更準(zhǔn)確地表示對象。需要更多的邏輯來計算自上次渲染以來經(jīng)過的確切時間。
計算每一幀的tick;將物理綁定到幀速率。如果您禁用幀速率上限或開始刪除幀,您可以看到世界上的加速或波動效果。
當(dāng)投射物的移動速度快到足以覆蓋小物體(如蜱蟲)之間的大量距離時,將運動與蜱蟲聯(lián)系起來的后果就很明顯了。您可能會遇到這樣的情況,在這種情況下,對象似乎互相“交錯”,因為它們在引擎中從來沒有重疊。
所有這些聽起來都很新奇,因此許多人認(rèn)為這是一種相對較新的方法;但實際上它早于hitscan!在FPS游戲之前,已經(jīng)有許多自上而下的射擊游戲,如《小行星》、《太空入侵者》或《銀河號》。這是70年代的街機游戲,盡管有些原始,但當(dāng)時已經(jīng)實現(xiàn)了射彈彈道學(xué)。
小行星,子彈有點看不清,但它們就在那里!
即使有了所有這些特性,我們也無法創(chuàng)建現(xiàn)實世界的真實再現(xiàn)。有沒有一種方法可以同時兼顧兩種方法的優(yōu)點?
混合系統(tǒng)(Hybrid Systems)
大多數(shù)游戲引擎可以處理兩種類型的子彈模擬:hitscan和射彈彈道。這給了我們擁有多種武器的選擇:像《光環(huán)》、《GTA》和《半條命》這樣的游戲都有支持這兩種物理的武器。
?
開發(fā)人員還可以混合使用兩種技術(shù)來解決每個系統(tǒng)的弱點,從而提供更加生活化的體驗。例如,為了解決從彈射彈道的角度來確定物體之間的相位問題,每顆子彈都可以在引擎的每一次跳動中畫出一條射線。這有助于引擎看到任何光線是否會在tick之間相交,在半空中相撞。
它們也可以被混合以增強游戲的功能。《狙擊精英》系列就是一個很好的例子;扣動扳機后,引擎使用hitscan來確定射擊是否足夠接近任何可探測的目標(biāo)來觸發(fā)慢動作。如果是真的,它將在子彈時間內(nèi)發(fā)射出一顆子彈。
?
這篇文章涵蓋了子彈如何在視頻游戲中工作的基本知識,有趣的是,該領(lǐng)域更關(guān)注于較小的改進,而不是大規(guī)模的檢修。在最初幾款革命性游戲發(fā)行后,并沒有取得顯著的進展。這咱混合方法并不會很快消失,因為它提供了額外的功能,但很多改進可能將發(fā)生在彈射彈道學(xué)上。隨著我們不斷增加tick計算的頻率(隨著CPU能力的增加),我們將能夠接近“真實”子彈模擬的漸進極限。
總結(jié)
以上是生活随笔為你收集整理的游戏中子弹的工作原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地平线:黎明时分中的云渲染技术
- 下一篇: 《孤岛惊魂5》游戏中的地形渲染技术-网格