君がゲームを作る!Unityゲーム開発入門
第32回 横移動時のアニメーションを設定する(後編)

キャラクターが動くと、ぐっとゲームっぽくなるよ

みなさん、こんにちは!

だいたい夕方の4時くらいからはお酒を飲みながら仕事をしているので、 5時くらいに取引先から電話があるとだいたいろれつが回っていないあらたまです。

さて今日は「君がゲームを作る!Unityゲーム開発入門」の第32回目です!

おさらい

前回 忍者が走るアニメを作成し、「アニメーターウィンドウ」で 立ちアニメと走りアニメの間を相互に移動できるように関連を持たせましたね。

いまはまだ関連を持たせただけで、実際にアニメーションの切り替えが行われません。

今回は、アニメーションの切り替えを実装していきましょう!

変更の手順

まず最初に今回の手順をお伝えすると

  • 忍者の状態を保持する変数を用意する
  • アニメーション間を移動する条件を設定する
  • キーボード押下時に変数の値を変更するようにプログラミングする

という3つの手順で行います。

それでは始めていきましょう!

変数を用意する

まずは忍者が立っているのか走っているのか、その状態を保持するための変数を用意します。

アニメーターウィンドウで「Parameters」をクリックします。

「+」をクリックします。

「int」をクリックします。

変数一覧に行が追加されますので、変数名に任意の名前を入力しましょう。
ここでは「CharaState」としておきました。

アニメーション間の移動条件を設定する

続いてアニメーションの切り替え条件を設定します。

インスペクターウィンドウを操作しますので、 もしもアニメーターウィンドウを最大化している場合は最大化を解除してください。

立ちアニメ(Charactor_Stand)から走りアニメ(Charactor_RunRight)へ 向いている矢印をクリックして選択します。

インスペクターウィンドウの「Condition」欄の「+」をクリックします。

さきほど用意した変数「CharaState」を選択し、 条件を「等しい(Equals)」、値を「1」に設定します。

これで変数「CharaState」の値が「1」になると、立ちアニメから走りアニメに切り替わるようになりました!

逆方向の矢印にも同じようにして条件を「等しくない(NotEquals)」、値を「1」に設定します。

これで変数「CharaState」の値が「1」以外になると、走りアニメから立ちアニメに戻るようになりました。

キーボード押下時に変数の値を変更する

つづいて変数「CharaState」の値を変更する処理をプログラミングしていきます。

プロジェクトウィンドウで「Scripts」フォルダを選択し、 「CharaControl」ァイルを選択後インスペクターウィンドウで「Open」をクリックします。

第28回 でプログラミングした内容を基に、太字の部分を追加してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharaControl : MonoBehaviour
{

    // ... 省略 ...

    // アニメーター
    Animator animator;

    // Start is called before the first frame update
    void Start()
    {
        // ゲームオブジェクトが持っているRigidbody2Dコンポーネントを
        // 取得してメンバ変数に保持
        rb2d = GetComponent<Rigidbody2D>();

        // アニメーターを取得
        animator = GetComponent<Animator>();
    }

    // 1フレーム毎に呼び出される
    private void Update()
    {
        // ... 省略 ...
    }

    // 画面表示更新処理
    void FixedUpdate()
    {
        // 横矢印キーの押されている状況を取得
        float moveHorizontal = Input.GetAxis("Horizontal");

        // アニメーション切り替え
        if (moveHorizontal != 0)
        {
            animator.SetInteger("CharaState", 1);
        }
        else
        {
            animator.SetInteger("CharaState", 0);
        }

        // AddForceメソッドに渡すために、Vector2型に変換
        Vector2 movement = new Vector2(moveHorizontal, 0);

        // AddForceメソッドでキャラクターのRigidbody2Dコンポーネントに力を加える
        rb2d.AddForce(movement * speed);
    }
}

まず最初にGetComponentでゲームオブジェクトのアニメーターコンポーネント取得し、 メンバ変数に保持しています。

そしてコンポーネントの「CharaState」に 右矢印キー または 左矢印キー が押されているときは1を、 それ以外のときは0を設定しています。

テストプレイで動作確認をする

それでは、テストプレイをして変化を確認してみましょう!

▶ボタンを押して、プレイモードに入ります。

移動していないときは立っているアニメが、

横移動しているときは走っているアニメが表示されるようになりました!

今回はここまでです!

実際に操作してみるとわかりますが、いまは2つの問題点があります。

  • 忍者が左に移動しているときも右側に向かって走っているアニメが表示されてる。
  • 矢印キーを押してから、アニメーションが始まるまで少し時間差がある。

次回はまずキャラクターを左に向ける方法からお話ししたいと思います。

次回へ続く。

>> 続きの記事
【君がゲームを作る!Unityゲーム開発入門】第33回 横移動時に左右を反転させる