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


前回記事では、Trine方式(仮称)で、その場でキャラクターの外見と動作を切り替えてみました。。

今回は、その派生形として、フィールドにすでに配置されている複数のキャラクターに対して、順番に操作対象にしてみます。

こんな感じ。


離れた場所にいるキャラクターたちが協力してパズル的な障害を突破する等の使い方がありそうですね。

前回同様に、親となるゲームオブジェクトの下にキャラクターモデルを配置します。
全画面キャプチャ 20170106 163812

今回は、親となるゲームオブジェクトには、操作キャラクターを切り替えるためのスクリプト(「ChangeChars」)のみをアタッチしています。
全画面キャプチャ 20170106 164001


そして、子となるそれぞれのキャラクターモデルに、キャラクターを動かすスクリプト(「CharController」)を1人1個ずつアタッチしています。
こうすることで、それぞれのモデルごとに状態を保持しておくことができます。
全画面キャプチャ 20170106 164941

で、スクリプト。

まずはキャラクター切り替えを行う「ChangeChars」スクリプトから。
前半。キャラクター切り替えを行う前に、いったん全キャラクターのアニメーションをデフォルトの待機状態に戻す処理を入れています。
これをしておかないと、キャラクターが操作対象でなくなった後も歩行アニメーションを続けたりしてしまいます。

using UnityEngine;
using System.Collections;

// --- キャラクター切り替え用のスクリプト -----------------------------------------------------------
public class ChangeChars : MonoBehaviour
{
    GameObject[] characters;
    GameObject currentChar;
    int _currentCharNum = 0;

    Animator[] animators;
    CharController[] charContollers;


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

        animators = GetComponentsInChildren<Animator> ();
        charContollers = GetComponentsInChildren<CharController> ();

        ChangeCharacter (_currentCharNum);
    }


    // --- 操作キャラクターの変更(場に出ているキャラクターのなかで操作対象を変更する) ------------
    void ChangeCharacter (int characterNum)
    {
        currentChar = characters[characterNum];         

        foreach (Animator anim in animators)
        {
            anim.SetBool ("Walk", false);               // いったん全キャラクターのアニメーションをデフォルトに戻す
        }

        foreach (CharController ctrl in charContollers)
        {
            ctrl.enabled = false;                       // いったん全キャラクターのスクリプトを非アクティブにする
        }

        currentChar.GetComponent<CharController> ().enabled = true; // 指定したキャラクターのスクリプトだけをアクティブにする
    }
 
後半。マウスの右クリックで操作対象キャラクターを切り替えます。
    // --- 更新処理 ------------------------------------------------------------------------------
    void FixedUpdate ()
    {
        // --- キャラクター変更を呼び出す (マウスの右クリック)--------------------------------------
        if (Input.GetMouseButtonDown (1))
        {
            if (_currentCharNum == characters.Length - 1)
            {
                _currentCharNum = 0;
            }
            else
            {
                _currentCharNum++;
            }
            Debug.Log ("Character " + _currentCharNum + " Selected");
            ChangeCharacter (_currentCharNum);
        }
    }
}

で、実際に個々のキャラクターを動かす「CharController」スクリプト。
前回同様、最低限の処理のみ。

using UnityEngine;
using System.Collections;

// --- キャラクターを動かすスクリプト --------------------------------------------------------------
public class CharController : MonoBehaviour
{
    public float speed;

    Animator anim;

    void Start ()
    {
        anim = GetComponent<Animator> ();
    }

    void Update ()
    {
        float moveX = Input.GetAxis ("Horizontal");
        float moveZ = Input.GetAxis ("Vertical");

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

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

    }
}

今回は以上です。