例えば、ゲームのキャラクターには、立ち止まっている→歩いている→走っている→ランニングジャンプしている、というような状態がありますね。そして、その状態ごとにキャラクターのアニメーションが違います。
ところで、立ち止まっているところから、いきなり走るとか、いきなり遠くへジャンプすると不自然なので、その間に歩くとかゆっくり走るとか、助走をつける、といったような状態が入ります。
つまり、あらかじめ状態の遷移図を用意しておくと便利です。
Unityでアニメーションを使っているとこういう図が出てきますが、これがその遷移図で、各長方形は各状態を、矢印は状態の移り変わりを表しています。
ゲームが始まるとEntryという状態から出ている矢印を通って状態が変わっていきます。状態はたくさん作ることができます。
そして、この長方形一つ一つにアニメーションが含まれています。アニメーションをUnityではアニメーションクリップといいます。
レイヤーとパラメータ
オブジェクトの状態遷移は、一通りだけだと不便ですよね。止まっているか走っているかという状態遷移とは全く無関係に、上半身や顔のアニメーションを切り替えたいときがあります。同じオブジェクトに、複数の遷移図を別の層にわけて使えたら便利です。
そういうときには、上の画像の赤い部分の「レイヤー」を使います。「+」から新しいレイヤーを作ると、Entry と Any State しかない初期状態の遷移図が作られます。
その隣のパラメーターは、ある状態から別の状態へ遷移するときの条件を作るときなどに使います。
新しく状態を作って、「New State 0」 から 「New State」へ伸びる矢印をクリックすると、インスペクタの下の方に「Conditions」というのが出てきます。これは条件のことです。
さっきのパラメータータブから「+」をクリックして新しく Trigger タイプのパラメーターを作って、インスペクタの Conditions の右下の+から、今作った「New Trigger」を登録すると、この「New Trigger」を使って、遷移するタイミングをスクリプトからコントロールできるようになります。
遷移させたいところで
obj.GetComponent().SetTrigger("New Trigger");
と書きます。
obj はこのアニメーターコントローラーのついたゲームオブジェクトです。
ゲームオブジェクトにアニメーターコンポーネントがあって、その中にアニメーターコントローラーがあり、その中のステートにアニメーションクリップが含まれていますね。
遷移の条件
ただし、上の画像では、インスペクタ真ん中あたりの Has Exit Time のチェックが外れていますね。これを入れると、アニメーションがExit Time で設定した回数のループをしたときに、Conditions の条件が満たされていれば遷移します。
Exit Time を 2.5にすると、もしその前に条件を満たしていても、2.5回アニメーションが流れたあとでないと遷移しません。 Exit Time を1未満にすると、ループごとに毎回判定されます。
Has Exit Time のチェックを入れないと、Conditions に設定した条件が満たされればすぐに遷移します。複数の条件があれば、すべて満たすと遷移します。
つまり、遷移の条件には時間とパラメーターの両方または一方を使えます。