遊戲中非人形boss碰撞到底是怎麼處理的?

比如一條火龍轉身(非甩尾攻擊)過程中,尾巴輕輕擠開玩家。

又如玩家可以站在襠下又不會穿過龍的雙腳。

如果直接啟用skeletal mesh的對玩家root component的碰撞,會導致boss隨便一個動畫碰到玩家就能將其打飛大老遠。

還有怎麼防止boss身體各部位不會穿透場景呢,雖然很多遊戲比如黑魂,怪獵是通過ai限制,有時候緊貼著牆就露餡了,有沒有解決方法呢。

總結一下問題主要有3點:

1.boss移動受到場景的碰撞,不能受重力加速度直接掉下去,也要避免一頭扎進牆裡。

2.玩家主動移向boss受到的碰撞,滿足1的前提下,玩家要能活在襠下,不會透過大腳也不會被空氣攔住。

3.boss的非攻擊性動作或移動對玩家的碰撞,玩家被攻擊可直接用受擊位移,而其他動作只能輕輕擠開,如何做到這個擠開呢?

我來說一下為什麼實現起來麻煩,1.大部分引擎角色與環境碰撞只能通過一個根組件膠囊體,沒法使用多個可以動的膠囊體,而boss隨便伸伸頭這個範圍就不一樣了。

2.給boss的骨架網格物體碰撞,確實能輕輕擠開,但是碰撞效果很奇怪,被碰物體會飛得非常非常快,也許哪裡可以設置?不過有個勉強解決方法是限制遊戲中所有被boss碰到的物品的最大速度。

綜上2算是勉強解決了,但1還是問題,可以考慮盡量選擇不細長的boss比如巨蛇。


看了半天問題不知道如何吐槽,感覺碰撞這個詞已經被你們給玩壞了。

我們傳統上說的碰撞指的只是Hitbox重疊檢測(或者叫判定),至於如何處理判定結果是另一回事。而題主糾結了半天全是在說物理碰撞,把檢測和處理混為一談,要麼完全取消碰撞,要撞就走物理計算,甚至把邏輯模型和顯示模型也混為一談,做出來的東西當然是筆糊塗賬。

正常的動作遊戲中,角色身上至少會綁定兩套Hitbox,一套專門負責體型,決定角色如何站在地面上,移動時如何被其它角色、物體、牆壁阻攔;一套專門負責挨打,決定角色身上哪個地方可以受到什麼樣的敵方攻擊。當然,出招的時候還會有負責攻擊的Hitbox。遊戲系統在每個邏輯幀中檢測所有Hitbox間的碰撞狀態,然後根據情況分別加以處理。像角色和角色之間、角色和環境之間怎麼互動,哪個招式打中什麼地方會造成什麼樣的擊飛效果,這些都是根據情況單獨調整的。不是說你把所有角色都描述成物件,簡單設置幾個物理參數,然後剩餘的一股腦甩給引擎完成——這種偷懶的態度做做FPS還湊合,或者頂多做個撞球遊戲,稍微再複雜點就廢了,網球遊戲都做不成。

濫用物理效果是個什麼下場,可以參考一下FIFA12是如何鬼畜的,或者體驗一下I am bread、Mount your friends、QWOP這些遊戲的操作感。


物理處理過程分為兩步:

1:碰撞檢測

2:碰撞解算

物理對象分為多種:

普通的 物理碰撞的mesh 都是不變型的,例如怪物獵人中的boss,可以拆成多個碰撞器,掛在骨骼上

像旺達與巨像中,boss的身體是可變形的 物理mesh, 有一篇文章專門講這個,google 搜索 unity giant boss

物理碰撞的檢測:

靜態場景 和 動態boss對象, 大型boss在地面上移動通常需要使用IK的方式,來控制腳步的高度,

而如果尾巴等部分需要和環境碰撞,例如碰撞到岩石,需要彈回,那也需要IK的方式來調整動畫

也就是boss的動畫部分 適應環境調整,是需要IK 系統來做的, 可以參考GDC的的視頻, 過程動畫 技術

