【Unity】アニメーションの切り替えをbool型で実装する方法

アニメーションをbool型で切り替える Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「アニメーションの切り替えを手動で行いたい!」

「bool型でアニメーションを切り替える方法が知りたい!」

というお悩みの方に向けた内容となっています。

Unityでは、現在再生されているアニメーションを他のアニメーションに手動で切り替えるような場合、AnimatorControllerで作成したパラメーターを使って、条件指定して切り替えることができます。

その中でも、キャラクターが歩いたり泳いだりするような状態を表している動きのアニメーションの場合、bool型のパラメーターで切り替えを行うことが多いです。

このbool型のパラメーターは、trueかfalseの値に応じてアニメーションが切り替わる仕組みとなっていて、スクリプトからSetBoolメソッドを使って値を変更することで、アニメーションを切り替えることができます。

そこで、このページでは、Unityでbool型のパラメーターを使って、アニメーションを手動で切り替える方法についてまとめていきます。

開発環境
  • Windows11
  • Unity 6.3 LTS(6000.3.2f1)
この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

アニメーションをbool型のパラメーターで切り替える方法

それでは、bool型のパラメーターを使って手動でアニメーションを切り替える設定方法について紹介していきます。

ここでは、キャラクターのアイドル状態のアニメーション(Idle)から、

移動操作を行った際に、歩くアニメーション(Walk)に切り替えるという処理を作っていきます。

ちなみに、アニメーションを手動で切り替える場合、bool型以外にもtrigger型のパラメーターが使われます。

この2つの使い分けとして、

  • bool型:アニメーションを特定の状態の間、常に再生させるような使い方(アイドリングや歩きなど)
  • trigger型:アニメーションを一度だけ再生させるワンショット的な使い方(攻撃やジャンプなど)

となっていて、今回のようなアイドル状態から歩く状態に切り替えるような場合は、bool型が使われます。

なお、trigger型については、以下のページで紹介しているので、参考にしてみてください。

AnimatorControllerでbool型のパラメータを作成する

まずは、AnimatorControllerの中でbool型のパラメータを作成していきます。

ここでは、最初はIdleのアニメーションに自動遷移させた後に、IdleからWalkに手動で遷移させるパラメーターとして「IsWalk」、またWalkからIdleに遷移させるパラメーターとして「IsIdle」という2つのbool型のパラメーターを作成していきます。

パラメーターを作成する場合は、AnimatorControllerの上部の「Parameters」を選択して、+ボタンから「Bool」を選択します。

パラメーターを作成したら、それぞれに名前を付けておきます。

アニメーションの遷移条件にbool型を指定する

次に、アニメーションを遷移させる条件の中で、先ほど作成したbool型のパラメーターを指定していきます。

まず、Idleのアニメーションを右クリックして「Make Transition」を選択、

そこから表示された矢印をWalkのアニメーションに繋げてあげます。

この矢印を選択して、インスペクターウィンドウから「Has Exit Time」のチェックを外し手動で遷移させるようにして、「Transition Duration」の設定を0にしておきます。

そして、下部にある「Conditions」+ボタンを押して、IsWalkのパラメーターがtrueになることを遷移条件として設定します。

同様に、WalkのアニメーションからIdleのアニメーションへのTransitionも設定しておき、IsIdleのパラメーターがtrueになった際に遷移させるように設定しておきます。

これで、IsWalkがtrueになったらWalkのアニメーションが再生されて、IsIdleがtrueになったらIdleのアニメーションが再生されるようになります。

スクリプトからSetBoolメソッドで値を変更する

あとは、スクリプトからパラメーターの値を変更する処理を作っていきます。

bool型のパラメーターの値を変更させる場合は、Animatorクラスで定義されているSetBoolメソッドを使います。

Animator.SetBool("name", value);

name:変更したいパラメーター名(string型)
value:変更する値(bool型)

上記のように、引数にパラメーター名と値を指定してあげることで、パラメーターの値が変更されます。

ここではオブジェクトに対して、以下のスクリプトを紐づけていきます。

using UnityEngine;
using UnityEngine.InputSystem;  // InputSystemを利用する記述

public class PlayerController : MonoBehaviour
{
    Animator animator;
    Vector2 moveValue;
    Vector2 startScale;
    int direction;

    // プレイヤーの状態を定義するenum型
    enum PlayerState
    {
        Idle,
        Walk
    }

    PlayerState state = PlayerState.Idle;   // 初期の状態をIdleに指定する
    PlayerState oldState;   // 過去のstateの値を取得する変数

