Unity 3D・Animator Controllerの使い方

攻撃、走りアニメーション

 

Unityで3Dゲームを作ろう!と思ったときにどうすればいいのだろう?

Unityでキャラクターを動かすときに、アニメーターコントローラー(Animator Controller) というものがあるということはわかった!

でも、どう使えばいいんだろう?

しかしこの機能が自分の作りたいゲームにどう作用するのかわからない… このように感じる人もいるでしょう。

画面だけウィンドウだけ見ても何から手を付ければいいのかわかりづらいですよね。

 

この記事で紹介するアニメーターコントローラー(Animator Controller)の使い方を読めばだれでも、

Unity で3Dキャラをキーボード操作で歩いて移動させ、マウスの左ボタンクリックで攻撃するアニメーションを作れるようになります。

なぜならプログラミングが超ド素人の私でもキャラクターを動かせるようになったからです!

この記事ではアニメーターコントローラー(Animator Controller)の基本的な使い方を解説し、 それを使ってキャラクターをゲームマップ上で移動させる方法、マウスボタンのクリックで攻撃アクションをさせる方法をご紹介します。

キャラクターを動かせると楽しいっすよね~

そうです、「キャラクターを動かせるんだ!」という実感を持てるようになるとテンションが上がります(笑)

ゲーム開発を学習する初期段階では躓くことも多いですが、こういう場合のモチベーションを維持することも非常に大事なんですよね。

そして友人や家族にキャラクターが動いている画面を見せればドヤ顔できます!(笑)

こういう経験を積めばきっとあなたももっといろいろなものを作ってみたいと思うようになるでしょう。

それでは行ってみましょう!

 

Unity Animator Contorollerで何ができるか?

アニメーションコントローラーのウィンドウ

UnityのAnimator Contoroller(アニメーターコントローラー)を使うと、ゲームに登場するキャラクターやオブジェクトのアニメーションを簡単に作れるようになります。

アニメーターコントローラーのウィンドウ内ではアニメーションクリップはState(ステート)と呼ばれるノードとして表示されるので視覚的に管理できるようになるのです。

例えば、

棒立ちの待機状態から➡歩く➡走る➡減速➡止まる➡待機状態にもどる

棒立ちの待機状態から➡攻撃01➡攻撃02 と連撃技のコンボを発動させる

…などのようにその各ステートをつないで複数のアニメーションを組み合わせたアクションを作ることもできます。

アニメーションを作動させるのにすべてスクリプトで書いていてはたいへんです。

しかしアニメーションコントローラーを設定しておけば、スクリプト側ではアニメーションコントローラーに設定されているアニメーションを呼び出せばいいことになるので作業が楽になるのです。

Unity Animator Controllerを使う前に

それでさっそくUnityのAnimator Controller の使い方を解説していきたいところですが、

その前に、以下の物を確認しておきたいと思います。

①Unityのバージョン
②Unityバックエンドの設定
③使用するアセット

①Unityのバージョン

Unity Version 2021.1.16 

 

②Unityバックエンドの設定

今回はInput Manager, Input System Package の新旧両方をのシステムを使うのでActive Input Handling をBoth にしておきます。

後々のことを考えるとInput System Packageにしておくのがいいかと思いますが今回は練習なのでBothで進めようと思います。

設定方法はメニューバーのEdit➡Project Setting➡Player➡Active Input Handling の項目まで進み、Bothを選択します。

 

③使用するアセット

ここでは基本的なアニメーションコントローラーの使い方を解説します。

ですので走っているアニメーション、剣で攻撃するアニメーションを持つキャラクターをアセットストアから探してきます。

例えば、以下のアセットを使いました。

・Fantasy Chess RPG Character – Arthur(剣を振って戦うキャラクター)

Outdoor Ground Textures (キャラが移動している様子をわかりやすくするためのテクスチャとして設定しましたがなくても大丈夫です)

 

この記事の作成時にはFantasy Chess RPG Character – Arthurのアセットを使っていましたが、2021年9月現在ではアセットストアからなくなっていました…。
待機状態、走行、剣を振って攻撃、のアニメーションがあればいいのでDog Knight PBR Polyart などでも同様のことはできると思います。

 

