Unityでアニメーションを遷移して動かす(アニメーター機能)

ころもちゃん

キャラクターを歩いたり、走らせたり、いろんな動きをさせたい!

本記事の内容

・UnityのAnimator機能の概念について
・複数のアニメーションを遷移させていく設定をする方法
※ゲーム制作におけるアニメーションとはなにか、については以下の記事で解説しています。初めてゲーム制作する方はこちらも見てみてください。

完成図
目次

キャラクターはいろんなアニメーションの組み合わせで動いている

アニメーションを組み合わせるアニメーター機能

上記の関連記事で解説しているとおり、ゲームの中を動くキャラクターや敵、背景のオブジェクトが動いたり、モーションを変えるには、アニメーションという機能を使います。

上部の記事で解説しているとおり、キャラクターがゲームの中で自由に動いているように見えるのは、キャラクターの行動に応じてアニメーションを切り替えているからです。スマブラを例にとると、こんなアニメーション遷移をしている(実際はもっと複雑だと思いますが簡略化してます...)はずです。

これを実現するのがアニメーターという機能です。名前が近いのでわかりづらいですが、「歩く」、「走る」のような一つ一つの動きがAnimationClip機能です。

「歩く」→「走る」などのAnimationClipを遷移するのが、アニメーターという違いです。

Animatorの作り方

まずはAnimationを複数作ろう

今回はこちらの無料アセットを使って解説します。

あわせて読みたい
Knight Sprite Sheet (Free) | 2D Characters | Unity Asset Store Elevate your workflow with the Knight Sprite Sheet (Free) asset from Kin Ng. Find this & more Characters on the Unity Asset Store.

アニメーションを遷移するアニメーターを作るには、複数のAnimationClipを用意します。
今回は、「待機」、「歩き」、「攻撃」、「やられ」のAnimationClipを作りました。

AnimationClipの作り方はこちらの記事で解説しています。

遷移する条件を作ろう

遷移の条件を設計する

では次に、このAnimationClipを遷移していく条件を考えてみます。
プレイヤーが動いている間は、「歩き」モーション、攻撃ボタンを押したら、「攻撃」モーション、攻撃が当たったら「やられ」モーションとしてみましょう。

矢印が多くて一見複雑そうに見えますが、実はとてもシンプルです。何もしなければ「待機」、動きだしたら「歩き」、攻撃ボタン押したら「攻撃」、いずれの状態でも攻撃を受けたら「やれれ」という遷移をするということです。

それぞれの矢印を遷移していくには条件が必要です。今回は以下のような条件とする値で設定してみましょう。

  • 何もしていないときは「待機」モーション
  • キャラクターを移動させたら、「移動」モーション
  • 攻撃ボタンを押したら、「攻撃」モーションに移る、攻撃が終わったら「歩き」モーションに移る
  • 敵の攻撃が当たったら即「やられ」モーション、1秒後に「歩き」モーションに移る

遷移の条件を変数に割り当てる

アニメーションを遷移するためには、パラメータという機能を使い、ここに先程設計した遷移条件を作成する必要があります。

作り方は簡単です。[ウィンドウ]→[アニメーション]→[アニメーター]を選択し、アニメーターウィンドウを開きます。
画面下部に固定しておくのが、おすすめです。

パラメーターの下にある「+」ボタンを押します。


上記の表にあるようなパラメータを作ってみました。これでパラメータの設定はひとまず完了です。丸印を入れられるパラメータがTriggerで、チェックボックスを入れられるパラメータがbool型です。

今回は取り上げませんが、たとえばパラメータを、float型(小数点ありの変数)の"speed"という名前の変数とし、キャラクターの移動速度が0.1以上だったら「歩き」、2以上だったら「走り」、それ以外は「待機」といったことも可能です。

アニメーターウィンドウの見方と設定の方法

アニメーターウィンドウを開くと、Entry、AnyState、Exitという3つの箱があります。アニメーションクリップ作成済みの状態だと、このような箱が追加で出来上がっているはずです。

アニメーターウィンドウを見るときは、矢印、この2つを意識して見てみましょう。
は、アニメーションを指します。歩く、攻撃といったアニメーションが箱で表現されています。箱を選択した時にインスペクタに表示されている△マークのアイコンがアニメーションの名前です。

そして、アニメーションの遷移条件、これが矢印です。

こいつが非常に大事です。

まずは、先程の設計図にある通り矢印を繋いでみます。箱を選択して右クリックすると、どの箱とどの箱を結ぶかを選択できます。

オレンジ色の箱はデフォルト(プレイして最初に実行されるアニメーション)です。アニメーションの箱を選択して、「レイヤーデフォルトとして設定」とすると、Entryから矢印が伸びてデフォルトとして設定されます。

