ぐたっと倒れるラグドールの作り方【Unity+Ragdoll】

ぐにゃっと倒れるやつね。ラグドールという名前を知らないと検索でたどり着けなさそう。

目次

ラグドールを作る – 基本設定

ラグドールをゲームで使うには、ラグドール自体の準備と、それをゲーム内のキャラクターと置き換えるための処理が必要になります。ここでは無料アセットのキャラクターをサンプルにしながらラグドールの使い方をマスターしましょう!

モデルの準備

モデルは無料アセットでおなじみ!ケヴィンのアセットを利用しましょう!

https://assetstore.unity.com/packages/3d/characters/humanoids/humans/3d-character-dummy-178395

アセットを入手したらUnityプロジェクトにインポートしてください。

ラグドールセットアップ

ラグドールのセットアップを行う場合、ラグドール化したいプレファブをシーン内に一度配置します。

Assets/Kevin Iglesias/3DCharacterDummy/Prefabs/MaleDummyを利用します。

シーン内に配置したら、ルートのGameObjectからAnimatorコンポーネントを削除します。各自のプロジェクト内のモデルをラグドール化する場合、この時点でのコライダー系や制御するためのコンポーネントはすべて削除してください。Rigidbodyとかも外してOK。

上部メニューバーからGameObject>3D Object>Ragdoll…を選択肢、ウインドが立ち上がるのを確認。

Create Ragdollウインドに必要なトランスフォームをセットしていきます。

各項目は下の表を目安にセットしていってください。

項目場所
Pelvis腰になる部分
Left Hips左足の付け根。腰と左足の繋がってる所
Left Knee左ひざ
Left Foot左あし。足首とかが目安
Right Hips右足の付け根。腰と右足の繋がってる所
Right Knee右ひざ
Right Foot右あし。足首とかが目安
Left Arm左腕。肩か上腕でOK
Left Elbow左ひじ。Left Armより手の先端になるように
Right Arm右腕。肩か上腕でOK
Right Elbow右ひじ。Right Armより手の先端になるように
Middle SpinePelvisより上あたり。ChestでもOK
Head頭。首より上を設定。

Createボタンを押すと、Ragdollの基本設定が行われます。セットしたTransformのコンポーネントを確認すると、RigidbodyやJointなどがセットされています。部位によってColliderの形などが違います。

セットアップうまく行ってると、下図のように体がコライダーで覆われます!

注意!モデルによってコライダーの大きさがおかしくなることも!?

モデルによっては大きさ調整の関係なのか、コライダーの大きさが不釣り合いなことがあります。その場合は手動で設定を行ってください。目安としては、体の大きさに対して、少し小さくなるぐらいがちょうど良いです。次の動作確認のときにも行いますが、プルプル震える場合があります。大体がコライダー同士が大きくて動きが収まらないために起こります。

動作確認

あとはゲームを動かしてみて、ラグドールがぐたっとするのを確認してみてください。自分は足のコライダーを少し小さくして調整し直して見ました。

ただ、ある程度ぐたーっと倒れているの確認すればこのあとのスクリプトで割となんとかなります。ここで神経質にならないようにしましょう。

ゲーム内でモデルを置き換えるための処理

ただ倒れるだけのオブジェクトを準備するならこれで終わりですが、実際のゲームだと動いているモデルからラグドールへの変化が必要になります。

設計方針

現在のままだと、Tポーズの状態から倒れてしまいます。実際のゲームだと、モデルにアニメーションなどを行わせているはずです。

そのためラグドールに切り替える場合、元になるモデルのTransformの位置や角度などを真似る必要があります。

  • ラグドールはゲーム内のモデルを置き換える
  • 置き換える前のモデルはなんらかのアニメーションをしている
  • 置き換える前のTransformの位置や角度などをトレースする

スクリプト

ここでは2つのスクリプトを用意します。1つはラグドールのTransformを一致させるためのスクリプトです。もう一つはプレファブ化されたラグドールを置き換えるものです。

RagdollSetupper

using UnityEngine;

public class RagdollSetup : MonoBehaviour
{
    [SerializeField] private Transform rootBone;

    public void Setup(Transform originalRootBone)
    {
        CloneTransforms(originalRootBone, rootBone);
        //Explosion(250f,transform.position,10f);
    }
    private void CloneTransforms(Transform root, Transform clone)
    {
        foreach (Transform child in root)
        {
            Transform cloneChild = clone.Find(child.name);
            if (cloneChild != null)
            {
                cloneChild.position = child.position;
                cloneChild.rotation = child.rotation;

                CloneTransforms(child, cloneChild);
            }
        }
    }
    // ここは今回使いません。
    private void Explosion(Transform root, float force, Vector3 position, float radius)
    {
        foreach (Transform child in root)
        {
            if (child.TryGetComponent(out Rigidbody rigidbody))
            {
                rigidbody.AddExplosionForce(force, position, radius);
            }
            Explosion(child, force, position, radius);
        }
    }
    public void Explosion(float force, Vector3 position, float radius)
    {
        Explosion(rootBone, force, position, radius);
    }
}

RagdollSpawner

using UnityEngine;

public class RagdollSpawner : MonoBehaviour
{
    [SerializeField] private GameObject ragdollPrefab;
    [SerializeField] private Transform originalRootBone;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RagdollSetup ragdollSetup = Instantiate(
                ragdollPrefab,
                transform.position,
                transform.rotation).GetComponent<RagdollSetup>();
            ragdollSetup.Setup(originalRootBone);
            Destroy(gameObject);
        }
    }
}

Unity側の準備

順序はさほど重要ではありませんが、次の手順でやっていくとよろしいかと思います。

STEP
作成したラグドールにコンポーネントを追加

シーン内にまだあるはずのラグドールのルートに作成した「RagdollSetup」コンポーネントをアタッチ。また、Pelvesでセットしたモデルのルートにあたる部分をrootBoneにセットしてください。

STEP
ラグドールをプレファブ化

コンポーネントの設定ができたら、プロジェクトビューのプレファブをまとめてあるであろう場所にドラッグアンドドロップを行い、プレファブ化してください。よくわかんない場合はAssets直下にPrefabsフォルダを作成して、その中にドラッグアンドドロップを行ってください。

プレファブ化ができたら、シーン内のラグドールは削除します。

STEP
ラグドールのもとになるモデルを準備

ラグドール化する前のモデルを準備してください。これはテストのための準備です。また、このモデルはなんらかのアニメーションをループで行っていると効果的にテストを検証できます。

Kevinの他のアセットに、Basic Motions Freeがあります。困ったらその中から何らかのアニメーションを適応させてください。

STEP
アニメーションさせているモデル側のセットアップ

前のステップでなんらかのアニメーションしているモデルが準備できています。このモデルに「RagdollSpawner」をアタッチしてください。このモデルはRagdoll化されるものと同じ構成を必要とします(モデルの種類ごとにラグドールが必要です)。RagdollSpawnerのコンポーネントにはシーン内のPelvesでセットしたTransformプレファブ化したラグドールをセットする必要があります。(Transformに関しては、一応自分自身でも動きますが、極力同じRootを選択してください。)

動作確認

あとはゲームを実行して左クリックを好きなタイミングで押してみてください。下図は3種類でループさせてますが、みんな挙動が違っていい感じですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次