Unity Animator Controllerの準備

キャラを配置

アセットをインポートできたらまずシーンビューでキャラを配置します。

地面のテクスチャはあってもなくても大丈夫です。不要だという人はPlaneを地面として置いておきましょう(笑)

次にAnimator Contoroller(アニメーションコントローラー)を用意します。

Projectウィンドウで右クリック、Create ➡ ②Animator Controller と選択していきます。

Animation Controllerを選択

作成したAnimation Controller はここではPlayer_test_Aと名付けました。

Animation Controllerが用意出来たらキャラクターを選択した状態でProjectウィンドウからマウスカーソルでドラッグ&ドロップでControllerにアタッチします。

このときキャラクターの3Dモデルにダイレクトにドロップしても、右の◎を押してファイルから選択しても大丈夫です。

Controllerに設定

Animator Controllerの初期画面ではAny State, Entry, Exitの3つのState(ステート)が配置されているだけです。

初期画面

アニメーションコントローラーのウィンドウが見えない場合はメニューバーのWindow➡Animation➡Animatorと選択すると表示されます。

アニメーションコントローラーの表示方法

 

Animation Controllerでキャラを歩かせてみる

ここからは実際にキャラクターを動かせるようにしてみます。

まずAnimation Controllerだけでキャラクターがアニメーションするところを確認し、その後スクリプトを書いて操作できるようにしていきます。

またキャラクターをアニメーションさせる方法はいくつかパターンがありますが、ここではRigidbodyも使う方法で行います。

Animation Controllerを使ってみる

最終的にキャラクターをキーボード操作で動けるようにするところまでが今回の目標ですが、先に Animation Controllerを使って実際にキャラクターが動くところを見てみましょう。

そのためにキャラクターの待機状態のアニメーションをProjectウィンドウからAnimation Controllerにドラッグ&ドロップします。

待機状態のアニメーションIdle などの名前の物が多いのでそれらしいものを見つけてましょう。

アニメーションデータのドロップ

するとEntryのステートと自動的にIdleのステートが接続されます。

これでアニメーションが設定されました。

シーンビューで再生ボタンを押すと、ポーズが変わって立った状態で少しゆらゆら動いていることがわかると思います。

 

続いて歩いているアニメーションを設定してみます。

Idleの時の同じようにWalkなど、歩きのアニメーションらしきファイルをドラッグ&ドロップします。

そのあと右クリックでSet as Layer Default State を選択します。

そうするとWalkのアニメーションが常時アニメーションとして設定されました。

歩きのアニメーション

シーンビューで再生してみると、キャラクターが歩くようになりました。

しかし、すでにお気づきのように動きのほうは歩いているように見えますが実際はその場で脚を動かしているだけで前進していませんね。

これはキャラクターが移動する設定をしていないからです。

移動の設定はアニメーションとではできませんのでここからはスクリプトの出番です。

スクリプトを実際に書いて操作してみましょう。

 

キャラクターのアニメーションがすぐに止まってしまう場合は…?

キャラクターのアニメーションが一瞬再生されたと思ったらすぐに止まってしまう場合、ループがされていないかもしれません。

Projectウィンドウで見たいアニメーションファイルを選択し、Inspectorビューを見てみましょう。

Loop Timeにチェックを入れれば同じアニメーションを繰り返すようになります。

アニメーションのループ

 

Rigidbodyとスクリプトを設定する

Rigidbodyとスクリプトを設定

Rigidbodyの設定

InspectorビューAdd Componentボタンを押しRigidbodyを選択しましょう。

Rigidbodyを使えば、物理特性でオブジェクトの動きを制御したり、スクリプトで運動を操作できるようになります。

そして今回重力は使わないのでUse Gravityのチェックは外しておきます。(①) 

 

スクリプトも用意する

同時にProjectウィンドウでスクリプトを作ります。Player_Testと名付けてキャラクターにアタッチしておきます。(②)

 

キャラクターを移動させるスクリプト

これで下準備ができました。

