【Unity】SetTriggerとは?アニメーションを切り替えるメソッド

SetTriggerとは? Unity

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

このページでは、

「SetTriggerってなに?」

「アニメーションをスクリプトから切り替える方法を知りたい!」

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

Unityでは、Mecanim(メカニム)という機能を使って、アニメーションの作成や再生、別のアニメーションへの遷移の設定などを行うことができます。

この中の一つであるアニメーションの遷移は、Animator Controllerを使って設定することができ、自動的に切り替えることもできれば、スクリプトから好きなタイミングで手動で切り替えることもできます。

SetTriggerは、このアニメーションをスクリプトから手動で切り替える処理を行うAnimatorコンポーネントで定義されているメソッドです。

そこで、このページでは、Unityのアニメーションの切り替えで使うSetTriggerメソッドについて、どんな機能や特徴があるのか、また使い方までを紹介していきます。

この記事を書いた人

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

SetTriggerとは?

まずは、SetTriggerがどういったメソッドなのかについてまとめていきます。

アニメーションの切り替え処理を行うメソッド

SetTriggerは、冒頭でも紹介した通りで、アニメーションから別のアニメーションへの切り替えをスクリプトから行うことができるAnimatorコンポーネントで定義されているメソッドです。

例えば、プレイヤーに対して「歩く」「ジャンプ」の2つのアニメーションを準備していた場合、通常は「歩く」のアニメーションを表示させていたいけど、ジャンプボタンを押したら「ジャンプ」のアニメーションに遷移させる必要があります。

このように、何かを条件としてアニメーションを切り替えさせたい場合に、SetTriggerメソッドを使用します。

Animator ControllerでTriggerを作る必要がある

SetTriggerメソッドは、引数にTrigger(トリガー)名を指定することで、そのトリガーを発動させて別のアニメーションに遷移させることができます。

Animator.SetTrigger("Trigger名");

このTriggerとは、アニメーションから別のアニメーションに切り替わる処理を引き起こすもののことで、Animator Controllerから遷移条件として作成することができます。

例えば、「歩く」のアニメーションから「飛ぶ」のアニメーションへの切り替えのTriggerを作っておき、スペースキーを押したらこのTriggerが発動するようにSetTriggerメソッドを書いておくことで、スペースキーを押したら「飛ぶ」のアニメーションへ遷移させることができます。

SetTriggerを使ったアニメーションの切り替え方法

ここからは、実際にUnityでSetTriggerメソッドを使ったアニメーションの切り替え方法を紹介していきます。

アニメーション(Animation Clip)を作成する

まずは、アニメーション(Animation Clip)を作成しておきましょう。

ここでは、プレイヤーが「歩く」アニメーション(Walk)と、「ジャンプ」のアニメーション(Jump)の2つを作ってみました。

Walk
Jump

歩くアニメーションはループさせたいのでLoop Timeにチェックを入れて、ジャンプするアニメーションはループは必要ないのでLoop Timeのチェックを外しています。

なお、アニメーションの作成方法については、以下のページで詳しく解説していますので、参考にしてみてください。

Animator ControllerにAnimation Clipをまとめる

次に、先ほど作成した2つのAnimation ClipAnimator Controllerのファイルにまとめて、アニメーションを切り替えられるようにしていきます。

Walkのアニメーションを作成した際に、自動で作られたAnimator Controllerのファイルを開いて、Animatorウィンドウを表示します。

Animatorウィンドウ内で右クリックして、「Create State」から「Empty」を選択してAnimation Clipを追加していきます。

新しく作成された「New State」の名前を「Jump」に変更して、インスペクターウィンドウのMotionからJumpのAnimation Clipを設定してあげます。

これで、とりあえずはAnimation Clipをまとめることができました。

アニメーションの遷移を作る

現状では、歩くアニメーションから遷移できない状態なので、ジャンプのアニメーションに切り替えられるように、Animatorウィンドウ内で設定する必要があります。

Walkを右クリックして「Make Transition」を選択すると、

矢印の付いた線が表示されるので、その状態でJumpをクリックしてあげると、WalkからJumpへのアニメーション遷移が作られます。

WalkからJumpへの切り替えは、手動でTriggerを使って切り替えたいので、この矢印マークを選択してインスペクターウィンドウから「Has Exit Time」のチェック項目を外しておきます。

また、ジャンプした後は歩くアニメーションに戻したいので、今度はJumpを右クリックして「Make Transition」を選択し、

その状態でWalkをクリックすることで、JumpからWalkへのアニメーション遷移が作られます。

