1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-12-29

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

はじめに

今回はUnityでAnimatorContorollerを利用して、待機と移動モーションが切り替わるようなキャラクターを実装していきたいと思います
完成品は以下のようになります
Videotogif(4).gif
待機モーションから始まって、Wキーを押下すると前方に移動して、離すと待機モーションに戻ります

モーション

今回、モーションのクリップはmixiamoというサイトからダウンロードして使っていきます
使用するクリップは待機モーションと移動モーションです。お好みの物をダウンロードしてご利用ください
スクリーンショット 2024-12-30 004159.png

ダウンロードはサイト右上のDownLoadから行えますがその時に出てくるDOWNLOAD SETTINGSは以下のようにしてください。ForMatをFBX for Unity(.fbx)に、SkinをWithout Skinに変更します
スクリーンショット 2024-12-30 004130.png

AnimatorControllerの設定とスクリプトを書く前に、ダウンロードしたクリップをUnityにインポートするのですがクリップにひと手間加える必要があります
まずインポートしたクリップを選択してRigのタブを選択します。そこでAnimation TypeがGenericになっていると思うのですがこれをHumanoidに変更してください
スクリーンショット 2024-12-30 001347.png
次にAnimationのタブから LoopTimeのチェックボックスにチェックを入れてください
スクリーンショット 2024-12-30 010216.png

下処理はこれで完了です

AnimatorController

まずはAnimatorControllerを作成します
スクリーンショット 2024-12-29 233732.png

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

スクリーンショット 2024-12-29 233810.png

インポートしたクリップをそのままドラッグアンドドロップで配置できます。mixiamoから取ってきたクリップだと名前が最初Mixiamo.comみたいになってるのでそこはいい感じの名前に変更します(今回はWaitとMove)
スクリーンショット 2024-12-30 004835.png

それぞれのステートを右クリックしてMake Transitionしてステート同士をつなげます
スクリーンショット 2024-12-29 235805.png

今回はこんな形にします
スクリーンショット 2024-12-30 005234.png

次に画面左側にあるParametersの+からパラメータを作ります。今回はBool型のIsMoveというパラメータを用意します。IsMoveがtrueの時は移動モーション、falseの時には待機モーションという感じです
スクリーンショット 2024-12-30 001510.png

次にモーション同士の遷移条件を設定します
WaitとMoveステートの間の矢印をクリックすると画面左側にこんな画面が出ると思うのでConditionsから遷移条件を設定します。WaitからMoveに向かう矢印の中ではIsMoveを選択しtrueに、その逆ではIsMoveを選択してfalseにしておいてください
またどちらの矢印でもHas Exit Timeのチェックは外しておいてください。これはクリップの再生が途中の時にアニメーションの遷移条件が満たされた時でも最後までクリップを再生してから遷移させるためのものですが待機→移動、移動→待機のどちらにおいてもクリップを最後まで再生する必要はなく、条件が満たされたら速やかに次のクリップの再生に移ってほしいからです
スクリーンショット 2024-12-30 005605.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

終わりに

SetBoolとかでパラメーターいじるところとかは直接変数名をべた書きしているのですが個人的には変数名が変わったときに一々変更しに行かないといけなくなってしまうので、パラメーター名を管理するクラスみたいなのを作ってそこから名称を入力、みたいな実装にしたいのですが実現できていません。アニメーターコントローラーからパラメーター名の一覧を取得するエディター拡張みたいなのを作れば行けるのか?
Videotogif(5).gif

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?