ではひとまずキャラクターがその場から移動できるようにしたいと思います。

スクリプトをこのように書いてみました。

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

public class PlayerTest : MonoBehaviour
{
    private float x;
    private float z;
    public float Speed = 1.0f;

    private Rigidbody rb;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        x = Input.GetAxisRaw("Horizontal");
        z = Input.GetAxisRaw("Vertical");

        rb.velocity = new Vector3(x, 0, z) * Speed;
    }
}

 

x, z 平面を移動する、Rigidbodyの設定を取得してそれに沿って操作される…のようなことが書いてあるわけですが、要するにこのような感じで動きます。

 

キーボードのWASDおよび↑→↓←の方向キーを押すと移動するようにはなりましたが、キャラが直立した状態でスライドしていますね。

(地面が移動しているわけではなく、キャラのほうが動いているのです。わかりづらいかもしれませんが…。)

このままでは明らかに不自然なのでAnimation Controllerと組み合わせて歩いていると見えるようにしましょう。

 

Animator Controllerでアニメーションデータを設定する

Idle,Walkの接続

Animator ControllerウィンドウでIdleとWalkのアニメーションステートを画像のように相互にベクトルで接続します。

(下のほうにAttackのステートもありますがこれはあとで使います。)

 

Animator ControllerウィンドウとInspectorで以下画像のように設定します。

Walk設定A

Idle➡Walkをつなぐベクトルを選択し、(選択すると青くなる)

② +を押してFloatを選択、Walkという名前に変更

③Has Exit Time チェックを外す

④Transition Offset を0にする

⑤Conditionsで+ボタンを押しWalkを選択、Greaterを0.01にする

 

また、若干面倒ですがもう一つ以下の画像のように設定します。

Walk設定B

Walk➡Idleをつなぐベクトル(さっきと逆方向)を選択し、

② Float、Walkは設定済なのでスルー、

③Has Exit Time チェックを外す

④Transition Offset を0にする

⑤Conditionsで+ボタンを押しWalkを選択、今度はLessを0.01にする

ここまででAnimator Controllerのほうの歩きアニメーションの設定はできました。

続いて次のセクションでスクリプトのほうにも手を加えていきます。

Animator Controllerで歩くアニメーション

スクリプトのほうで以下の設定をします。

・キャラクターが押したキーボードの方向に向きを変えるようにする

・Animator Controllerで設定したアニメーションを呼び出す

先ほど書いたキャラが移動するだけのスクリプトに加え、以下のようにいくつか書き足しました。

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

public class PlayerTest : MonoBehaviour
{
    private float x;
    private float z;
    public float Speed = 1.0f;
    private Vector3 latestPos;

    private Rigidbody rb;
    private Animator animator;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();   //アニメーターコントローラーからアニメーションを取得する
    }

    // Update is called once per frame
    void Update()
    {
        x = Input.GetAxisRaw("Horizontal");
        z = Input.GetAxisRaw("Vertical");

        Vector3 diff = transform.position - latestPos;           //Playerの位置座標を毎フレーム最後に取得する
        latestPos = transform.position;             //Palyerの位置座標を更新する 

        rb.velocity = new Vector3(x, 0, z) * Speed;       //歩く速度  
        animator.SetFloat("Walk", rb.velocity.magnitude);        //歩くアニメーションに切り替える

        if (diff.magnitude > 0.01f)
        {
            transform.rotation = Quaternion.LookRotation(diff);  //キーを押した方向を向くようにする
        }
    }
}

 

これでキーを押した方向にキャラクターが向きを変えて歩いて移動するようになります。

このような感じですね。

 

歩くのが遅いと感じた場合、Inspector上で数値の設定ができるようになっていますのでお好みで数字を入れて設定してみて下さい。

歩きの速度設定

 

 

これでアニメーションコントローラーとスクリプトでキャラクターが歩けるようになりました。

続いて持っている剣で攻撃をさせてみましょう。

 

Animator Controllerで攻撃アニメーションをさせる

ここではマウスの左ボタンクリックで攻撃アニメーションができるようにします。

もう一度Animator Controllerの設定をし、スクリプトも少し書き足していきます。

