[Unity] 爆風でRagdollを吹き飛ばす


今作っているゲームでRagdollを爆風で吹き飛ばす演出があるのでそのモックを作ったときのメモ。

上記サンプルはGithubに上げてあります。

爆風の計算を行う

Unityにはデフォルトで、爆発による力をRigidbodyに適用するメソッド(AddExplosionForce)が準備されています。

AddExplosionForceの定義

定義は以下のようになっています。

public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode mode = ForceMode.Force);

爆発の威力、爆発点、爆発半径を与えると爆発の状態をエミュレートしてRigidbodyに力を与えてくれます。
例えば散らばったCubeそれぞれに適用してやればまさに爆弾が爆発したような演出が可能になります。

サンプル

当然ですが、Rigidbodyコンポーネントをアタッチしておく必要があります。
そのコンポーネントに対してAddExplosionForceを適用すると爆発の威力が該当GameObjectに適用されます。

Rigidbody rigidbody = GetComponent<Rigidbody>();
rigidbody.AddExplosionForce(m_force, m_position, m_radius);

Ragdollを設定する

次に、モデルデータにRagdollを設定します。これは、モデルのボーンを指定すると適切にコライダとジョイントを設定してくれる便利ツールとなっています。(デフォルトの機能です)
設定に関してはこちらの記事(UnityでRagdoll物理)が参考になります。

以下のメニューからRagdollを選択します。


注意点

Rigidbodyは追加しない

今回のサンプルを作成するにあたって注意点と微妙にハマりポイントがあったので書いておきます。

まず、冒頭ではRigidbodyが必要だと書きましたが、Ragdollを適用すると各体の部位にコライダとRigidbodyが追加されます。
なので改めて設定する必要はありません。

RagdollのRigidbodyすべてにAddExplosionForceを適用する必要がある

Ragdollで適用されたRigidbodyは複数あります。
今回の例のように爆風のような演出をする場合はそれらすべてのRigidbodyAddExplosionForceを適用する必要があることに注意が必要です。(こちらの記事を参考にしました(AddExplosionForce on ragdolls | Unity Answers))


以上を適用すると冒頭のアニメーションGifのような演出が達成できます。

その他メモ

爆風のエリア内にどんなゲームオブジェクトがあるかはPhysics.OverlapSphereを使うと便利です。

Physics.OverlapSphereの定義

public static Collider[] OverlapSphere(Vector3 position, float radius, int layerMask = AllLayers);

Colliderを検出する範囲を示す球体の中心位置と半径を渡すと、その範囲内にあるColliderが配列で返ってきます。