今回はUnityのアニメーターコントローラーの使い方をやってみます。
難しい制御はわからないのでごく基本的な事をやってみようと思います。
ではサンプルを作ってみます。
まずはAnimatorControllerを作成します。
ProjectウインドウのAssetsフォルダで右クリック→Create→AnimatorControllerを選択します。
上のようにAnimatorタブ内で右クリック→Create State→Emptyを選択し、名前を変更しIdleとAttackを作成します。
アニメーションパラメータとしてTrigger型のAttackを用意しておきます。
アニメーションパラメータはAnimatorのParametersを押し、+を押して新しいパラメータAttackを追加します。
上の画像ではAnyState→Attackとなっていますが、Idle→Attackです。
Has Exit Timeのチェックは外し、Conditionsの+を押してAttackを条件にしておきます。
Has Exit Timeのチェックがされていない時は他のConditionsの条件が成立するとすぐさま次のアニメーションへと遷移します。
Attack→Idleの時はHas Exit Timeにチェックを入れ、条件の指定は何もしません。
こうすることでアニメーションが終わってからIdleに遷移します。
キャラクターを用意しAnimatorコンポーネントに作成したAnimatorControllerをセットします。
アニメーションパラメータをスクリプトで変更する
次にキャラクターに追加するスクリプトTestEnemyとTestReceiveAttackを準備します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestEnemy : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent<Animator>(); } void Update() { if (Input.GetButtonDown("Fire1")) { animator.SetBool("Attack", true); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestReceiveAttack : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent<Animator>(); } void TestEndAttack() { animator.SetBool("Attack", false); } } |
アニメーションの遷移を確認するだけなので、最小のスクリプトの記述だけです。
デフォルトでFire1に設定されているマウスの左クリックを押すとAttackのアニメーションに遷移します。
TestReceiveAttackスクリプトはアニメーションクリップに設定したアニメーションイベントを受け取って実行するスクリプトなので
Attackに設定したアニメーションの最後にTestEndAttackというアニメーションイベントが設定されている必要があります。
アニメーションイベントに関しては
を参照してください。
アニメーションのブレンド
さきほどの遷移のアニメーションブレンドですが、それぞれ遷移先のアニメーションがすぐ再生されるようにしています(ブレンドする時間が短い)。
濃い青色の部分が再生されるアニメーションで、Idle→Attackの場合はIdleのアニメーションとAttackのアニメーションをブレンドしながらAttackに遷移し後はAttackのアニメーションのみ再生されます。
上がさきほどのアニメーションブレンドの場合のIdle→Attackのアニメーションです。
ほとんどすぐにAttackのアニメーションに切り替わります。
アニメーションブレンドの最後の横向きの矢印をAttackのアニメーションの最後の方に移動させると、
IdleとAttackのアニメーションを滑らかにブレンドしながらAttackのアニメーションに遷移します。
上が結果です。
次に、Attackのアニメーションの最初の方は再生したくない場合があるとします。
右手の攻撃の後、左手の攻撃をするが右手の攻撃の部分を省略して左手の攻撃だけ採用したい場合
上のようにAttackを左にドラッグ&ドロップして移動させます。今回は50%移動しました。
上が結果です。あまりよくわからないですが・・・(^_^;)
濃い青の部分がブレンドする部分なのでAttackを左にスライドさせて最初のアニメーションの部分をカットし、ブレンドの最後も左に寄せて直ぐにAttackアニメーションへと遷移させるようにするとさらに良くなりそうです。
Attackのアニメーションの最初をカットしつつIdleとAttackのブレンド時間が短いのですぐにAttackのアニメーションへと遷移します。
アニメーションのブレンドや割り込みについては
も参照してみてください。
これでアニメーターコントローラーが少し使えるようになりました。
実際はStateの中でも角度やスピードでアニメーションを切り替えたり(サブステート)、遷移の条件をいろいろ指定して複雑化していきますが、まずは出来る事をやってみました。
サブステートマシンに関しては
を参照してください。