ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

20220329162023

Unity - 2D:Animatorを使ってみよう -

初めに

 複数のアニメーションを管理するAnimatorの使い方をまとめます。

Animationの作り方

 以前、記事をまとめておりますので、そちらをご覧ください。

fineworks-fine.hatenablog.com

Animatorの作成

 Spriteをスライスし、ドラッグ&ドロップする方法でAnimatorとAnimation Clipを作成することができます。(上のAnimationの作り方にあるリンク先をご覧ください)
 また、次のようにしてもAnimatorを作ることができます。

  • Assets内で右クリック→Create→Animator Controllerをクリックする


Animatorウィンドウを見てみよう

 Window→Animation→AnimatorをクリックするとAnimatorウィンドウを開くことができます。

 Animatorウィンドウは下の画像のようなものになっています。

 Entry, Any State, Exitと書かれた3つのStateがあることが分かります。Stateとは状態を意味します。今回はアニメーションの状態、つまり、歩行、ジャンプなどどのアニメーションをするかを表す要素です。おそらく、難しいことは考えず、使ってみればどのようなものか分かってきます。詳しいことは下のリンク先に公式の説明がありますので、そちらをご覧ください。
docs.unity3d.com

 Entry, Any State, Exitは初めから用意されているStateになり、それぞれ役割があります。

Entry

 Entryは最初にアニメーションの遷移がスタートするStateです。アニメーションの最初に設定したい動作はこのEntryから遷移させるようにしましょう。

Any State

 Any Stateはどの状態からでも好きな状態に遷移できるStateです。

Exit

Exitに遷移すると最初のEntryに戻ります。

Animatorを使って、アニメーションを遷移させよう

 実際にAnimatorを使ってアニメーションを遷移させてみましょう。

  • Animation Clipを作り、Animatorにドラッグ&ドロップする

 これでアニメーションのStateがAnimatorに追加されます。この記事では、Idel、Walk、JumpのAnimation Clipを追加しました。
 オレンジ色のStateはデフォルトのState、つまり最初に起動されたときのStateです。変更するときは、Stateを右クリックし、Set as Layer Default Stateをクリックします。


  • Stateを右クリックし、Transitionを設定する

 アニメーションの遷移の仕方を設定します。Stateを右クリックし、Make Transitionをクリックします。そして、遷移させたいStateへ矢印を結びます。Idleは立ちアニメーションなので、Default Stateにします。Walk、Jumpはいつでも遷移できるようにAny Stateから矢印を結んでおきます。


  • Parameterを設定する

 Parametersをクリックし、+をクリックします。すると、追加するParameterを選択することができます。

 スクリプトからアニメーションを遷移させるときに、Animatorを使うのですが、その際に必要なParameterを設定することができます。Parameterは次の4つになります。

Parameter 説明
Int 整数
Float 小数部分をもつ数値
Bool true, falseの値
Trigger 遷移によって消費されたときコントローラーによってリセットされる boolean パラメーター

 この記事では、Walk、JumpというBoolのParameterを追加しています。

  • 矢印をクリックし、それぞれの遷移の仕方を設定する

 矢印をクリックすると、Inspectorに次のような画面が現れます。ここで遷移の仕方を設定します。

 例えば、Any StateからJumpへの遷移の場合、次のように設定します。

 大まかな役割は次の通りです。

Has Exit Time 遷移条件を時間で指定する項目
Conditions 遷移条件を論理式で指定する

 Jumpをするタイミングですぐにジャンプのアニメーションに遷移してほしいため、Has Exit TimeのSettingsに0が入力されています。また、Can Transition To Selfのチェックを外しています。これにチェックが入っていると、Any Stateから選したアニメーション中にもう一度同じアニメーションに遷移できてしまいます。今回だとジャンプ中に何回もジャンプを開始するアニメーションをしてしまいます。
 Conditionsでは、Jumpがtrueになった段階で、アニメーションを遷移させたいため、このようにしています。

 他の矢印の遷移については、次のように設定しました。

Has Exit Time Conditions
Any State→Walk Any State→Jumpと同様 Walk, true
Walk→Exit Any State→Jumpと同様 Walk, false
Jump→Exit Any State→Jumpと同様 Jump, false

キャラクターを動かしてみる

 次のスクリプトとAnimatorをキャラクターにアタッチし、動かしてみましょう。

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

public class PlayerScript : MonoBehaviour
{
    //Animatorを入れる変数
    private Animator animator;

    void Start()
    {
      //Animatorを取得
      animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetAxis("Horizontal") > 0)  //HorizontalのPositive Buttonが押されたら
        {
          this.transform.position += new Vector3(0.1f, 0.0f, 0.0f);
          //右を向くためにScaleのx成分を変更
          this.transform.localScale = new Vector3(-0.5f, 0.5f, 0.5f);
          //AnimatorパラメーターのWalkをtrueに
          animator.SetBool("Walk", true);
        }
        else if(Input.GetAxis("Horizontal") < 0)  //HorizontalのNegative Buttonが押されたら
        {
          this.transform.position += new Vector3(-0.1f, 0.0f, 0.0f);
          //左を向くためにScaleのx成分を変更
          this.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
          //AnimatorパラメーターのWalkをtrueに
          animator.SetBool("Walk", true);
        }
        else
        {
          //入力されていないときはWalkをfalseに
          animator.SetBool("Walk", false);
        }

        if(Input.GetAxis("Jump") > 0)  //JumpのPositive Buttonが押されたら
        {
          this.transform.position += new Vector3(0.0f, 0.2f, 0.0f);
          //AnimatorパラメーターのJumpをtrueに
          animator.SetBool("Jump", true);
        }
        else
        {
          //AnimatorパラメーターのJumpをfalseに
          animator.SetBool("Jump", false);
        }
    }
}

 これだけだと物理演算が処理されないので、当たり判定や重力などが反映されないため、Rigidbody2DとCollider2Dもアタッチしておきましょう。
 さらに、床として、2DオブジェクトであるSquareを生成(Hierarchyで右クリック→2D Objects→Square)し、BoxCollider2Dをつけておきましょう。
 Rigidbody、Colliderについてはこちらにまとめております。ぜひ、ご覧ください。

fineworks-fine.hatenablog.com
fineworks-fine.hatenablog.com

 下の画像のようになっていればokです。

実行して確認してみよう

 実行してうまく遷移しているか確認してみましょう。

最後に

 簡単にAnimatorの使い方についてまとめました。凝ろうと思えば、ジャンプのアニメーションに床との当たり判定をとったり、歩行とダッシュのアニメーションを分けたりなどできます。試行錯誤してみると面白いと思います。