boss和可破壞物體的碰撞,這個需要在物理引擎碰撞檢測到之後,在碰撞處理階段,對可破壞物體做碰撞處理,

boss和玩家的碰撞,這種情況通常都是玩家被推開,也是在碰撞檢測之後,碰撞處理階段,針對玩家體做處理;

可以看到,需要實現針對不同情況,不同對象,不同的碰撞處理機制,這個在通用的物理引擎裡面是比較難做的,需要接管物理引擎的碰撞處理階段。

通用物理引擎,通常的碰撞處理,是根據質量,相對速度,計算衝量,來實現碰撞處理。

unity中的character controller,也可以看做是一種特殊的碰撞解算對象,由nividia的physx 內置了。

只在unity裡面只用c#層介面的話,很難修改到碰撞解算部分。

這裡有個Demo,實現了在c#層的一個定製的物理引擎,可以實現類型於 旺達與巨像中的 可變Mesh的碰撞效果

PhysicEngineUnity

還有一種物理做法,是純用 粒子 做物理系統,可以看hitman 的一篇文章

總結。

動畫的ik 加定製化的 物理解算方法,就是實現大型 boss 的一條路


我彷彿看到了又有新人問我當年MH是怎麼做的。但是類似問題我也回答了不少了,我只想重申幾個要點,如果你領悟不到,我覺得再多的說明也是白費口舌:

1,角色之間的傷害碰撞(攻擊、防禦、格擋框)與角色和地形的碰撞,不是同一套碰撞框,這個不論2D還是3D遊戲都是如此。

2,碰撞不依賴於視覺,是不是美術沒給任何資源,你就完全做不了遊戲了?其實「閉起眼睛」來看「這個世界」,你能看到的根本沒有龍和主角,只有一個個不同顏色的方塊。不然你以為肉質是怎麼做的?大劍不同位置的威力不同是怎麼做的?在不同位置上綁個所謂的component標記一下?

3,MH里所有的場景周圍都是「氣牆」包圍的,即使是沿著山壁這類的,山壁之前也有氣牆,當然這就是邏輯上的移動層的碰撞框。AI是不起作用的,只是龍活動的規則起作用,一些龍永遠不會選擇一些場景(當然你要認為這也是AI也沒什麼毛病,現在開發遊戲的人愛湊效果都湊出習慣來了)。

4,忘掉你的「攻擊性動作」,那是回合制遊戲(尤其是WOW這類ARPG)才有的概念,在動作遊戲里,有攻擊判定矩形的,都是「攻擊動作」,一些怪物肉眼看站著不動,他也是「在攻擊」,而雌火龍吐火的時候是「不會攻擊」的,真正攻擊的是火球。

5,物理不會被用在遊戲的核心邏輯里,比如怪物的移動等。好的遊戲里,角色是不物理的,舉個簡單的例子,很多動作遊戲中角色起跳和下落(別告訴我角色會下落就是你認為的「物理」或者「重力」)。

類似問題我在其他動作遊戲的帖中也說過,只是那些帖更多是2D的,這裡重要的說一句,就遊戲邏輯而言,2D 3D的做法區別不大,只是一些碰撞演算法的區別而已,不要因為看起來是什麼樣,就覺得遊戲應該怎麼樣做,遊戲開發,Seeing is NOT believing。


穿就穿唄。。。主角都分分鐘玩穿牆了,boss穿一點點有什麼所謂。。。

為了省事,一般來說碰撞箱都是立方體,而且很可能還不帶旋轉的那種(帶旋轉的計算起來複雜一些,比立方體更高端的形狀複雜很多),人就一根棍棍,單個立方體完事,boss身材詭異給多幾個立方體,每個關節或者每根骨頭來一個,準確度肯定不完美但是也還好了,而且還順帶可以讓你選擇砍boss的不同部位得到不同效果。

順帶,貌似2D格鬥遊戲喜歡用一大堆長方形碰撞箱?不過,就倆角色,應該還好了。


Unity Polygon Collider 2D,可以處理2d不規則物體碰撞,如雙腿。至於尾巴,可以附屬一個物體上去。轉身把玩家擠開,用box即可。


