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


前回記事では複数のキャラクターを同時に動かしてみましたが、今回はプレイ中に切り替えて使ってみます。

こんな感じ。マウスの右クリックでキャラクター切り替えを行っています。

 
今回の記事はUnityマニュアルの「ヒューマノイドアニメーションのリターゲティング」を参考にしています。やっていることはほんのちょっとだけ違うんですが、根幹は同じですので、そちらとあわせて読んでもらえると理解しやすいかもしれません。

まずは空のゲームオブジェクトを作り、その下に動かしたいキャラクターモデルをぶら下げます。ゲームオブジェクトにはキャラクターを動かす共通のスクリプトを置きます。

全画面キャプチャ 20170106 113726

ぶら下げたキャラクターそれぞれにAnimatorコンポーネントを付けます。

また、今回の記事では、それぞれのキャラクターにAnimatorContollerまたはAnimationOverrideControllerを付けています。前回記事で紹介したとおり、共通の操作方法で動かせるようにしてあるものです。
ここがUnityマニュアルとの違いですね。Unityマニュアルのリターゲティングでは、1つのモデルに付けたAnimatorContollerを、モデルが切り替わっても使い続ける方法について書かれています(それを「リターゲティング」と呼ぶのでしょう)。
全画面キャプチャ 20170106 114224
全画面キャプチャ 20170106 114212
全画面キャプチャ 20170106 114231

あとはスクリプト。
前半。初期化のStart()と、キャラクター変更処理を行うChangeCharacter()。
キャラクター切り替えを行った後、そのキャラクターのAnimatorを取得しています。

using UnityEngine;
using System.Collections;

// --- 親のゲームオブジェクトにアタッチして、複数のキャラを切り替えながら動かすスクリプト --------------------------------------------------------------
public class MainCharController : MonoBehaviour
{

    GameObject[] characters;
    GameObject currentChar;
    Animator anim;

    public float moveSpeed;

    int _currentCharNum = 0;


    // --- 初期化 -----------------------------------------------------------------------------
    void Start ()
    {
        characters = GameObject.FindGameObjectsWithTag ("Character");
        Debug.Log ("I have " + characters.Length + " Changable Characters");

        ChangeCharacter (_currentCharNum);
    }


    // --- 操作キャラクターの変更 ---------------------------------------------------------------
    void ChangeCharacter (int characterNum)
    {
        foreach (GameObject gObj in characters)         // いったん全キャラクターを非アクティブにする
        {
            gObj.SetActive (false);
        }

        currentChar = characters[characterNum];         // 指定した番号のキャラクターだけをアクティブにする
        currentChar.SetActive (true);

        anim = currentChar.GetComponent<Animator> ();    // 対象キャラクターのAnimatorコンポーネントを取得する
    }

あとは更新処理のUpdate()。マウスの右クリックでChangeCharacter()を呼び出しています。

    // --- 更新処理 ---------------------------------------------------------------------------
    void Update ()
    {
        float moveX = Input.GetAxis ("Horizontal");
        float moveZ = Input.GetAxis ("Vertical");

        if (moveX != 0 || moveZ != 0)       // 水平方向または垂直方向の操作があれば「歩き」モーションへ
        {
            anim.SetBool ("Walk", true);
            transform.Translate (moveX * moveSpeed * Time.deltaTime, 0f, moveZ * moveSpeed * Time.deltaTime);
        }
        else                                // なければ「待機」モーションへ
        {
            anim.SetBool ("Walk", false);
        }

        if (Input.GetMouseButtonDown (0))   // マウスの左クリックで「ジャンプ」モーション
        {
            anim.SetTrigger ("Jump");
        }

        // --- キャラクター変更を呼び出す (マウスの右クリック)--------------------------------------
        if (Input.GetMouseButtonDown (1))
        {
            if (_currentCharNum == characters.Length - 1)
            {
                _currentCharNum = 0;
            }
            else
            {
                _currentCharNum++;
            }
            Debug.Log ("Character " + _currentCharNum + " Selected");
            ChangeCharacter (_currentCharNum);
        }
    }
}

キー操作にあわせて移動する(最低限の)処理も付け加えています。

こんな感じで動きます。移動した後も問題なくキャラクター切り替えができています。


Trine」みたいな感じで、キャラクター切り替えしながら進んでいくゲームに使えそうですね。

今回は以上です。