こんがらがったAnimationControllerを整理する

AnimatorControllerを使いこなすには

この動画ではこんがらがりにくいAnimatorControllerを作成する方法を例を交えて紹介します。
今回使うキャラクターができる事はアイドルモーション、移動、走る、落下して着地、3種類の攻撃、それからダメージを受けたり死ぬこともできます。

アイドルモーション、移動、走るをBlendTreeで作る

まずは地上の移動から作ります。

この移動にはBlendTreeを使います。名前はLocomotionとしておきます。
スピードというパラメータを用意し、最小値は0、最大値は2としたうえで、値の変化により停止(アイドル)、移動、走ると切り替わるようにします。

BlendTreeはこういった無段階で移動できるアニメーションに便利

ただ、せっかく設定してもそのまま使うとパラメータが一瞬で変化してしまうため、動画内ではゆっくりと値を切り替えるためにダンプを設定を追記しています。

攻撃モーションをサブステートで作る

次は攻撃のモーションを作ります。
攻撃モーションのように平常時からいつでも切り替えることができるアニメーションは、そのまま作るとState Machineを複雑にするので、サブステートを使用した構造化を活用します。
発動条件をアタックトリガーというトリガーにします。サブステートに攻撃モーションを登録し、EnterとExitを繋ぎます。同様に攻撃を複数用意するわけですが、トランジションする条件は攻撃とAttackTypeが一致する時とします。実際に動かしてみると攻撃の種類に応じてアニメーションが切り替わります。

AttackType次第で攻撃が変わるようにサブステートを設定

これは何をやっているのかと言うと、攻撃時に対応するアニメーションに遷移しています。そしてアニメーション終了後にExitを抜けてロコモーションに戻るります。これにより攻撃の種類が増えた場合でもAttackTypeを増やしてステートを追加するだけで攻撃の種類を増やすことができるのです。

動画ではキャンセル攻撃も追加しましたが、これは発動条件をLocomotionだけでなく、Attacks自身からも遷移できるようにすることで実現しています。

キャンセル攻撃実装により頻繁に切り替えられる

落下モーションをBlendTreeとサブステートの組み合わせで作る

今まではBlendTreeとサブステートを使いましたが、落下モーションはこの2つの組み合わせで作ります。
地面から足が離れた時、Locomotionから落下モーションに切り替わるよう設定したいので、ここでサブステートを使います。サブステートをAirborneと名付け、また落ちるスピードによってアニメーションを変化させたいので、ここでBlendTreeを使うわけです。モーションが切り替わるパラメーターはFallSpeedとして、値によってアニメーションを変化させます。 それから着地(ランディング)のモーションもつけます。こちらの切り替わり条件は「地面に接地した時」です。

ついでに着地硬直のキャンセルも設定します。ランディングからExitへのトランジションに追加して、スピードが設定されていれば即座に切り替わるようにします。これで落下モーションのサブステートができました。

攻撃モーションから落下モーションへの切り替えはどうする?

落下モーションへは、Attacksからもすぐに切り替えられるようにしておきます。
まずAttacksの攻撃モーションからExitに向けてトランジションを設定します。条件は地面から離れた時後はAttacksのサブステートからAirborneにトランジションを設定するだけなのですが、攻撃同様にアニメーションの種類が増えた場合、AirborneやLocomotionに向けて大量にトランジションが作られてしまうことが考えられます。

なのでここで一工夫。まずルートのスケートマシンのEntryからLocomotionとAirborneに対してトランジションを設定します。トランジションの条件は空中にいるか地面にいるかです次にAttacksからLocomotionへのトランジションを削除し、ルートのExitに向けてトランジションを設定します。これでAttacksからLocomotionやAirborneに対して直接トランジションを設定しなくてもステートを切り替えることができます。

Any Stateを活用しよう

続いてダメージと死亡のモーションを設定します。ダメージのモーションはどのステートからでも移行する必要があるので、AnyStateを使用します。ダメージのモーションを登録して、AnyStateからダメージへのトランジションを設定します。

トランジションの条件はダメージトリガーを押されているとき。 ダメージのモーションからExitへのトランジションも設定し、先ほどのパターンで即座にLocomotionへ遷移するようにします死亡モーションも同じような感じで設定します。こちらはHPが0以下の時に切り替えます。

ただ、AnyStateからのトランジションはできるだけルートに配置したくないので、サブステートを利用します。Damagesのサブステートを作成してダメージとデスのモーションをこちらに移動します。次にDamagesからかExitへのトランジションを設定して完成です。サブステートをフォルダのように使用してステートマシンを整理するとAnyStateを使用するときのステートマシンがスッキリします。

まとめ

今回は、特にEntryとExitを使用したステートマシンの構造化について紹介しました。
すべての状況に対応できるわけではないですが、うまく使うとステートマシンを大分スッキリできます。

これ以外にもUnity Learnのページで色々と情報があるので、確認してみてください。

それでは、また次回の動画でお会いしましょう!