布娃娃系統

前言

自 3.1 版起,Godot 支援布娃娃物理。布娃娃利用物理模擬來產生寫實的程式化動畫,常見於許多遊戲的死亡動畫。

本教學將以 Platformer3D 範例專案來設定布娃娃。

備註

你可以在 GitHub 上下載 Platformer3D 範例,或是透過 資源庫 取得。

設定布娃娃

建立物理骨骼

就像引擎裡的許多功能一樣,Godot 也有專門用來設定布娃娃的節點:PhysicalBone3D。為了簡化流程,可以直接在骨架(Skeleton)節點裡利用「建立物理骨架」功能,快速產生 PhysicalBone 節點。

在 Godot 中打開 Platformer3D 範例,然後打開 Robi 場景。選取 Skeleton 節點。此時在上方工具列會出現骨架圖示:

../../_images/ragdoll_menu.png

點擊該圖示並選擇「建立物理骨架」選項。Godot 會自動為每個骨骼產生 PhysicalBone 節點與對應的碰撞形狀,並以釘住關節(Pin Joint)將它們串連起來:

../../_images/ragdoll_bones.png

有些自動產生的骨骼其實不需要,例如 MASTER 骨骼。因此我們要清理骨架,把這些多餘的骨骼刪除。

清理骨架

每一個需要模擬的 PhysicalBone 都會增加運算負擔,所以應該移除太小、對模擬影響不大的骨骼,以及所有輔助用的骨骼。

舉例來說,以人形角色為例,不建議每根手指都設物理骨骼。通常會以一根骨骼代表整隻手,或是分成手掌、拇指與其他四指各用一根。

請刪除這些物理骨骼:MASTERwaistneckheadtracker。這樣骨架更精簡,也更容易控制布娃娃。

調整碰撞形狀

接下來,要將每個物理骨骼的碰撞形狀與尺寸調整成符合對應身體部位的大小與外型。

../../_images/ragdoll_shape_adjust.gif

調整關節

碰撞形狀調整完成後,布娃娃就只差最後一步:調整釘住關節(Pin Joint)來獲得更寫實的模擬效果。PhysicalBone 預設會自帶一個無約束的釘住關節。若要修改關節,請選取對應的 PhysicalBone,在「Joint」區段調整約束型態、方向或限制。

../../_images/ragdoll_joint_adjust.gif

成果應如下圖所示:

../../_images/ragdoll_result.png

布娃娃模擬

現在布娃娃已經可以開始模擬了。要啟動布娃娃物理並播放動畫,請在骨架(Skeleton)節點掛上腳本,於 _ready 方法中呼叫 physical_bones_start_simulation

func _ready():
    physical_bones_start_simulation()

若要停止模擬,請呼叫 physical_bones_stop_simulation() 方法。

../../_images/ragdoll_sim_stop.gif

你也可以只讓部份骨骼參與模擬,方法是將骨骼名稱傳給對應的參數。以下為部分布娃娃模擬的範例:

../../_images/ragdoll_sim_part.gif

碰撞層與遮罩

請確認碰撞層與遮罩設定無誤,避免 CharacterBody3D 的膠囊碰撞體干擾布娃娃物理模擬:

../../_images/ragdoll_layer.png

更多相關資訊,請參考 碰撞層與遮罩