今作っているゲームで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
は複数あります。
今回の例のように爆風のような演出をする場合はそれらすべてのRigidbody
にAddExplosionForce
を適用する必要があることに注意が必要です。(こちらの記事を参考にしました(AddExplosionForce on ragdolls | Unity Answers))
以上を適用すると冒頭のアニメーションGifのような演出が達成できます。
その他メモ
爆風のエリア内にどんなゲームオブジェクトがあるかはPhysics.OverlapSphere
を使うと便利です。
Physics.OverlapSphereの定義
public static Collider[] OverlapSphere(Vector3 position, float radius, int layerMask = AllLayers);
Colliderを検出する範囲を示す球体の中心位置と半径を渡すと、その範囲内にあるColliderが配列で返ってきます。