JumpからWalkへの切り替えは、ジャンプが終わった後に自動で切り替えたいので、矢印を選択して「Has Exit Time」のチェックを入れておくと、自動で遷移されるようになります。

なお、「Has Exit Time」の下にある「Settings」の中で、アニメーションの終了時間や遷移するまでの時間を設定することができるので、アニメーションの遷移を確認しながらそれぞれの項目を変更してみましょう。

Triggerを作成して手動で遷移条件を作る

WalkからJumpへの遷移条件として、Triggerを作成して設定していきます。

Triggerを作成する場合は、Animatorウィンドウの「Parameters」タブから+ボタンをクリックして、「Trigger」を選択します。

分かりやすいように、「JumpTrigger」という名前に変更しておきます。

そして、WalkからJumpへの矢印マークを選択して、インスペクターウィンドウの下部分にあるConditions+ボタンを押して、新たに作られた「Blend」をクリックして先ほど作成した「JumpTrigger」を選択します。

これで、JumpTriggerが発動されると、WalkからJumpへアニメーションが遷移されるという設定が完了しました。

SetTriggerでスクリプトからアニメーションを切り替える

先ほど作成したJumpTriggerを発動させるために、SetTriggerメソッドをスクリプトで記述していきます。

ここでは、PlayerにRigidbodyコンポーネントを付けて、Dを押すと右に進み、Aを押すと左に進み、スペースキーを押すとジャンプするという処理を作っていきます。

using Unity.VisualScripting;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    Rigidbody2D rb;
    Animator animator;
    int direction;

    float walkForce = 25.0f;
    float jumpForce = 500.0f;
    float maxSpeed = 4.0f;
    float speed;

    void Start()
    {
        Application.targetFrameRate = 60;
        rb = GetComponent<Rigidbody2D>();   // Rigidbodyコンポーネントを取得
        animator = GetComponent<Animator>();    // Animatorコンポーネントを取得
    }

    void Update()
    {
        // スペースキーを押した場合のジャンプ処理
        if (Input.GetKeyDown(KeyCode.Space) && transform.position.y < -2.7f)
        {
            animator.SetTrigger("JumpTrigger"); // トリガーを発動させる処理
            rb.AddForce(transform.up * jumpForce);  // ジャンプ処理
        }

        // 進行方向を決める処理
        if (Input.GetKey(KeyCode.D))
        {
            direction = 1;
        }
        else if (Input.GetKey(KeyCode.A))
        {
            direction = -1;
        }
        else
        {
            direction = 0;
        }

        // プレイヤーを反転させる処理
        if (direction != 0)
        {
            transform.localScale = new Vector3(0.7f * direction, 0.7f, 0.7f);
        }

        // 左右方向へのスピードを取得
        speed = Mathf.Abs(rb.linearVelocityX);

        // アニメーションの速度を指定
        if (rb.linearVelocityY == 0)
        {
            animator.speed = speed / 3; // 左右に動いている場合の速度
        }
        else
        {
            animator.speed = 1.0f;  // ジャンプしている際の速度
        }
    }

    void FixedUpdate()
    {
        // 左右に移動する処理
        if (maxSpeed > speed && direction != 0)
        {
            rb.AddForce(transform.right * walkForce * direction);
        }
    }
}

24行目から29行目でスペースキーを押したらジャンプする処理を作っていて、この中で

animator.SetTrigger("JumpTrigger");

と記述してあげることで、プレイヤーが歩いているアニメーションからジャンプするアニメーションに切り替わってくれます。

また、オブジェクトのLinearVelocity(線速度)の値を使って、アニメーションの速度を54行目から62行目で指定していて、ジャンプしている状態と歩いている状態でアニメーションの表示させる速度を変更しています。

実際にゲームを実行してみると、

歩いているときは、歩くスピードに合わせてアニメーションが変動していて、スペースキーを押すとジャンプのアニメーションに切り替わり、着地とともに歩くアニメーションに戻っているのが分かります。

まとめ

このページでは、UnityのAnimatorコンポーネントで定義されているSetTriggerメソッドがどういうものなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

Unityでは、アニメーションを作成して、再生から切り替えまでを行う機能があります。

その中のAnimatorコンポーネントで定義されているSetTriggerメソッドとは、アニメーションから別のアニメーションへの切り替えをスクリプトから行うことができるメソッドです。

このSetTriggerを使うことで、アニメーションの遷移条件のトリガーを発動することができるので、ボタンなどを押した際のアニメーションの切り替えで活用できます。

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

コメント