    void Start()
    {
        animator = GetComponent<Animator>();    // Animatorコンポーネントを取得
        startScale = transform.localScale;      // 最初のスケール値を取得
    }

    void Update()
    {
        if (moveValue != Vector2.zero)
        {
            transform.Translate(moveValue.x * 0.01f, 0, 0); // 移動処理
        }
        else if (state != PlayerState.Idle)  // キャラクターが動いていない場合
        {
            state = PlayerState.Idle;   // アイドル状態への変更
        }

        // パラメーターを変更してアニメーションを切り替える処理
        if (state != oldState)
        {
            animator.SetBool("IsIdle", state == PlayerState.Idle);
            animator.SetBool("IsWalk", state == PlayerState.Walk);
            oldState = state;   // 値を更新する
        }
    }

    // Move操作が行われた場合の処理
    void OnMove(InputValue value)
    {
        moveValue = value.Get<Vector2>() * 0.5f;    // キー操作による移動量を取得

        if (state != PlayerState.Walk)
        {
            state = PlayerState.Walk;   // 歩く状態への変更
        }

        // キャラクターの反転処理
        if (moveValue.x > 0 && direction != 1)
        {
            direction = 1;
            transform.localScale = new Vector2(startScale.x * direction, startScale.y);
        }
        else if (moveValue.x < 0 && direction != -1)
        {
            direction = -1;
            transform.localScale = new Vector2(startScale.x * direction, startScale.y);
        }
    }
}

まず、12行目で、enumを使ってキャラクターの状態を表すPlayerState型を定義しておきます。

// プレイヤーの状態を定義するenum型
enum PlayerState
{
    Idle,
    Walk
}

PlayerState state = PlayerState.Idle;   // 初期の状態をIdleに指定する

今回は、2つだけのアニメーションの切り替えなのでわざわざenumを使わなくても良いですが、多くのアニメーションを切り替えるような場合は、enumを使って管理しておくのが便利です。

次に、23行目でGetComponentメソッドを使って、後ほど使用するAnimatorのコンポーネントを取得しています。

animator = GetComponent<Animator>();    // Animatorコンポーネントを取得

また、今回PlayerInputコンポーネントを使っていて、移動操作を行った際に48行目のOnMoveというメソッドが実行されます。

このOnMoveメソッドの中の54行目で、PlayerState型の変数をWalkに変更する処理を行っています。

if (state != PlayerState.Walk)
{
    state = PlayerState.Walk;   // 歩く状態への変更
}

反対に、35行目でキャラクターの移動量を表すmoveValueの変数の値が0の場合、つまりキャラクターが動いていない場合に、PlayerState型の変数をIdleに変更するようにしています。

else if (state != PlayerState.Idle)  // キャラクターが動いていない場合
{
    state = PlayerState.Idle;   // アイドル状態への変更
}

これでPlayerState型の変数は、キャラクターが動いている時はWalkとなり、止まっているときはIdleの値になります。

あとは、Updateメソッドの中の38行目以降で、このPlayerState型の変数の値が変更された場合に、SetBoolメソッドを使って、パラメーターの値を変更する処理を行っています。

// パラメーターを変更してアニメーションを切り替える処理
if (state != oldState)
{
    animator.SetBool("IsIdle", state == PlayerState.Idle);
    animator.SetBool("IsWalk", state == PlayerState.Walk);
    oldState = state;   // 値を更新する
}

SetBoolメソッドの第二引数の「state == 〇〇」の部分は、PlayerState型の変数の値と同じならtrue、異なるならfalseになるように指定しています。

上記のように記述することで、いずれか一つのbool型のパラメーターだけがtrueとなり、その他のパラメーターを一括でfalseに設定することができるので、アニメーションが切り替わるようになります。

これでゲームを実行してみると、

最初はアイドル状態のアニメーションで、キー操作で移動すると歩くアニメーションに切り替わり、キー操作を離すとまたアイドル状態に戻るようになりました。

まとめ

このページでは、Unityでbool型のパラメーターを使って、アニメーションを手動で切り替える方法についてまとめていきましたが、いかがでしたでしょうか?

アニメーションの切り替えをbool型のパラメーターで行うことで、truefalseの値を使って別のアニメーションに遷移させることができます。

具体的には、スクリプトの中でSetBoolメソッドを使うことで、特定のタイミングでパラメーターの値を変化させて切り替えることができます。

歩くや泳ぐなどのような状態を表すアニメーションを切り替える際は、bool型のパラメーターを活用してみましょう。

最後までお読みいただきまして、ありがとうございました!

コメント