キャラクターを歩いたり、走らせたり、いろんな動きをさせたい!
本記事の内容
・UnityのAnimator機能の概念について
・複数のアニメーションを遷移させていく設定をする方法
※ゲーム制作におけるアニメーションとはなにか、については以下の記事で解説しています。初めてゲーム制作する方はこちらも見てみてください。
キャラクターはいろんなアニメーションの組み合わせで動いている
アニメーションを組み合わせるアニメーター機能
上記の関連記事で解説しているとおり、ゲームの中を動くキャラクターや敵、背景のオブジェクトが動いたり、モーションを変えるには、アニメーションという機能を使います。
上部の記事で解説しているとおり、キャラクターがゲームの中で自由に動いているように見えるのは、キャラクターの行動に応じてアニメーションを切り替えているからです。スマブラを例にとると、こんなアニメーション遷移をしている(実際はもっと複雑だと思いますが簡略化してます...)はずです。
これを実現するのがアニメーターという機能です。名前が近いのでわかりづらいですが、「歩く」、「走る」のような一つ一つの動きがAnimationClip機能です。
「歩く」→「走る」などのAnimationClipを遷移するのが、アニメーターという違いです。
Animatorの作り方
まずはAnimationを複数作ろう
今回はこちらの無料アセットを使って解説します。
アニメーションを遷移するアニメーターを作るには、複数のAnimationClipを用意します。
今回は、「待機」、「歩き」、「攻撃」、「やられ」のAnimationClipを作りました。
AnimationClipの作り方はこちらの記事で解説しています。
遷移する条件を作ろう
遷移の条件を設計する
では次に、このAnimationClipを遷移していく条件を考えてみます。
プレイヤーが動いている間は、「歩き」モーション、攻撃ボタンを押したら、「攻撃」モーション、攻撃が当たったら「やられ」モーションとしてみましょう。
矢印が多くて一見複雑そうに見えますが、実はとてもシンプルです。何もしなければ「待機」、動きだしたら「歩き」、攻撃ボタン押したら「攻撃」、いずれの状態でも攻撃を受けたら「やれれ」という遷移をするということです。
それぞれの矢印を遷移していくには条件が必要です。今回は以下のような条件とする値で設定してみましょう。
- 何もしていないときは「待機」モーション
- キャラクターを移動させたら、「移動」モーション
- 攻撃ボタンを押したら、「攻撃」モーションに移る、攻撃が終わったら「歩き」モーションに移る
- 敵の攻撃が当たったら即「やられ」モーション、1秒後に「歩き」モーションに移る
遷移の条件を変数に割り当てる
アニメーションを遷移するためには、パラメータという機能を使い、ここに先程設計した遷移条件を作成する必要があります。
作り方は簡単です。[ウィンドウ]→[アニメーション]→[アニメーター]を選択し、アニメーターウィンドウを開きます。
画面下部に固定しておくのが、おすすめです。
パラメーターの下にある「+」ボタンを押します。
上記の表にあるようなパラメータを作ってみました。これでパラメータの設定はひとまず完了です。丸印を入れられるパラメータがTriggerで、チェックボックスを入れられるパラメータがbool型です。
今回は取り上げませんが、たとえばパラメータを、float型(小数点ありの変数)の"speed"という名前の変数とし、キャラクターの移動速度が0.1以上だったら「歩き」、2以上だったら「走り」、それ以外は「待機」といったことも可能です。
アニメーターウィンドウの見方と設定の方法
アニメーターウィンドウを開くと、Entry、AnyState、Exitという3つの箱があります。アニメーションクリップ作成済みの状態だと、このような箱が追加で出来上がっているはずです。
アニメーターウィンドウを見るときは、箱
と矢印
、この2つを意識して見てみましょう。
箱は、アニメーションを指します。歩く、攻撃といったアニメーションが箱で表現されています。箱を選択した時にインスペクタに表示されている△マークのアイコンがアニメーションの名前です。
そして、アニメーションの遷移条件、これが矢印です。
こいつが非常に大事です。
まずは、先程の設計図にある通り矢印を繋いでみます。箱を選択して右クリックすると、どの箱とどの箱を結ぶかを選択できます。
オレンジ色の箱はデフォルト(プレイして最初に実行されるアニメーション)です。アニメーションの箱を選択して、「レイヤーデフォルトとして設定」とすると、Entryから矢印が伸びてデフォルトとして設定されます。
また、最初から入っている箱の意味は下記の通りです。
- Entry:アニメーションが開始した状態で遷移する先を決めます
- AnyState:今回の「やられ」モーションのように、どのアニメーション中であっても割り込んで遷移をする場合
- Exit:アニメーションを終了させる場合に使います、小規模なアニメーションなら、そこまで使うことが無いかも
遷移条件を設定する
最後に遷移条件を設定していきます。遷移条件を設定するには、矢印を選択して、インスペクタから設定します。
Conditionが、アニメーションの遷移条件になります。上記のGIFは一部の設定だけですが、全部の矢印について設定していきます。
最終的にこのようになりました。
実際にアニメーションを遷移させてみるプログラムをAIに作成してもらう
ここまで来たらアニメーターの設定は完了です。最後にこのアニメーターを実際に遷移するプログラムをChatGPTに作成してもらいましょう。
ChatGPTへの命令文
キャラクターにアタッチする前提で、アニメーターを遷移するスクリプトを作成してください。
アニメーターは以下のパラメータを持っており、下記の条件で遷移させてください。
・attackTrigger
・isWalk(bool値)
・isDamaged(bool値)
・キーボードの移動キーを押す→移動モーションに遷移、isWalkをON。キーボード移動が終わったらisWalkをOFF ・攻撃ボタン(Space)を押す→攻撃モーションに遷移するために、attackTriggerをON
・敵オブジェクトにぶつかる→やられモーションに遷移するために、isDamagedをON
ChatGPTによって作成されたスクリプトは下記の通りです。
using UnityEngine;
public class CharacterAnimator : MonoBehaviour
{
private Animator animator;
void Start()
{
// アタッチされたAnimatorコンポーネントを取得
animator = GetComponent<Animator>();
}
void Update()
{
// 移動キーが押されているかチェック
bool isMoving = Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0;
animator.SetBool("isWalk", isMoving);
// 攻撃ボタン(Space)が押されたかチェック
if (Input.GetKeyDown(KeyCode.Space))
{
animator.SetTrigger("attackTrigger");
}
}
void OnCollisionEnter(Collision collision)
{
// 敵オブジェクトにぶつかったかチェック
if (collision.gameObject.CompareTag("Enemy"))
{
animator.SetBool("isDamaged", true);
}
}
void OnCollisionExit(Collision collision)
{
// 敵オブジェクトから離れたらダメージ状態をリセット
if (collision.gameObject.CompareTag("Enemy"))
{
animator.SetBool("isDamaged", false);
}
}
}
同じクラス名(CharacterAnimator)のスクリプトを作成して、AIが生成したコードをコピペして作成します。
そして、キャラクターにアタッチします。
この状態で再生してみましょう。キーボードの入力に応じてキャラクターのアニメーションが切り替わりました!
AnyStateを使ってやられ状態に遷移する
さいごに、ダメージを受けたらやられるモーションを取るようにしてみます。アクションゲームなどの場合は、敵オブジェクトや敵の弾に接触したことなどがトリガーになりますが、今回はボタンを押したらやられモーションに遷移させてみます。
さきほどのCharactorAnimationというスクリプトに以下のメソッドを追加してみます。
// 攻撃を受けたときの処理
public void TakeDamage()
{
// AnimatorのisDamagedパラメータをtrueに設定する
animator.SetBool("isDamaged", true);
// (オプション)ダメージを受けた状態を一定時間後にリセットしたい場合
// StartCoroutine(ResetDamage());
}
そして、適当なボタンを作り、
ボタンにこの処理を割り当てます。
これで再生して、ボタンを押してみます。すると、キャラクターがどんなアニメーションを取っていても、すぐ被ダメに行動が移るようになりました!
動きになんかラグがある・・・と思ったら
「終了時間あり」の設定を確認しよう
アニメーターの遷移を作ると、ボタンを押してから遷移するまで、少しラグがある・・・と感じることがあります。そういう場合は、「終了時間あり(hasExitTime)」を確認してみましょう。
デフォルトではONになっていますが、OFFにした方が良いケースの方が多いです。
このオプションは、「現在のアニメーションステートが完全に終了してから次のステートに遷移するかどうかを指定する」という意味です。
なので、アニメーションの動きの途中で切り替える場合(「歩き」から「待機」)は、OFFにしましょう。
一方、攻撃モーションなどは、攻撃モーションが完了してから待機状態に切り替える必要があるため、「攻撃」→「待機」への遷移する場合などは、ONにしましょう。
まとめ
Unityのアニメーター機能について、基本的な使い方を解説しました。アニメーションが自由に動くと一気にゲームとしてのクオリティが上がります!ぜひマスターしましょう!!
それでは素敵なゲーム制作ライフを!
コメント
コメント一覧 (1件)
[…] Unityでアニメーションを遷移して動かす(アニメーター機能) キャラクターを歩いたり、走らせたり、いろんな動きをさせたい! […]