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


前回の記事のつづきです。前回記事ではタグの切り替えを行いましたが、今回はそのタグによってプレイヤーの動作を変えてみます。

こんな感じ。


ロボくんの動きは前回の動画とほぼ同じですが、今回はAnimatorの遷移のほうに着目してください。Cubeが壁にぶつかるまでは押し(CratePush)、Cubeが壁にぶつかった後はよじ登る(Climb)アニメーションに遷移しています。

前回記事で紹介したとおり、Cubeにはタグを付けており、壁にぶつかるまでは「Pushable」、壁にぶつかった後は「Climbable」にタグを切り替えています。ロボくんはぶつかった物のタグを見て、動作を変えています。

AnimatorControllerの遷移図はこんな感じ。Bool型の変数「Push」と「Climbを定義し、スクリプトからどちらかを呼び出すようにしています。
全画面キャプチャ 20170119 125930

あとはスクリプト。微調整を繰り返してスクリプト全体としては結構長くなってしまったので、今回は変数の宣言、初期化と、キモである衝突処理の部分だけ示しておきます。

まずは変数の宣言と初期化。変数名だけ見ておいてください。

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{
    public float speed = 6.0F;
    public float rotateSpeed = 3.0F;

    Animator anim;
    Rigidbody rb;

    enum eState         // (移動の)状態
    {
        Default,    // 通常(よじ登り以外)
        Climb,      // よじ登り
    }
    eState _state = eState.Default;


    // --- 初期化 ------------------------------------------------------------------------
    private void Start ()
    {
        anim = GetComponentInChildren<Animator> ();
        rb = GetComponent<Rigidbody> ();
    }


で、ここが衝突処理。OnCollisionEnter()でぶつかった対象物のタグを取得し、それに応じて「押す」または「よじ登る」、いずれかの処理に遷移させています。また、OnCollisionExit()で、押すアニメーションを止めています。

    // --- 衝突開始時の処理 ------------------------------------------------------------------------
    private void OnCollisionEnter (Collision collision)
    {
        if(collision.gameObject.tag != "Untagged") {
            Debug.Log ("collision.gameObject.tag: " + collision.gameObject.tag);
        }

        // --- もしロープなら掴まる ----------------------------------------------
        if (collision.gameObject.tag == "Rope")
        {
            anim.SetBool ("RopeClimb", true);
            _state = eState.Climb;
            rb.isKinematic = true;
        }

        // --- もし押せるオブジェクトなら押す ------------------------------
        if (collision.gameObject.tag == "Pushable")                          
        {
            anim.SetBool ("Push", true);
        }

        // --- もしよじ登れるオブジェクトならよじ登る ------------------------------
        if (collision.gameObject.tag == "Climbable"                         
            && transform.position.y <= collision.gameObject.transform.position.y - 0.99f)     // 高さチェック
        {
            anim.SetBool ("Climb", true);
            _state = eState.Climb;
            rb.isKinematic = true;
        }

    }


    // --- 衝突終了時の処理 ------------------------------------------------------------------------
    private void OnCollisionExit (Collision collision)
    {
        //if (collision.gameObject.tag == "Pushable")
        //{
        anim.SetBool ("Push", false);                   // 押すのをやめる
        //}
    }


今回は以上です。

なお今回使った「押す」・「よじ登る」 等のアニメーションは、↓ このAssetのものを使わせてもらいました(自腹購入しました)。このAssetについても今後の記事で紹介したいと考えています。