(この記事の使用環境: Unity5.4.2f2 Personal、Windows10


今回は爆発を受けて骸骨さんがラグドール化し、ふっとぶようにしてみました。
この記事この記事この記事の内容を受けた、応用編みたいな感じになりました。
全画面キャプチャ 20170113 105610

こんな感じ。オーバーキルですみません。

 
ではさっそく設定について。

まずはHierarchyビューで空のゲームオブジェクトを作り(今回は「EnemyController」としています)、(これまで動かしてきた)通常の骸骨さんモデルと、ラグドール化した骸骨さんモデルをぶら下げます。通常の骸骨さんモデルはこのあと編集するので、その前の状態をプレハブに2回保存し、2回目のほうを「Skelton_ControlFromParent」という名前にしました。

全画面キャプチャ 20170113 101912

ぶら下げた2種類のモデルを一緒に移動させる必要があるので、もともと通常の骸骨さんモデルのほうに付けていたNavMeshAgentと動かすためのスクリプトを親のゲームオブジェクトに移植しました。動かすためのスクリプトも少し編集するので、「Skelton_ControllerFromParent」というように別名保存しています。ファイル名変更にあわせてクラス名も変更しましょう。

また、今回は爆発エフェクトとの衝突判定によってモデルの切り替えを行うため、ゲームオブジェクトにカプセルコライダーを追加しています。
全画面キャプチャ 20170113 103202

 で、「Skelton_ControllerFromParent」スクリプトの中身。もとのスクリプトからの変更箇所のみ説明します。

まずはぶら下げた2種類の骸骨さんモデルを扱うための変数を宣言します。public変数として、インスペクタから指定できるようにしています。

// --- 親のゲームオブジェクトから骸骨さんを動かすスクリプト -----------------------------------
public class SkeltonControllerFromParent : MonoBehaviour
{
    public GameObject aliveCharacter;                           // (追記)生きているときのキャラクター
    public GameObject ragdollCharacter;                         // (追記)死んでいるときのキャラクター(ラグドール)


次に、初期化。生きているキャラクターのオブジェクトをアクティブにし、死んだときに呼び出すラグドールキャラクターのオブジェクトを非アクティブにします。
また、Animatorコンポーネントなどは子のオブジェクトに置いたままなので、GetComponentではなくGetComponentInChildrenを使って子のオブジェクトのコンポーネントを取得するようにしています。

    // --- 初期化 ----------------------------------------------------------
    private void Start ()
    {
        aliveCharacter.SetActive (true);            //(追記)生きているキャラクターオブジェクトをアクティブにする
        ragdollCharacter.SetActive (false);         //(追記)死に用ラグドールキャラクターオブジェクトは非アクティブにしておく

        rb = GetComponentInChildren<Rigidbody> ();  //(変更)子オブジェクトのコンポーネントを取得するよう変更した
        anim = GetComponentInChildren<Animator> (); //(変更)子オブジェクトのコンポーネントを取得するよう変更した

        nav = GetComponent<NavMeshAgent> ();
        lineOfSight1 = GameObject.Find ("LineOfSight1").transform;

        _currentlife = lifeMax;
    }


あとは、爆発パーティクルを受けてふっとぶ処理の中で、モデルの切り替えを行います。

    // --- パーティクルと衝突したら吹っ飛ぶ ----------------------------------------------------------
    private void OnParticleCollision (GameObject other)
    {
        Debug.Log ("爆発をくらわせた!");

        if (_state != eState.Dead)                      // 死んでいないなら、まずは死ぬ
        {
            _currentlife = 0;
            nav.speed = 0f;
            nav.Stop ();
            anim.SetTrigger ("Died");
            anim.speed = 5f;
            _state = eState.Dead;

            // --- ここから追記(ラグドールへの切り替え)-------------------------------

            aliveCharacter.SetActive (false);           
            ragdollCharacter.SetActive (true);
            rb = GetComponentInChildren<Rigidbody> ();

            // --- ここまで追記(ラグドールへの切り替え)-------------------------------
        }

        rb.AddForce (Random.onUnitSphere * 10000f);      // 爆風で吹っ飛ぶ処理
    }


最後に、「Skelton_ControlFromParent」オブジェクトで、親のゲームオブジェクトに移植したコンポーネント(NavMeshAgentとスクリプト)を削除しておきます。

今回は以上です。