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 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 (キャラが移動している様子をわかりやすくするためのテクスチャとして設定しましたがなくても大丈夫です)
待機状態、走行、剣を振って攻撃、のアニメーションがあればいいのでDog Knight PBR Polyart などでも同様のことはできると思います。
Unity Animator Controllerの準備
アセットをインポートできたらまずシーンビューでキャラを配置します。
地面のテクスチャはあってもなくても大丈夫です。不要だという人はPlaneを地面として置いておきましょう(笑)
次にAnimator Contoroller(アニメーションコントローラー)を用意します。
Projectウィンドウで右クリック、①Create ➡ ②Animator Controller と選択していきます。
作成したAnimation Controller はここではPlayer_test_Aと名付けました。
Animation Controllerが用意出来たらキャラクターを選択した状態でProjectウィンドウからマウスカーソルでドラッグ&ドロップでControllerにアタッチします。
このときキャラクターの3Dモデルにダイレクトにドロップしても、右の◎を押してファイルから選択しても大丈夫です。
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の設定
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でアニメーションデータを設定する
Animator ControllerウィンドウでIdleとWalkのアニメーションステートを画像のように相互にベクトルで接続します。
(下のほうにAttackのステートもありますがこれはあとで使います。)
①Idle➡Walkをつなぐベクトルを選択し、(選択すると青くなる)
② +を押してFloatを選択、Walkという名前に変更
③Has Exit Time チェックを外す
④Transition Offset を0にする
⑤Conditionsで+ボタンを押しWalkを選択、Greaterを0.01にする
また、若干面倒ですがもう一つ以下の画像のように設定します。
①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); //キーを押した方向を向くようにする } } }
これでキーを押した方向にキャラクターが向きを変えて歩いて移動するようになります。
このような感じですね。
これでアニメーションコントローラーとスクリプトでキャラクターが歩けるようになりました。
続いて持っている剣で攻撃をさせてみましょう。
Animator Controllerで攻撃アニメーションをさせる
ここではマウスの左ボタンクリックで攻撃アニメーションができるようにします。
もう一度Animator Controllerの設定をし、スクリプトも少し書き足していきます。
Animator ControllerでAttackアニメーションの設定
ではAnimator Controllerの設定をしましょう。
下記の画像のように設定します。
①Idle➡Attackをつなぐベクトルを選択し、
② +を押してTriggerを選択、Attackという名前に変更
③Has Exit Time チェックを外す
④Transition Offset を0にする
⑤Conditionsで+ボタンを押しAttackを選択
この設定をWalk➡Attackをつなぐベクトルでも行います!
画像は必要ないかと思いますのでやってみてください!
そしてもう一つ、若干ややこしいのですがAttack➡Idleのベクトルで少し違うことをします。
以下の画像のようにします。
①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がうまく使えるようになるとこれを応用して格闘ゲームやスポーツ系のゲームも作れそうですね。
アイデア次第であなたがこれまでプレイした経験のあるゲームに近いものもか、またはそれ以上の物も作れるかもしれません(笑)。
ぜひ今後のゲーム制作に活かしてみて下さい!