ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity学習#6 (Unity 2019.4.1f1) キャラクターのアニメーション処理

今回は十字キーで入力した方向にキャラクターが向く、歩く(アニメーション処理)に挑戦しました。
Animation と Animation Controller を使います。慣れれば直感的ですが、初心者には少しクセがあるように感じました(本投稿でまとめてあります)。

アニメーション用の画像を分割する処理は省略します。
オリジナリティを出すよりも、まず最低限ゲームとして完成させたいため、画像はAsset Storeから借りたものを使うことにしています(以前の記事を参考:Unity学習#4

構成

キャラクターをキー操作に応じてアニメーションを切り替える設定は、
それぞれの方向を向いている時のアニメーション(Animation)、アニメーションの切り替え(Animation Controller/Animator)、アニメーションを切り替えるオブジェクトで構成されます。アニメーションの切り替え(Animation Controller/Animator)の設定画面で、今どの方向を向いているかの状態を、Blend Treeという状態遷移図で管理します。
(図)

キャラクターの十字キーが、アニメーションの切り替えに伝達して、アニメーションが切り替わるまでの伝達経路は、以下のようになっています。
キー操作 → Animation Controller の Parameter → Animation Controller の状態を変更 → 状態毎に割り当てられたモーション (Animation) を再生
(図)

アニメーション(Animation)、アニメーションの切り替え(Animation Controller/Animator) は、それぞれ設定する順番が決まっていて、特にアニメーション(Animation)は、順番を守らないとキャラクターの画像を配置できませんので、その点注意が必要です。最初は手順が多く感じますが、分かってしまえば簡単かつ直感的で、感動すら覚えます。さすがUnityです。

今回は、第2回で作成したPlayerオブジェクトを、人型の画像に差し替えて、十字キーでキャラクターの向きを変えられるようにします。

準備

画像を準備する(省略)

画像を分割する(省略)

Animation Controller を作成する

Animation Controller オブジェクトの作成

(1) Projectウィンドウ > Assets を選択(作成場所の選択)
(2) Project > +▼ > Animator Controller を選択
(3) 新しいオブジェクトに名前を付けます
(今回はPlayer用のアニメーションなので、「Player」と名前を付けました)
(図)

オブジェクトへのアタッチ

(1) Hierarchyウィンドウで、アニメーションを付けたいオブジェクトを選択
(2) Projectウィンドウに作られた先ほどのAnimation Controllerを、Inspectorウィンドウへドラッグ&ドロップ
(今回は、Animation Controller「Player」を、第2回で作成してあった「Player」オブジェクトにアタッチしました。)
(図)

Animation Controller の設定

Animation Controller は、操作パネルから入力を受け付け、入力によってアニメーションを切り替えるための設定ができます。入力の受付をParameter、アニメーションの切り替えをLayersで行います。

Animatorウィンドウを開く

(1) Projectウィンドウで、先ほど作成したAnimation Controllerオブジェクトを選択
(2) Inspectorウィンドウで、Animation Controllerオブジェクト名の右にある「Open」ボタンをクリック
→Animatorウィンドウが表示されます(すでに表示されていれば何も起こりません)
(図)

入力設定 (Parameterタブ)

(1) Animatorウィンドウから、Parametersタブを選択
(2) +▼ > Float を選択
(3) パラメータの名前を入力
(今回は、XとYの入力値を受け取るため、dirX、dirYの2つを作成)
 ※作成したパラメータは、この後Layersに割り当てる必要があります。

アニメーションの切り替え設定 (Layersタブ)

状態遷移図の作成 (Blend Tree)

(1) Animatorウィンドウから、Layersタブを選択
(2) いくつかの箱が描画されているウィンドウを1回クリックし、ウィンドウが選択された状態にします。
(3) 画面上で右クリック > Create State > From New Blend Tree を選択
→新しい状態「Blend Tree」が作成されました。
※Blend Treeは複数の状態を一つにまとめるための大きい一つの状態定義です。

状態(Blend Tree)に名前を付ける

Blend Tree は、何の状態を表しているか分かるように、名前を付けます。
(1) 新しく作成された Blend Tree を1回クリック
(2) Inspectorウィンドウから名前を変更
(ここでは、Walk としておきます)

状態(Blend Tree)の設定

次に、Blend Treeの設定をします。
(1) 先ほど作成した Blend Tree をダブルクリック
→Animatorウィンドウのパンくずリストが Base Layer > Blend Tree に変わります
(図)
(2) 上記の状態で、Animator画面の余白を1回クリック
→InspectorウィンドウがBlend Treeの設定画面に変わります。
(図)
(3) Blend Type を 2D Simple Directional に変更します
(4) Parameter に、先ほど作成した2つのパラメータを割り当てます
(5) Motion欄 に4つのモーションを追加します:
 Motion欄の +▼ > Add Motion Field を選択
 これを4回繰り返します。
(図)

Animator の Inspectorウィンドウの設定は一旦ここまでで、次に各方向を向いている時のキャラクターアニメーションを作成していきます。

Animationを作成する

Projectウィンドウで、Assets が選択された状態で、
(1) Projectのすぐ下にある +▼ > Animation を選択します。
(2) 確定する前に、新しいアニメーションの名前を入力します。
(ここでは、正面、背面、右向きの3つのアニメーションを作成しますので、それぞれ、Player_front、Player_back、Player_right と名前を付けました)
(図)

Animationの設定

Animationは、Animation Controller にアサインされていない状態では、アニメーション設定ができません。そのため、先にAnimation を Animation Controller (Animator) と連結します。

Animation を Animation Controller (Animator) と連結する

(1) Projectウィンドウから、先ほどアタッチしたAnimation Controller (Animator) をダブルクリックします。
→ Animatorウィンドウが開きます(すでに開いている場合は何も起きません)
(2) 先ほどと同じ要領で、Blend Treeをダブルクリック > Animatorウィンドウ画面の空白部分を1回クリックし、InspectorウィンドウをBlend Treeの設定画面にします。
(3) 先ほど作成した3つのアニメーション(Animation)を、Blend TreeのMotion欄にドラッグ&ドロップします。
(今回は、右向きのアニメーションから左向きのアニメーションを作りますので、右向きのアニメーションは2か所にドラッグ&ドロップします)
(図)

Animation Controller (Animator) に、各 Animation の適用条件を設定する

それぞれのモーションの Pos X、Pos Y を、それぞれ以下の値にします。

Motion Pos X Pos Y
正面 0 -1
背面 0 1
右向き 1 0
(左向き) -1 0

(図)

動作原理はまだ理解不足なのですが、おそらく先ほどの2つのパラメータの値(ここではdirX、dirY)を使って、PosX、PosYとの距離が一番近い Motion (Animation) を適用する、または一番最後に適用した Motion (Animation) を適用し続ける、といった動きをしているのではないかと思われます。

Animationに画像を配置する

上記の設定が終わると、やっと各 Animation の設定が可能になります。
(1) Projectフォルダから、Animationオブジェクトをダブルクリックします
(2) Animationウィンドウが開きます
(3) タイムラインが書かれたウィンドウ上に、画像を配置します
※配置できるのは、オブジェクト名:Sprite と書かれた枠(少し濃いグレー)の枠内だけです。
※画像は、横▼マークがついているものでも、ついていないものでも配置できます。
(4) 配置が終わったら、Animationウィンドウ内の再生ボタンを押します
→Sceneビュー、またはGameビュー上でキャラクターがアニメーションしているのを確認できます
(5) タイムライン上の配置間隔を調節することで、アニメーションを早くしたり、遅くしたりできます

十字キーをAnimation Controllerに渡す

最後に、十字キーの入力を、Animation Controller の先ほどの2つのパラメータに渡す処理を追加します。
コード

public class Player : MonoBehaviour
{
    private float speed;
    private Vector2 input, scale;
    private Rigidbody2D rigidBody;
    private Animator animator;
    
    // Start is called before the first frame update
    void Start()
    {
        speed = 0.1f;
        rigidBody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        Debug.Log("Start");
    }
    
    void Update()
    {
        input = new Vector2(
            Input.GetAxis("Horizontal"),
            Input.GetAxis("Vertical")
        );
    }
    
    private void FixedUpdate() {
        if (input == Vector2.zero){
            return;
        }
        rigidBody.position += input * speed;
        
        // キャラクターの左右反転
        scale = this.transform.localScale;
        if( input.x > 0 ){
            scale.x = 1;
        } else if( input.x < 0 ){
            scale.x = -1;
        }
        this.transform.localScale = scale;
        
        // アニメーション方向決定
        animator.SetFloat("dirX", input.x);
        animator.SetFloat("dirY", input.y);
    }
}

これで十字キーを入力すると、入力した方向にキャラクターが歩く動作をし続けるようになりました。