Unityの学習 part7

今回は、モデルの移動とそれに合ったアニメーションを設定していきます

ちなみにロードマップは以下のようになっております

モデルを使用したアニメーションのロードマップ
1. モデルの取得と配置 
2. モデルにアニメーションの設定
3. モデルの移動に合わせたアニメーションの設定 ←今回の記事
4. モデルを追尾するカメラの設定

目標は、モデルの動かし方、アニメーションの設定、カメラの向きに合わせた移動の仕方を学習することです

モデルの移動

モデルの移動は、前後のみとして作成します
左右の入力は、コンテンツによって扱いがことなるので、今回は作成しません

前後の移動は、キー入力で行いたいのでInputを使って取得していきます

    State state;
    enum State
    {
        Stop,
        Up,
        Down,
    }

    private void FixedUpdate()
    {
        //入力の感知
        if (Input.GetKey(KeyCode.UpArrow))
        {
            state = State.Up;
        }else if (Input.GetKey(KeyCode.DownArrow))
        {
            state = State.Down;
        }
        else
        {
            state = State.Stop;
        }
    }

上キーの入力ならばステータスをUpにして、下キーの入力ならばDownにして、それ以外ならStopにします
これでキー入力で、移動する下準備ができました
あとは、これをもとに移動させていきます

    Vector3 vector = Vector3.forward;

    void Update () {
       if(state == State.Up)
        {
            transform.position += vector * Time.deltaTime;
        }
    }

Vector3.forwardはz方向に+1のみを持つVectorを受け取ることができます

これで、上キーを押し続けると前に進むようになります
進む方向にdeltaTimeをかけるのは、1秒で1m進ませるための処理になります
deltaTimeは前回のフレーム更新からの差分を返してくれるメソッドです

実行するとこんな感じになります
movefront

前に進むことが確認できたら、下キーの入力時も同様にしていきます

アニメーションの設定

最初に、開始時のアニメーションを設定します
Stateを新規で作成して、Entryから矢印を伸ばします
作成したStateの名前をPauseに変えて、Motionを好きなものにしましょう
これで初期状態の設定は完了です

次に、前進時のアニメーションを設定していきます
先ほどと同じように、Stateを作成して相互に矢印を伸ばします
名前はFrontにでもしましょう
MotionはWALK00_Fにします

そしたら、どういう状態の場合に遷移するかを決定します
ここでは、BoolでParameterを作成します
Parameterの名前はFrontにしておきます
Frontがfalseの場合には、Pauseへ
Frontがtrueの場合には、Frontへ遷移するようにします

    void Update () {
       if(state == State.Up)
        {
            animator.SetBool("Front", true);
            transform.position += vector * Time.deltaTime;
        }else
        {
            animator.SetBool("Front", false);
        }
    }

animator.SetBoolで先ほど設定したパラメータに値をセットしています
ステータスがUpの状態では、Frontパラメータにtrueをセットします
それ以外では、falseをセットしてPuase状態に戻るようにしています

frontMove

これを、後進も同様に設定していきます

最終的には、以下のようなスクリプトになります

using UnityEngine;

public class unitychan : MonoBehaviour {
    Animator animator;
    State state;
    Vector3 vector = Vector3.forward;

    enum State
    {
        Stop,
        Up,
        Down,
    }

	void Start () {
        //最初にunitycahnのコンポーネントからAnimatorを取得
        animator = GetComponent();
        state = State.Stop;
	}
	
	void Update () {
       if(state == State.Up)
        {
            animator.SetBool("Front", true);
            transform.position += vector * Time.deltaTime;
        }else if (state == State.Down)
        {
            animator.SetBool("Back", true);
            transform.position -= vector * Time.deltaTime;
        }else
        {
            animator.SetBool("Back", false);
            animator.SetBool("Front", false);
        }
    }

    private void FixedUpdate()
    {
        //入力の感知
        if (Input.GetKey(KeyCode.UpArrow))
        {
            state = State.Up;
        }else if (Input.GetKey(KeyCode.DownArrow))
        {
            state = State.Down;
        }
        else
        {
            state = State.Stop;
        }
    }
}

実行するとこんな感じになります
frontMovePouse

これで前後の移動とアニメーションの完了です

終わりに

今回は、キャラクターを使用したコンテンツで共通と思える、前後のみの移動とその移動に合わせたアニメーションを紹介しましたが、3Dコンテンツでは、基本的にキャラクターは前後左右への動きをするものです
左右の入力は、そのまま左右に移動することや、入力方向へ回転するものがありますが、そこは、コンテンツの中で操作しやすい方法を導入すればいいと思います

火曜日担当:poppy



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム