雲風的 BLOG: 動作遊戲中的擊打判定
即使現在用 3d 技術來渲染,大多數格鬥遊戲依然可以歸到 2d 格鬥型別中,還是可以用這種方法來做的。比如最新的 Street Fighter 5 ,完全延續了平面 AABB 攻擊盒的規則。在網上甚至可以找到工具 顯示出攻擊盒,幫助玩家訓練,提高技藝。
也不是所有的 2d 格鬥遊戲使用 AABB 盒做擊打判定,例如任天堂大亂鬥就是用了圓和膠囊。比如 這個視訊 很好的解釋了攻擊極打判定規則,武器對撞 clanging 規則,彈刀 rebound ,還有出招前搖 startup lag ,受擊硬直 hit lag 。武器格鬥會比拳腳格鬥更豐富一些,例如同樣是揮砍,劍尖的傷害會比中段的擊打傷害高一些,這裡是用多個優先順序不同的 hurtbox 來實現的。
fps 遊戲不同。其一,它一般是全 3d 邏輯的,其二,它一般是用子彈對敵人造成點傷害。所以,fps 遊戲一般直接把一些立體的小盒子 Cuboid 綁在人物骨骼上,作為 hitbox 做受擊判定。子彈的軌跡在很短時間(兩幀之間)內可以看作是一個線段。所以這就是線段和若干 Cuboid 求交的數學問題。最早期的 fps hitbox 例如 Quake 3 採用的依舊是 AABB 軸對齊的盒子,這可以極大的減少計算量。當然,另一個原因是當時遊戲還是採用的是幀動畫而非骨骼動畫。在 3d 引擎普遍採用骨骼動畫後,通常採用把立方體直接繫結在動畫骨骼上來描述 hitbox 。CS:GO 在 2015 年之後改用膠囊體和球來描述 hitbox
怪物獵人這類遊戲又不一樣。我認為,把 hitbox 綁在怪物骨骼上這點,和 fps 遊戲並無不同。但刀劍揮砍則更接近格鬥遊戲。但是,作為 3d 邏輯的遊戲,我們無法再用平面的框框來在攻擊判定幀勾勒出 hurtbox ,那麼應該用什麼呢?
我覺得應該採用空間的四邊形來標識 hurtbox 為主。以太刀舉例,我們可以在攻擊判定幀設定一個攻擊平面,平砍,縱砍,還是斜劈,這個平面可以根據攻擊幀和前一幀的武器位置來決定,也可以設計人員自己設定。然後在這個平面上勾畫出一個或幾個矩形定義出 hurtbox 。擊打判定其實就是這個四邊形和代表 hitbox 的立方體或膠囊體求交。對於大錘這種有體積的武器,則可以用平行的兩到三個矩形來模擬出其厚度。
之所以不用專用的物理系統來做幾何體碰撞檢測。一是沒有必要浪費計算力,尤其是連續運動過程的碰撞檢測運算量很大;二是我們需要一個規則更簡潔明瞭的擊打判定規則。不過,我們需要定製編輯器去讓設計人員定義動畫中的 hurtbox 區域,編輯器的開發會是工作量較大的部分。