この記事は東京海洋大学NePPのAdvent Calendar 2024の10日目です
はじめに
今回はUnityでAnimatorContorollerを利用して、待機と移動モーションが切り替わるようなキャラクターを実装していきたいと思います
完成品は以下のようになります
待機モーションから始まって、Wキーを押下すると前方に移動して、離すと待機モーションに戻ります
モーション
今回、モーションのクリップはmixiamoというサイトからダウンロードして使っていきます
使用するクリップは待機モーションと移動モーションです。お好みの物をダウンロードしてご利用ください
ダウンロードはサイト右上のDownLoadから行えますがその時に出てくるDOWNLOAD SETTINGSは以下のようにしてください。ForMatをFBX for Unity(.fbx)に、SkinをWithout Skinに変更します
AnimatorControllerの設定とスクリプトを書く前に、ダウンロードしたクリップをUnityにインポートするのですがクリップにひと手間加える必要があります
まずインポートしたクリップを選択してRigのタブを選択します。そこでAnimation TypeがGenericになっていると思うのですがこれをHumanoidに変更してください
次にAnimationのタブから LoopTimeのチェックボックスにチェックを入れてください
下処理はこれで完了です
AnimatorController
そうするとこのような画面が出てきます
ここにモーションクリップをいろいろ置いて行ってアニメーションの遷移図を作成していきます
インポートしたクリップをそのままドラッグアンドドロップで配置できます。mixiamoから取ってきたクリップだと名前が最初Mixiamo.comみたいになってるのでそこはいい感じの名前に変更します(今回はWaitとMove)
それぞれのステートを右クリックしてMake Transitionしてステート同士をつなげます
次に画面左側にあるParametersの+からパラメータを作ります。今回はBool型のIsMoveというパラメータを用意します。IsMoveがtrueの時は移動モーション、falseの時には待機モーションという感じです
次にモーション同士の遷移条件を設定します
WaitとMoveステートの間の矢印をクリックすると画面左側にこんな画面が出ると思うのでConditionsから遷移条件を設定します。WaitからMoveに向かう矢印の中ではIsMoveを選択しtrueに、その逆ではIsMoveを選択してfalseにしておいてください
またどちらの矢印でもHas Exit Timeのチェックは外しておいてください。これはクリップの再生が途中の時にアニメーションの遷移条件が満たされた時でも最後までクリップを再生してから遷移させるためのものですが待機→移動、移動→待機のどちらにおいてもクリップを最後まで再生する必要はなく、条件が満たされたら速やかに次のクリップの再生に移ってほしいからです
これでアニメーションコントローラーの設定はできました
スクリプト
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
[SerializeField] Animator _anim;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Update()
{
if (Input.GetKey(KeyCode.W))
{
_anim.SetBool("IsMove", true);
}
if(Input.GetKeyUp(KeyCode.W))
{
_anim.SetBool("IsMove", false);
}
}
}
アニメーターコントローラー内のbool型のパラメーターにアクセスして変更するにはSetBoolを利用します
Wキーが押下されている間はIsMoveをtrueに、離されたタイミングでfalseにしています
完成
終わりに
SetBoolとかでパラメーターいじるところとかは直接変数名をべた書きしているのですが個人的には変数名が変わったときに一々変更しに行かないといけなくなってしまうので、パラメーター名を管理するクラスみたいなのを作ってそこから名称を入力、みたいな実装にしたいのですが実現できていません。アニメーターコントローラーからパラメーター名の一覧を取得するエディター拡張みたいなのを作れば行けるのか?