遊戲開發中 實現炸掉一堵牆有多難?
一、技術上
在真實世界裡,物體受到衝擊會破裂成若干小塊,在遊戲中,這種破碎效果是由物理引擎中的破碎系統實現的。
遊戲物理引擎會模擬物體(剛體)的撞擊,當撞擊發生時,物理引擎計算出撞擊的位置和衝量,將資訊交給破碎系統,破碎系統判定是否需要破碎,如何破碎,如果需要,就將剛體切割和分解成若干合適的碎片,切割後由物理引擎繼續控制碎片,模擬碎片在真實世界的運動。
在往下講之前,先普及一個遊戲開發的小常識,遊戲中所有物體都是由面組成的,面越多,細節就越真實,但對效能的要求也越高,因此遊戲開發者需要不斷平衡畫面表現和效能消耗,用最少的面實現最優質的效果(這方面塞爾達傳說 曠野之息做得非常牛逼)。
法線貼圖(Normal mapping),一種模擬凹凸處光照效果的技術,可以在不新增多邊形的前提下,為模型新增細節。
效能優化不足的後果
如何切割
破壞系統在切割碎片的過程中,需要計算碎片剛體的質量屬性和形狀切割。
剛體質量屬性即剛體的質量、轉動慣量和重心,為的是儘可能真實的模擬碎片運動;而形狀切割要保證碎片質量屬性便於計算,且形狀大小豐富,接近真實破碎效果。
除了要切割剛體的形狀外,還要切割用於渲染的形狀,切割渲染形狀的面,可以在切割剛體的面上,增加一些細節,同時帶上紋理和uv座標,用於產生切割面的材質。
破壞向VR遊戲《VR機器人》(VRobot),其破壞效果只能說勉勉強強
什麼時候切割
對於什麼時候切割碎片一般有兩種方案。
一種是預切割,在資源製作的時候製作好帶貼圖的碎片,在遊戲執行時根據預先設定好的切割來分割。此種方式在執行時比較節省運算量,但是無論玩家如何著力,分割的結果都是一樣的,和真實情況有很大差距。
另一種是在遊戲執行的時候做,實時生成符合當時條件的切割,這種方法可以根據實際情況生成不同的碎片,比較接近真實世界的情況,但是運算量也非常大,容易引起遊戲的卡頓,非常依賴機器效能。
不規則邊緣如何生成?
破碎系統僅做切割和分解的工作,物理引擎本身不會去對破碎邊緣區做細碎的東西,最開始的破碎都是方的、六邊形等等,慢慢的新增一些細節。而不規則邊緣的視覺效果主要是在Shader著色器裡去做,從渲染層面做出比較好的不規則效果。
對於實時大量破碎,就需要結合特效來做一些效果展示。比如一個很大的爆炸,基本上是破碎系統切割+特效,同時還要儘量減少切割,減少面數,否則機器依然會非常卡頓。
育碧遊戲(Ubisoft)《彩虹六號:圍攻》(Tom Clancy's Rainbow Six: Siege,2015年首發)的破壞系統是其一大特色,遊戲中易碎材質(如木頭、玻璃等)所組成的表面皆可破壞,包含了牆壁、天花板與地板。這些材質除了使用炸藥也可以用槍擊或近戰攻擊破壞,若牆面遭到加固則需要特殊的炸藥方可擊破。要實現這樣的破壞系統,彩虹六號的策劃們是如何摧殘程式設計師的呢?
請看彩虹六號物理程式設計師的泣血陳述:
在R6(彩虹六號)裡你可以在很多牆的任意位置開洞來創造新的視線。你閒著蛋疼甚至可以用槍挖個狗洞爬出去。這是這個遊戲最大的創新。為了支援這種創新,開發團隊經歷的是徹徹底底的血淚史。
首先,我們討論的是把牆在任意位置打破這種事情。要做到這一點,靠預先把牆切成幾塊是不行的。因此,所有的牆體破壞都是根據破壞力大小實時計算的。而R6的設計目標是在PS4這種垃圾上PVP模式下要能跑60幀。
其次,拆牆顯然會影響到很多GAMEPLAY方面的事情。射擊,物理系統,人物移動,AI,NAVMESH都要根據破壞系統的結果做出反應,這又是一個CPU黑洞。
最後, R6是個競技向的聯網FPS遊戲,如何在各種網路條件下正確地同步所有初始條件,從而保證所有的玩家都能看見相同的破壞效果,這又是一個天坑。
同時,因為反作弊的需求,你需要把破壞引擎放在伺服器上也執行一遍,導致R6非常非常非常燒伺服器。R6各種坑爹BUG跟這個多少都有點聯絡,但是相比技術本身的複雜度和育碧願意在這個遊戲上投入的人力來說已經相當不錯了。
育碧因為伺服器經常卡頓,請牧師給伺服器開光,堪比B站搬家請道士做法
二、可玩性
遊戲中,如果要保持一個預期的體驗氛圍,原則上每一個可互動的內容都要對其有意義。這裡的意義,是指玩家可以從這樣的互動中獲得東西,包括不限於經驗值、得分、可能出現的道具、額外的資訊、策略性玩法,以及加深對主題的印象等等,也即可玩性。
實現這種互動需要特定的場景擺放--關卡設計。如果玩家可以隨意破壞關卡,或者一種互動被設計出來,而玩家從中得不到任何有助於該體驗和氛圍的額外內容,那麼這種互動,除了會徒增玩家的認知負荷,還有可能破壞原先想定的整體氛圍,玩家也難以從中獲得滿足感。
以育碧一款經典遊戲--《雷曼》(Rayman,1995年發售)為例,這是一款解密闖關類的跑酷遊戲,在當時的版本中出現了利用空氣牆與二段跳快速通關的bug,也為育碧今後的一大批遊戲正式奠定了買bug送遊戲的基調。
在育碧後來的波斯王子系列之中(刺客信條),bug更是成為了遊戲中的最大樂趣,玩家們常常會因為走錯路而誤入設計師的後花園,劇情的奇葩觸發方式造成與npc對話的割裂,甚至主動利用空氣牆來快速解決某些難過的任務。
看門狗 穿牆走
最後再舉個多人互坑遊戲--《兄♂貴敢死隊》(BroForce),一款畫素風橫版射擊遊戲,遊戲中玩家是一名鐵血硬漢,通過不斷解救兄♂貴併成為新兄♂貴(哲♂學),消滅boss通關。
兄♂貴敢死隊把破壞場景做成一種效果的體現,來給玩家快感,兼具遊戲性,因此這個遊戲的關卡設計本身就需要不那麼在乎被破壞或者被繞開。但因為遊戲中玩家可以破壞任何牆壁,梯子,因此也經常會出現路被炸光,只能自殺重來的尷尬場景。
【長按關注作者】
相關文章
- 遊戲開發中的“門”,有多難搞?遊戲開發
- 現在做小遊戲到底有多難?遊戲
- 在大型展會會場,想要實現WiFi穩定覆蓋,有多難?WiFi
- iOS登入模組有多難?iOS
- 相親原始碼中移動支付的實現,沒有想象中那麼難原始碼
- 九九八十一難 做獨立遊戲有多難遊戲
- 夢想中的智慧家居離現實還有多遠
- 實時打通資料孤島有多難?Tapdata 做到了!
- iOS遊戲開發沒有你想的那麼難–HardestiOS遊戲開發
- 遊戲開發中怪物AI實現方案總結!遊戲開發AI
- Java面試之Java中實現多執行緒有幾種方法Java面試執行緒
- go中如何實現多型Go多型
- 在一款硬核模擬經營遊戲中“養人口”有多難?遊戲
- 遊戲想自個兒恰飯有多難?遊戲
- 鄭州的小夥伴集合:現在鄭州的大環境有多難?
- 機臺統一管理有多困難?但現在出現可行的解決方案了!
- PLC維護有何難處?如何實現遠端維護?
- VR遊戲開發難題多?《Nostos》團隊給出瞭解決方案VR遊戲開發
- 遊戲開發中的多語言處理遊戲開發
- 實現dnmp中多站點多版本php並存PHP
- django中多個app的路由實現DjangoAPP路由
- CompletableFuture中實現多個 REST 呼叫REST
- 用IPFW實現BSD防火牆(轉)防火牆
- 動輒上億! 遊戲開發到底有多燒錢?遊戲開發
- 在疫情面前,遊戲人想找個工作有多難?遊戲
- 在國外,獨立開發者尋求投資有多難?
- 用資料告訴你,今年考研上岸有多難!
- 寫一篇好的技術文章有多難?
- Swoole 中通過 process 模組實現多程式
- jQuery事件中on實現繫結多個事件jQuery事件
- 如何實現在react現有專案中嵌入Blazor?ReactBlazor
- 使用iptable實現動態防火牆(轉)防火牆
- 在博物館裡儲存遊戲歷史有多難?(上)遊戲
- 在博物館裡儲存遊戲歷史有多難?(下)遊戲
- 當一個java程式設計師到底有多難Java程式設計師
- 成為一名機器學習大咖到底有多難?機器學習
- 大疆Mavic Pro無人機有多“剛”?棒擊+撞牆+燒烤+水槍無人機
- Android 7.0中的多視窗實現解析Android