今回はUnityでトップダウン式2Dゲームを作成する際に使えそうな、上下左右の移動アニメーション作成していきます。
はじめに
Unityのバージョンは2021.3.14f1で作成しています。
下記のように上下左右に移動するときのアニメーションを実装していきます。

事前準備
まずはアセットストアから素材を入手。

dileフォルダとwalkフォルダを選択してインポートしておきます。

インポートした画像をすべて選択して、「PixelsPerUnit」を10に変更しておきます。

実装開始
ここから実際に作成していきます。
プレイヤーの作成
まずは後ろ向きの画像をSceneにドラッグアンドドロップします。

名前をPlayerに変更して、AddComponentから「Animator」を追加しておきます。

Assetsフォルダ内で右クリック、「AnimatorController」を作成します。

Controllerにくっつけておきます。

アニメーションクリップの作成
アニメーションウィンドウを開いて、アニメーションクリップを作成します。「Create」を選択。

停止状態のアニメーションクリップ
上下左右、それぞれの停止状態のクリップを作成するので、「idle_back」、「idle_front」、「idle_right」、「idle_left」の4つを「CreateNewClip…」から作成します。

対応する画像をそれぞれドラッグアンドドロップします。下記は後ろ向きの場合。

左向きの画像はないので、「idle_left」は右向きの画像を反転させます。「AddProperty」から「FilpX」を追加してチェックします。


歩くアニメーションクリップの作成
同じようにwalkのクリップも4つ作成します。

対応する画像をすべて選択してドラッグアンドドロップします。

下記記事では「左右の移動」に絞ってアニメーションの作成を実装しているので、参考になるかと思います。
待機状態のブレンドツリーの作成
Animatorを開くと、下記のように8つのアニメーションクリップがあります。

8つ全てを削除し、右クリックして「FromNewBlendTree」を選択します。

追加したブレンドツリーの名前をidleTreeに変更。Parametersにfloat型でXとY、bool型でisWalkingを追加します。

idleTreeをダブルクリックして、ブレンドタイプを「2DsimpleDirectional」に変更。ParametersをXとYに、モーションを追加して4つにします。

各モーションにアニメーションクリップを割り当てます。Xが横方向、Yが縦方向です。

停止スクリプトの作成
下記スクリプトを作成してPlayerにアタッチします。
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
private Animator anim;
private Vector2 movement;
private float speed = 5.0f;
private void Awake()
{
anim = GetComponent<Animator>();
}
private void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
if (movement != Vector2.zero)
{
anim.SetFloat("X", movement.x);
anim.SetFloat("Y", movement.y);
}
}
}
キー入力でmovement変数に値を代入し、movement変数をアニメーターのパラメータにそのままセットしているという感じですね。
試しに実行してみて、上下左右キーを押してみます。現時点では待機状態しか設定していないので、下記のようにキャラクターの向きが変わればOK。

歩くアニメーションの実装
ブレンドツリーをコピーしてwalkも同じように作成します。

idle Treeで右クリックして「MakeTransition」を選択。
停止状態から歩く状態への移動はisWalkingがtrueの時とします。また、Settingsを下記のように変更しておきます。反対方向(歩く状態から停止状態)はisWalkingがfalseの時でセットしておきます。

移動スクリプトの作成
最後にスクリプトを作成してPlayerオブジェクトに突っつければ完成です。スクリプト名はPlayerMovingにして中身は下記の様に変更。
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
private Rigidbody2D _rb;
private Animator anim;
private Vector2 movement;
private float speed = 5.0f;
private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
private void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
anim.SetBool("isWalking", movement != Vector2.zero);
if (movement != Vector2.zero)
{
anim.SetFloat("X", movement.x);
anim.SetFloat("Y", movement.y);
}
}
private void FixedUpdate()
{
_rb.MovePosition(_rb.position + movement.normalized * speed * Time.fixedDeltaTime);
}
}
スクリプト変更後、PlayerにAddComponentからRigidBody2DをアタッチしGravityを0にします。
実行してキー入力でキャラクターが動けばOK