また、最初から入っている箱の意味は下記の通りです。

  • Entry:アニメーションが開始した状態で遷移する先を決めます
  • AnyState:今回の「やられ」モーションのように、どのアニメーション中であっても割り込んで遷移をする場合
  • Exit:アニメーションを終了させる場合に使います、小規模なアニメーションなら、そこまで使うことが無いかも

遷移条件を設定する

最後に遷移条件を設定していきます。遷移条件を設定するには、矢印を選択して、インスペクタから設定します。

Conditionが、アニメーションの遷移条件になります。上記のGIFは一部の設定だけですが、全部の矢印について設定していきます。
最終的にこのようになりました。


実際にアニメーションを遷移させてみるプログラムをAIに作成してもらう

ここまで来たらアニメーターの設定は完了です。最後にこのアニメーターを実際に遷移するプログラムをChatGPTに作成してもらいましょう。

ChatGPTへの命令文
キャラクターにアタッチする前提で、アニメーターを遷移するスクリプトを作成してください。
アニメーターは以下のパラメータを持っており、下記の条件で遷移させてください。
・attackTrigger
・isWalk(bool値)
・isDamaged(bool値)

・キーボードの移動キーを押す→移動モーションに遷移、isWalkをON。キーボード移動が終わったらisWalkをOFF ・攻撃ボタン(Space)を押す→攻撃モーションに遷移するために、attackTriggerをON
・敵オブジェクトにぶつかる→やられモーションに遷移するために、isDamagedをON

ChatGPTによって作成されたスクリプトは下記の通りです。

using UnityEngine;

public class CharacterAnimator : MonoBehaviour
{
    private Animator animator;

    void Start()
    {
        // アタッチされたAnimatorコンポーネントを取得
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // 移動キーが押されているかチェック
        bool isMoving = Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0;
        animator.SetBool("isWalk", isMoving);

        // 攻撃ボタン(Space)が押されたかチェック
        if (Input.GetKeyDown(KeyCode.Space))
        {
            animator.SetTrigger("attackTrigger");
        }
    }

    void OnCollisionEnter(Collision collision)
    {
        // 敵オブジェクトにぶつかったかチェック
        if (collision.gameObject.CompareTag("Enemy"))
        {
            animator.SetBool("isDamaged", true);
        }
    }

    void OnCollisionExit(Collision collision)
    {
        // 敵オブジェクトから離れたらダメージ状態をリセット
        if (collision.gameObject.CompareTag("Enemy"))
        {
            animator.SetBool("isDamaged", false);
        }
    }
}

同じクラス名(CharacterAnimator)のスクリプトを作成して、AIが生成したコードをコピペして作成します。

そして、キャラクターにアタッチします。

この状態で再生してみましょう。キーボードの入力に応じてキャラクターのアニメーションが切り替わりました!

AnyStateを使ってやられ状態に遷移する

さいごに、ダメージを受けたらやられるモーションを取るようにしてみます。アクションゲームなどの場合は、敵オブジェクトや敵の弾に接触したことなどがトリガーになりますが、今回はボタンを押したらやられモーションに遷移させてみます。

さきほどのCharactorAnimationというスクリプトに以下のメソッドを追加してみます。

    // 攻撃を受けたときの処理
    public void TakeDamage()
    {
        // AnimatorのisDamagedパラメータをtrueに設定する
        animator.SetBool("isDamaged", true);

        // (オプション)ダメージを受けた状態を一定時間後にリセットしたい場合
        // StartCoroutine(ResetDamage());
    }

そして、適当なボタンを作り、


ボタンにこの処理を割り当てます。

これで再生して、ボタンを押してみます。すると、キャラクターがどんなアニメーションを取っていても、すぐ被ダメに行動が移るようになりました!

動きになんかラグがある・・・と思ったら

「終了時間あり」の設定を確認しよう

アニメーターの遷移を作ると、ボタンを押してから遷移するまで、少しラグがある・・・と感じることがあります。そういう場合は、「終了時間あり(hasExitTime)」を確認してみましょう。
デフォルトではONになっていますが、OFFにした方が良いケースの方が多いです。

このオプションは、「現在のアニメーションステートが完全に終了してから次のステートに遷移するかどうかを指定する」という意味です。
なので、アニメーションの動きの途中で切り替える場合(「歩き」から「待機」)は、OFFにしましょう。
一方、攻撃モーションなどは、攻撃モーションが完了してから待機状態に切り替える必要があるため、「攻撃」→「待機」への遷移する場合などは、ONにしましょう。

まとめ

Unityのアニメーター機能について、基本的な使い方を解説しました。アニメーションが自由に動くと一気にゲームとしてのクオリティが上がります!ぜひマスターしましょう!!
それでは素敵なゲーム制作ライフを!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ゲーム制作の敷居を下げ、もっと多くの人にゲーム作りを楽しんでもらうために、ゲームをカンタンに作る方法を”網羅的に”解説しています。
よかったらブックマークお願いします。
Twitter(X)もよければフォローお願いします。

コメント

コメント一覧 (1件)

コメントする

目次