UnityでFPS用のシステムを作っていて、倒した敵をぐったりさせてみたかったので「ラグドール(Ragdoll)」という機能を使ってみることにしました。
ラグドール(Ragdoll)って何?
さて、まずそもそも「ラグドールって何さ?」という話ですが…ラグドールは簡単に言うと「キャラクターをぐったりさせる」ための物理演算の設定のことです。
ラグドールを使えば、キャラクターが気絶したり死亡したりしたときの「ぐったりした感じ」を表現できます。
ラグドールの設定方法
では、次にラグドールを設定する方法を紹介しますね。やり方としては次の2つの方法があります。
- ラグドールウィザードを使う
- アセットを使う
ラグドールウィザードを使う方法
一つ目はUnity標準の「ラグドールウィザード」という機能を使う方法です。ヒエラルキーで右クリック→「3Dオブジェクト」→「ラグドール」を選択すると、下の図のようなラグドールウィザードが出てくるのでそこに3Dモデルのパーツを設定します。
…えーっと、公式マニュアルを見ると
ウィザードへのパーツ追加は簡単な作業です。キャラクターインスタンスのそれぞれの異なる Transform をウィザードの適切なプロパティーの上にドラッグします。これはキャラクターを自ら作成していれば簡単な作業です。
って書いてあるんですけど、ハッキリ言って超面倒くさいです。だってウィザードのどの欄にどのゲームオブジェクトが対応するのかパッと見分からないんだもん。なので1体や2体ならまだしも、コレを使って何体もラグドールを設定するのはやりたくないですね。
アセットを使う方法
というわけで、アセットストアに便利なアセットないかな~?と思って見てみるとありました。「Ragdoll helper」という無料アセットです。
これを使えば一発でラグドールを設定できます。
使い方は簡単で、メニューバーの「ウィンドウ」→「BzSoft」→「Ragdoll Helper」からウィンドウを開いて、ラグドールを設定したいゲームオブジェクトを選んで「Create」を押すだけです。これならラグドールを楽々設定できますね。
メカニムからラグドールに切り替える方法
最後に、キャラクターを普通の状態からラグドールに切り替えるためのC#スクリプトを書いてみましょう。今回はサンプルとして次のようなスクリプトを作ってみました。
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Animator))] public class RagdollController : MonoBehaviour { Animator animator; Rigidbody[] ragdollRigidbodies; void Start() { animator = GetComponent<Animator>(); ragdollRigidbodies = GetComponentsInChildren<Rigidbody>(); StartCoroutine(Test()); } void SetRagdoll(bool isEnabled) { foreach (Rigidbody rigidbody in ragdollRigidbodies) { rigidbody.isKinematic = !isEnabled; animator.enabled = !isEnabled; } } IEnumerator Test() { SetRagdoll(false); yield return new WaitForSeconds(3); SetRagdoll(true); } }
このスクリプトでやっていることは簡単です。最初にキャラクターの子のリジッドボディを全部取得しておいて、そのリジッドボディに対して
- メカニムを使いたい場合→Rigidbody.isKinematicとAnimatorをON
- ラグドールに切り替えたい場合→Rigidbody.isKinematicとAnimatorをOFF
という風にしているだけです。
実際に動かしてみると下の動画のようになります。
これで無事キャラクターをぐったりさせることができました。