Unityのアニメーションの切り替えシステムとスクリプト

今回はUnityでアニメーションを操作、制御する事をやってみたいと思います。

Unityでキャラクターの移動をプログラミングしてみる
キャラクターを移動させる為のスクリプトを作成し、キャラクターを動かす機能を作成します

前回までに作った「masasi」君を使おうと思ってた方はやり直しから始まります。ごめんなさい

まずは「masasi」君の原形Army01のプレハブを選択してください。

アニメーションタイプをHumanoidにする


上画面のようにインスペクタ上でRigを選択しAnimation TypeをHumanoidに変更します。
Humanoidに変更すると、他のキャラクターで使用していたアニメーションをこのキャラクターでも使用する事が出来ます。

なのでアニメーションだけ別に作成しておけば、Animation TypeがHumanoidのキャラクターは他の人型キャラクター用に作成したアニメーションを適用できるリターゲット機能が使用出来ます。

キャラクターコントローラとスクリプトのパラメータを設定する

そしてCharacterControllerとスクリプトMoveを設定しパラメータを入れておきます。

さてここまでが前回までにやるべきだった事への修正で、これからが今回やりたかった事です。

スポンサーリンク

AnimatorControllerの作成

ProjectウインドウのAssetsエリアでアニメーションをコントロールするアニメーターコントローラーを作成します。

アニメーターコントローラを作成する

上画面のように右クリック→Create→Animator Controller

と選択する。

アニメーターコントローラーの名前を変更しておく

できたら、名前を「masasi」としておきます。
これは「masasi」君に使用するアニメーターコントローラーだとわかりやすくする為で、他の名前にしてもかまいません。

キャラクターのアニメーターにアニメーターコントローラーを設定する

Animator Controllerのmasasiを「masasi」君のコンポーネント上のAnimatorにドラッグ&ドロップする

アニメーターコントローラの状態と遷移を作成する

Animator Controllerの中を見てみます。
masasiアニメーターをダブルクリックします。

アニメーターの状態を作成する

上画面のようにAnimatorタブが開くので、

右クリック→Create State→Empty

とします。(下画面)

アニメーターに空の状態が作成される

これで一つのアニメーションの状態が作成されました。
下画面のようにインスペクタ上で名前をIdleに変更し、Motionの右の丸部分をクリックしHumanoid Idleを選択します。
これでIdleの状態の時はHumanoid Idleのアニメーションが再生されます。

このHumanoid IdleはThird Person Controllerで使っていたアニメーションで、それをそのまま「masasi」君に適用しました。
赤丸部分を参考にしてください)

アニメーターにIdle状態が出来上がる

これでIdle、つまり何もしてないボーっと突っ立っている状態を作成しました。
Entryから繋がっているのがデフォルトの状態です。

これで「masasi」君が登場すると同時にIdle状態になるはずです。
Unityの実行ボタンを押して確認してみましょう。

「masasi」君がゆらゆら揺れながら立っている状態になります。
次に歩く状態を作成します。

アニメーターに歩く状態を作成する

上画面のようにWalkという状態を作り、Idleの時と同じように設定します。(赤丸を参考に)
次にIdle状態からWalk状態、Walk状態からIdle状態への遷移を作成します。

アニメーターの状態を繋いでみる

状態を選択して右クリック→Make Transitionでその状態から別の状態への遷移の矢印が出るので、Walk状態をクリックします。

Idle→Walk、 Walk→Idle

という双方向の遷移が出来たら、次はその遷移条件を作成します。

アニメーションパラメータを作成し遷移する条件を指定する

アニメーターの遷移を作成する

アニメーションパラメータを作成する

上画面の赤丸部分のParametersを選択し、少し下にある+をクリックして、
Floatを選択します。

IdleからWalkに遷移する時にはFloatの値(小数点込みの値)で遷移させたい為です。
名前はspeedとしておきます。

Animator Controllerの遷移のための条件変数speedが出来ましたので、
Idle→Walkへの遷移の所にspeedの条件を入れます。

アニメーターの遷移条件を設定する

上画面のように赤丸をクリックし条件speedを加えます。

アニメーターの遷移条件を双方向に移動するように設定

speedが0.1を超えたらIdleからWalkに遷移、speedが0.1より下になったらWalkからIdleへと遷移するように設定します。

これで遷移とその条件の作成が終わりましたので、スクリプトからその条件値を変更してみます。

アニメーションパラメータをスクリプトから変更

velocity.magnitudeはベクトルの長さを表わしていて、この場合は方向キーの押した向きの長さ(0~1.5?)で表されます。

これが0.1より大きくなった場合にanimator.SetFloat(“speed”, velocity.magunitude)でAnimatorのspeedの値を設定しています。

