single.php

Unity でプレイヤーの移動にアニメーションを適用する手順(その1)

Unityで、スプライト画像をプレイヤーなどGameObjectの移動アニメーションなどに適用する手順を備忘録的に投稿します。

スプライト用画像の準備

プレイヤーの移動用アニメーションに使う画像を準備します。別々の画像にするのも可能ですが、スプライト機能で使える1枚の画像に並べた方が作業が効率的になります。

今回は、128×128の画像にしたので8方向と3状態(停止、歩く、走る)で2つの絵柄でアニメーションさせる設計なので、合計で48種類の画像を並べた1つの画像ファイルを作成しています。

こんな感じで方向を縦軸に、状態を横軸にして幅768(128×6)、高さ1024(128×8)の画像になりました。

画像は、Unityのプロジェクトにドラッグしてスプライトかしておきます。

[インスペクター]画面[Pixel Per Unit]を画像の横幅(今回は128)に変更して[Open Sprite Editor]でスプライト設定を、128×128で分割するように設定します。

スプライト画像のアニメーション設定

スプライトかした画像を方向と状態に分けてアニメーション化していきます。8方向で3状態で準備しているので合計で24回という骨の折れる作業ですが、説明では1方向に抜粋しています。

具体的には、次の方法でアニメーション用のファイルを作成します。

1. 追加したスプライト画像を展開して、並んで表示された画像の1番目と2番目を選択して[階層]画面にドラッグします。

2.[Create New Animation]画面で “Player_Idle_Down.anim” に名前を変更して保存します。

3.[プロジェクト]画面にアニメーション用のアセット[Player_Idle_Down]が追加されます。

4.[階層]に追加されたGameObjectは[Player]に変更します。

5. 同様の作業で3番目と4番目を選択して[Player_Walk_Down]、5番目と6番目を選択して[Player_Run_Down]としてアセットを追加します。

6.[階層]画面に追加した[Player]以外のGameObejctは不要なので削除します。

GameObjectにアニメーションの追加

階層に追加したPlayer(GameObject)にアニメーション用のアセットを追加します。

具体的には、次の手順でアセットの設定を行います。

1.[階層]画面で[Player]を選択して[インスペクター]画面の[Animetor]コンポーネントの[Controller]をダブルクリックします。

2.[Entry]や[Player_Idle_Down]などのノードが追加された[Animetor]が表示されます。(ノードの名前が “New Animation” などの場合は[インスペクター]画面で変更してください)

3.[Animetor]画面の左側の[Parameters]をクリックしてから[+]を選択してFloat型の変数[Speed]を追加します。

4.[プロジェクト]画面の[Player_Walk_Down]と[Player_Run_Down]をドラッグしてノードを追加します。

5.[Player_Idle_Down]ノードを右クリックして表示されたポップアップメニュー[Make Transition]を選択します。

6. マウスポインターに追加された線ををドラッグして[Player_Walk_Down]ノードに接続します。同様の操作で下の画像のように各ノードを接続します。

7. 追加した矢印線を選択して[インスペクター]画面で[Has Exit Time]を無効(チェックを外す)、[Conditions]に[Speed]変数を追加して[ >(Greater)0.1]を設定します。

8. 同様の操作で他の矢印線の設定を追加します。

・Idle => Walk (Has Exit Timeのチェックを外し、Conditionsに Speed > 0.1 を追加)
・Walk => Idle (Has Exit Timeを外し、Conditionsに Speed < 0.1 を追加)
・Walk => Run (Conditionsに Speed > 2.0)
・Run => Walk (Conditionsに Speed < 2.0)
・Run => Idle (Conditionsに Speed < 0.1)

9. C# スクリプト[PlayerController]を追加して、次のコードに変更します。

using UnityEngine;
using UnityEngine.InputSystem; 

public class PlayerController : MonoBehaviour
{
    public float walkSpeed = 3f;
    public float runSpeed = 6f;
    
    private Rigidbody2D rb;
    private Animator animator;
    private Vector2 moveInput;
    private float currentSpeed;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        rb.freezeRotation = true; 
    }

    void Update()
    {
        Vector2 input = Vector2.zero;
        if (Keyboard.current != null)
        {
            if (Keyboard.current.wKey.isPressed || Keyboard.current.upArrowKey.isPressed) input.y = 1;
            if (Keyboard.current.sKey.isPressed || Keyboard.current.downArrowKey.isPressed) input.y = -1;
            if (Keyboard.current.aKey.isPressed || Keyboard.current.leftArrowKey.isPressed) input.x = -1;
            if (Keyboard.current.dKey.isPressed || Keyboard.current.rightArrowKey.isPressed) input.x = 1;
        }
        
        moveInput = input.normalized;

        bool isRunning = false;
        if (Keyboard.current != null)
        {
            isRunning = Keyboard.current.leftShiftKey.isPressed && moveInput.magnitude > 0;
        }

        currentSpeed = isRunning ? runSpeed : (moveInput.magnitude > 0 ? walkSpeed : 0f);

        float animatorSpeedParam = isRunning ? 2.5f : (moveInput.magnitude > 0 ? 1f : 0f);
        animator.SetFloat("Speed", animatorSpeedParam);
    }

    void FixedUpdate()
    {
        rb.linearVelocity = moveInput * currentSpeed;
    }
}

10.[Player]の[インスペクター]画面に、C#スクリプト[PlayerController]をドラッグして追加します。

11. 必要に応じて[Rigidbory 2D][Box Collider 2D]などのコンポーネントも追加します。

実行すると、キー操作でアニメーションが再生されるようになります。(今回の手順では下方向のアニメーションのみ再生されます)

まとめ

今回はUnityで、スプライト画像をプレイヤーなどGameObjectの移動アニメーションなどに適用する手順を書きました。

スプライト画像にしても、方向や状態などでアニメーションさせるために、少し多くの手順が必要になりますが、[Animation]機能を利用して、スプライト画像から画像を切り出してプレイヤーの操作に応じて適切なアニメーションを再生することができます。

Unityでプレイヤーの移動などでアニメーション処理がしたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です