拿自己的遊戲《MOW: 2-Player》來說,以下這個 Boss 有「相對」準確的碰撞檢測,支持局部破損。怎麼實現的呢?

笨辦法,切割成矩形拼起來的。用通俗的話說就是,你以為是一個 Boss,其實是一堆敵人組合在一起以相同的速度和角度移動。

至於邊緣檢測,無非就是上下左右四個邊,零件是否完好能否出邊用 switch case 就能解決。至於擠開的速度,在碰撞檢測的那個幀給被撞物體添加一個速度和角度即可。


原理其他回答解釋的比較清楚了,直接回答具體的問題吧。

1. 角色和場景的物理交互是要具體情況具體分析的,和體型、邏輯(比如是否是攻擊行為)都有關係。

角色與地面的關係,一般用raycast和foot ik來實現:

a. 如角色較小(如人類),一般會從每隻腳做一次raycast,得到與地面或地面上物體的相交點,然後把腳「放在」相交點上。不過需要注意的是,這種方法在關卡設計時要求不能有太小的溝槽,否則會出現在視覺上腳插入溝槽的問題。當然如果換為sphereCast就沒這個問題了。

b. 如角色較大(如mh中的雄火龍),就需要進行特殊處理了。因為如果地面有有一塊石頭,剛好raycast相交於石頭上,雄火龍的大腳就會踩在那塊石頭上,而不是地面上,這在視覺上顯然是我們不能接受的。所以我們要做些特殊處理,最簡單的方法就是忽略雄火龍大腳的raycast與地面物體的碰撞檢測。

角色與場景的物理交互,是看需求的。

角色一般用合適的突包來包裹,當和牆壁或其他障礙物發生碰撞時,只需簡單的阻止他們相互穿插就可以了。對於題主糾結的某些行為會穿插牆壁的問題,這就要看需求和成本了。大部分不做處理的遊戲都是有理由的,誰不想讓遊戲表現更好呢?

拿mh里的雄火龍為例,它有一個攻擊行為是原地轉身甩尾,這個行為和牆壁就是沒有碰撞處理的,但沒有的原因並不是開發者做不到。我們可以假設有這麼幾種處理方式:

a.雄火龍轉身碰到牆壁然後被牆壁「推開」。這在視覺效果上表現太差,會顯得雄火龍沒有重量感,從而削弱它的力量感。

b. 雄火龍轉身碰到牆壁後轉身停止。這有可能會嚴重影響玩法,因為玩家可以利用類似的規則卡住boss。

c. 雄火龍轉身碰到牆壁後撞碎牆壁。這在視覺和玩法上都是比較合適的。但是這給美術、關卡設計、程序帶來了大量的工作量。

所以綜合來看,不處理某些行為和牆壁的碰撞處理是綜合考慮的,有時候也是不得已而為之。

2. 處理大體型的怪物就不能使用單一的碰撞包圍盒了,一般會用盡量簡單的突包或膠囊體來包裹身體的各個部位。

3. 對於不同的行為,即使是相同的部位也可以有不同的碰撞處理。


1、碰撞檢測回掉,處理碰撞到玩家的位移邏輯,可根據衝量,或者碰撞時的點位、速度和方向來處理玩家的位移;

2、boss的碰撞模型與其渲染的mesh至少要大體一致,這樣boss的襠下就能站玩家;

3、同1


你自己都說了啊,在骨骼上面綁定幾個長方體用來做尾巴的碰撞。公雞的時候就啟用唄,不攻擊的時候就禁用唄。腦子不會轉彎噢,稍微變通一下不就可以了。


推薦閱讀:

用vim打開後中文亂碼怎麼辦?
gvim 為什麼這麼多年沒更新了?
編程和彈吉他哪個更難?
<script type="text/template">是幹什麼的,為什麼要把html寫在js中? 這是什麼編程語言風格,都能這樣用嗎?
程序員寫程序都是盲打,基本不用滑鼠的么?

TAG:遊戲開發 | 編程 | 虛幻引擎 |