AnimatorControllerを使って動くキャラクターを作ろう！

この記事は東京海洋大学NePPのAdvent Calendar 2024の10日目です

# はじめに
今回はUnityでAnimatorContorollerを利用して、待機と移動モーションが切り替わるようなキャラクターを実装していきたいと思います
完成品は以下のようになります
![Videotogif(4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/d2f0edc1-5dd9-b928-4972-f7fccf4aa341.gif)
待機モーションから始まって、Wキーを押下すると前方に移動して、離すと待機モーションに戻ります

# モーション
今回、モーションのクリップは[mixiamo](https://www.mixamo.com/)というサイトからダウンロードして使っていきます
使用するクリップは待機モーションと移動モーションです。お好みの物をダウンロードしてご利用ください
![スクリーンショット 2024-12-30 004159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/72cfb52a-47ba-e7b0-3b02-a3cb349cb050.png)

ダウンロードはサイト右上のDownLoadから行えますがその時に出てくるDOWNLOAD SETTINGSは以下のようにしてください。ForMatをFBX for Unity(.fbx)に、SkinをWithout Skinに変更します
![スクリーンショット 2024-12-30 004130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/79789370-fc9d-553a-58fb-66353e8158d8.png)

AnimatorControllerの設定とスクリプトを書く前に、ダウンロードしたクリップをUnityにインポートするのですがクリップにひと手間加える必要があります
まずインポートしたクリップを選択してRigのタブを選択します。そこでAnimation TypeがGenericになっていると思うのですがこれをHumanoidに変更してください
![スクリーンショット 2024-12-30 001347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/84db2282-5f66-90f5-59ee-6b28abaa9d7a.png)
次にAnimationのタブから LoopTimeのチェックボックスにチェックを入れてください
![スクリーンショット 2024-12-30 010216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/f1b71d33-b9cd-a48e-5408-3a2c68c65132.png)

下処理はこれで完了です

# AnimatorController
まずはAnimatorControllerを作成します
![スクリーンショット 2024-12-29 233732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/2b289be9-5ed8-2951-3600-41ee9a76993b.png)

そうするとこのような画面が出てきます
ここにモーションクリップをいろいろ置いて行ってアニメーションの遷移図を作成していきます

![スクリーンショット 2024-12-29 233810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/ad30fbf7-b8be-73fc-0d38-a244b94642d6.png)

インポートしたクリップをそのままドラッグアンドドロップで配置できます。mixiamoから取ってきたクリップだと名前が最初Mixiamo.comみたいになってるのでそこはいい感じの名前に変更します（今回はWaitとMove）
![スクリーンショット 2024-12-30 004835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/b6202f7c-38ac-c7c8-3659-e17a6fac0689.png)

それぞれのステートを右クリックしてMake Transitionしてステート同士をつなげます
![スクリーンショット 2024-12-29 235805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/bc95e95a-a429-2de5-f81c-e06dd825e754.png)

今回はこんな形にします
![スクリーンショット 2024-12-30 005234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/244f5896-823c-46a4-76d0-3da83716ad01.png)

次に画面左側にあるParametersの＋からパラメータを作ります。今回はBool型のIsMoveというパラメータを用意します。IsMoveがtrueの時は移動モーション、falseの時には待機モーションという感じです
![スクリーンショット 2024-12-30 001510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/23abc1b4-a843-9058-7662-18c862b3d7f8.png)

次にモーション同士の遷移条件を設定します
WaitとMoveステートの間の矢印をクリックすると画面左側にこんな画面が出ると思うのでConditionsから遷移条件を設定します。WaitからMoveに向かう矢印の中ではIsMoveを選択しtrueに、その逆ではIsMoveを選択してfalseにしておいてください
またどちらの矢印でもHas Exit Timeのチェックは外しておいてください。これはクリップの再生が途中の時にアニメーションの遷移条件が満たされた時でも最後までクリップを再生してから遷移させるためのものですが待機→移動、移動→待機のどちらにおいてもクリップを最後まで再生する必要はなく、条件が満たされたら速やかに次のクリップの再生に移ってほしいからです
![スクリーンショット 2024-12-30 005605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/fff26058-606a-bda3-e329-5f4a466e08e6.png)

これでアニメーションコントローラーの設定はできました

# スクリプト
    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にしています

# 完成
![Videotogif(4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/216949a4-bf39-64b7-ec97-50febac250eb.gif)

# 終わりに
SetBoolとかでパラメーターいじるところとかは直接変数名をべた書きしているのですが個人的には変数名が変わったときに一々変更しに行かないといけなくなってしまうので、パラメーター名を管理するクラスみたいなのを作ってそこから名称を入力、みたいな実装にしたいのですが実現できていません。アニメーターコントローラーからパラメーター名の一覧を取得するエディター拡張みたいなのを作れば行けるのか？
![Videotogif(5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/67f824a3-64a8-874c-1654-6cd47cb2f2aa.gif)