Unityで3Dゲームを作っていると、倒した敵をぐったりさせてみたくなることがあります。そのようなときに便利なのが「ラグドール(Ragdoll)」という機能です。
ここではそのラグドールの設定方法について書いていきますね。
ラグドール(Ragdoll)とは?
まずはじめに、そもそも「ラグドールって何?」という話ですが…ラグドールは簡単に言うと「キャラクターをぐったりさせるための物理演算」のことです。
ラグドールを使えば、キャラクターが気絶したり死亡したりしたときの「ぐったりした感じ」を表現できます(下のGIF参照)。
ラグドールの設定方法
では、次にラグドールを設定する方法を紹介します。やり方としては次の2つの方法があります。
- ラグドールウィザードを使う
- アセットを使う
ラグドールウィザードを使う方法
一つ目はUnity標準の「ラグドールウィザード」という機能を使う方法です。ヒエラルキーで右クリック→「3Dオブジェクト」→「ラグドール」を選択すると、下の図のようなラグドールウィザードが出てくるのでそこに3Dモデルのパーツを設定します。
…えーっと、公式マニュアルを見ると
ウィザードへのパーツ追加は簡単な作業です。キャラクターインスタンスのそれぞれの異なる Transform をウィザードの適切なプロパティーの上にドラッグします。これはキャラクターを自ら作成していれば簡単な作業です。
って書いてあるんですけど、ハッキリ言って超面倒くさいです。だってウィザードのどの欄にどのゲームオブジェクトが対応するのかパッと見分からないんだもん。なので1体や2体ならまだしも、コレを使って何体もラグドールを設定するのはやりたくないですね。
アセットを使う方法
というわけで、アセットストアに便利なアセットないかな~?と思って見てみるとありました。「Ragdoll helper」という無料アセットです。
これを使えば一発でラグドールを設定できます。
使い方は簡単で、メニューバーの「ウィンドウ」→「BzSoft」→「Ragdoll Helper」からウィンドウを開いて、ラグドールを設定したいゲームオブジェクトを選んで「Create」を押すだけです。これならラグドールを楽々設定できますね。
Animatorからラグドールに切り替える方法
最後に、キャラクターをAnimatorで制御する状態からラグドールに切り替えるための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); } }
このC#スクリプトでやっていることは簡単です。最初にキャラクターの子のリジッドボディを全部取得しておいて、そのリジッドボディに対して
- Animatorを使いたい場合→Rigidbody.isKinematicとAnimatorをON
- ラグドールに切り替えたい場合→Rigidbody.isKinematicとAnimatorをOFF
という風にしているだけです。
おわりに
以上、簡単ではありますがUnityでのラグドールの設定方法についてご説明しました。ラグドールを使うとキャラクターの気絶・死亡演出がよりリアルになるので、今回の内容を参考にしてぜひゲームに導入してみてください。
この記事がゲーム開発のお役に立てば幸いです。