Animator ControllerでAttackアニメーションの設定

ではAnimator Controllerの設定をしましょう。

下記の画像のように設定します。

攻撃アニメーション設定A

Idle➡Attackをつなぐベクトルを選択し、

② +を押してTriggerを選択、Attackという名前に変更

③Has Exit Time チェックを外す

④Transition Offset を0にする

⑤Conditionsで+ボタンを押しAttackを選択

この設定をWalk➡Attackをつなぐベクトルでも行います!
画像は必要ないかと思いますのでやってみてください!

そしてもう一つ、若干ややこしいのですがAttack➡Idleのベクトルで少し違うことをします。

以下の画像のようにします。

攻撃アニメーション設定B

Attack➡Idleをつなぐベクトルを選択し、

②Triggerは設定済なのでスルー

③Has Exit Time チェックは入れたまま

④Transition Offset もそのまま

⑤Conditionsは何もしない

違うことをすると書きましたが、特に何もしない、ということですね(笑)

AttackアニメーションからIdleに戻るときに少し時間を置くのと、

⑤のConditionsに何か設定すると動きがおかしくなります。

例えばAttackを設定してしまうと一度攻撃した後にずっと攻撃し続ける‥のようになります。

そのためEmptyのままでOKです。

 

マウスのボタンクリックで攻撃アニメーションをさせるスクリプト

マウスクリックで攻撃アニメーションに遷移できるようにしました。

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

public class PlayerTest : MonoBehaviour
{
    private float x;
    private float z;
    public float Speed = 1.0f;
    private Vector3 latestPos;

    private Rigidbody rb;
    private Animator animator;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();   //アニメーションを取得する
    }

    // Update is called once per frame
    void Update()
    {
        x = Input.GetAxisRaw("Horizontal");
        z = Input.GetAxisRaw("Vertical");

        Vector3 diff = transform.position - latestPos;           //Playerの位置座標を毎フレーム最後に取得する
        latestPos = transform.position;             //Palyerの位置座標を更新する 

        rb.velocity = new Vector3(x, 0, z) * Speed;       //歩く速度  
        animator.SetFloat("Walk", rb.velocity.magnitude);        //歩くアニメーションに切り替える

        if (diff.magnitude > 0.01f)
        {
            transform.rotation = Quaternion.LookRotation(diff);  //キーを押した方向を向くようにする
        }

        if (Input.GetMouseButtonDown(0))
        {
            animator.SetTrigger("Attack");    //マウスクリックで攻撃モーション
        }
    }
}

 

Input.GetMouseButtonDown(0) でAnimator ControllerのAttackアニメーションを呼び出すようになっています。

キャラクターのアニメーションはこのようになります。

これでキャラクターがゲームマップ上をキーボード操作で歩いて移動し、マウスの左ボタンクリックで攻撃するアニメーションができました!

これで敵や他のマップ用のオブジェクト配置したりすればアクションゲームっぽい雰囲気が演出できると思います。

またこのままだとキャラクターが攻撃している間も方向キーを押していると滑っているように見えていますが、これはのちのち修正していこうと思います。

今後もダメージを受けるアニメーションやHPゲージなども設定し、よりゲームらしい雰囲気を出していこうと思います。

 

Unity Animator Controllerで楽しいゲームを作ろう!

今回はUnityのAnimator Controllerの使い方を解説しました。

途中の設定は少し手間かもしれませんが慣れてしまえばいろいろなアニメーションと組み合わせることができます。

最初のほうにも書きましたがキャラクターがマップ上で動いているのを見ると、いかにもゲームを作っているんだ、という実感がわいてきてモチベーションも上がるのではないかと思います。

Animator Controllerがうまく使えるようになるとこれを応用して格闘ゲームやスポーツ系のゲームも作れそうですね。

アイデア次第であなたがこれまでプレイした経験のあるゲームに近いものもか、またはそれ以上の物も作れるかもしれません(笑)。

ぜひ今後のゲーム制作に活かしてみて下さい!

 

 

 

 

攻撃、走りアニメーション
最新記事をチェックしよう!