ここでspeedの値が0.1より大きい値が設定されるので、アニメーションのWalkが再生されることになります。

0.1より小さい場合は0をセットしIdleが再生されるようにしています。

これでアニメーションの再生がきちんとされるようになったので、あとはキャラクターの向きも指定します。

キャラクターの向きの変更と向いている方向への移動

transform.LookAt(transform.position + velocity);

transform.LookAtで向きを変更出来ます。
transform.positionがMoveスクリプトが設定されている「masasi」君の位置でvelocityがキーを押している方向の値なので、足した場合は移動先の方向になります。

つまりそこにLookAtする事によって
その方角をキャラクターが向くようになります。

ApplyRootMotionのチェックを外す

ついでにインスペクタのAnimatorのApply Root Motionのチェックを外しておいてください。
これをチェックしているとアニメーションの動きがキャラクターの移動に反映されてしまうみたいです。(キャラクターの移動や角度にアニメーションの変更値が反映されてしまいます)

アニメーションはその場で動作だけをさせ、スクリプトで移動させたいのでチェックを外します。

これでキャラクターが地面の上を移動する事が出来るようになりました!
いやぁUnityすごいですねぇ・・・。

次回はカメラの調整等をしてみようかと思います。

コメント

  1. Lily より:

    アニメーションパラメータとキャラクターの向きの変更と向いている方向への移動のことなんですが
    この2つは新たに別々でJsScriptを作るんでしょうか?
    それとも一つのを作ってそこに書くんでしょうか?
    それともmoveのやつに追加ですか?

    • kamekumechan より:

      コメントありがとうございます。
      管理人のかめくめちゃんです。(^。^)

      キャラクターの移動と向きを変更する処理はキー操作をした時に一緒に処理をしたいので、
      キャラクターを操作しているスクリプトMoveに追加で書き込むのがいいと思います。

      キャラクターの操作以外のスクリプト(例えばキャラクターのステータスを管理するスクリプト)等は別のスクリプトを作成した方が修正する時に便利になると思います。

      • Lily より:

        Moveに追加…..結局moveはどのような中身になるんでしょうか….
        本当に初心者ですみません

        • kamekumechan より:

          かめくめちゃんです(^O^)/
          Moveという名前でスクリプトを作成した場合です。(キャラクターコントローラのMove関数と混同する可能性があるので別の名前にした方がいいかも・・・)

          この記事までのMoveスクリプトは上のような感じだったと思います
          実際には試していないので動くかどうかは不明です。(^_^;)
          確認をお願いします。(__)

  2. Lily より:

    このサイトのこのページ
    http://gametukurikata.com/program/unityprogramming
    でやってきたmoveのソースと
    コメント欄で書いてくれたソースが一部一致していません
    例:speedをインスペクターから入力する欄など、重力を追加したりするもの
    元々あったmoveファイルに上書きすると再生すらしてくれません
    どうすればいいでしょうか?

    • kamekumechan より:

      これをキャラクターに取り付けてください。

  3. Lily より:

    ありがとうございます!
    動きました!

  4. Lily より:

    すみません
    歩きモーションに入っては止まり入っては止まりで
    ずっと歩き続けるというアニメーションに入ってくれません
    これはそういうものなのでしょうか?

    • kamekumechan より:

      おそらく、歩きモーション自体のLoop Timeのチェックが入っていない為だと思われます。
      歩くモーションを選択した状態でインスペクタにアニメーションの設定を表示させ、Loop Timeにチェックを入れます。

      アニメーション
      アニメーションインスペクタ

  5. Lily より:

    ループにチェックは入っていますがやはり収まりません…..

    http://fast-uploader.com/file/7021861432331/
    ↑こんな感じになってしまいます
    ※3日間で削除されます

    • kamekumechan より:

      一から同じように作成してみましたが、わたくしの場合は同じような状況にはならないみたいです(^_^;)

      設定をいじって同じような状況になったのは、
      Walk→IdleのHas Exit Timeにチェックが入ったままで
      Walk→Idleの条件(Conditions)にspeedがLessで0.1という条件が入っていない
      状況で発生しました。

      確認してみてください。
      歩くから立っている状態に必ずアニメーションが遷移してまた歩くになっているので、条件の部分の問題だと思います。
      これで出来なければちょっとわかりません・・・。

      • Lily より:

        すみません
        解決しましたありがとうございます!
        Walk→Idleの条件(Conditions)にspeedがLessではなくGreaterになっていました

        こちらの確認ミスでした
        本当に有難うございます!

        このサイトはとても見やすく
        FPSに必要な技術がとても詰まっていて本当に嬉しいです!
        これからもがんばってください!