UnityのAnimatorの遷移状態をスクリプトで取得し遷移させるかどうかを決める

UnityのAnimatorはスクリプトから色々な情報を取得する事が出来ます。

今回はスクリプトからAnimatorの現在の状態を取得してアクションを起こせるようにします。

具体的にはマウスの左ボタンを押した時にキャラクターが剣を振るようにさせますが、剣を振っている間は次の攻撃の反応をさせないようにします。

剣を振っている間もマウスの左ボタンを押してアニメーションパラメータの条件をオンにしてしまうと、1度剣を振った後に移動させようと思ったらもう一度剣を振ってしまうということが起きてしまいます。

コンボのような攻撃を繋げる場合はいいですが一振りだけのアクションだけの場合は連続で攻撃ボタンが反応してしまうのは困ります。

そうならないようにAnimatorの遷移状態を確認して攻撃のアニメーションが終了してから次の攻撃ボタンの受付が出来るようにしましょう。

アニメーターの状態を確認するだけならサンプルのキャラクターやアニメーターを作る必要はありませんのでスクリプトの解説まで飛ばしてください・・・(^_^;)

一応、実際に確認出来た方がいいかなと思ってサンプルの作り方も書いています。

スポンサーリンク

Animatorの設定をする

まずは新しくAnimator Controllerを作り状態とパラメータ、遷移を作ります。

移動、攻撃のアニメーションパラメータを作成

↑のようにFloatでSpeed、TriggerでAttackを作成します。

移動と攻撃の遷移と状態を作成

↑のように状態と遷移を作成します。

Idle→WalkはSpeedが0.1より上、Has Exit Timeのチェックを外す
Walk→IdleはSpeedが0.1より下、Has Exit Timeのチェックを外す
Walk→AttackはAttack、Has Exit Timeのチェックを外す
Idle→AttackはAttack、Has Exit Timeのチェックを外す
Attack→IdleはHas Exit Timeにチェックを入れる

という条件にします。

Idle→Attackの状態遷移の条件を見てみると

攻撃への遷移条件

↑のように設定されます。

Attack→Idleは

攻撃から立っている状態への遷移

↑のように設定しました。

Animatorの細かい部分に関しては

Unityのアニメーションの切り替えシステムとスクリプト
Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

あたりを参照してください。

キャラクターに移動と攻撃スクリプトを取りつける

キャラクターに移動と攻撃のスクリプトを取りつけます。

キャラクターの移動の処理に関しては

Unityでキャラクターの移動をプログラミングしてみる
キャラクターを移動させる為のスクリプトを作成し、CharacterControllerを使ってキャラクターを動かす為のスクリプトを作成します
Unityのアニメーションの切り替えシステムとスクリプト
Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

等を参照してください。

攻撃をしている場所の条件部分を見ていきます。

攻撃ボタンを押しているという条件の他に2つの条件を設定しています。

GetCurrentAnimatorStateInfo(レイヤー番号).IsName

まずはGetCurrentAnimatorStateInfo(レイヤー番号).IsNameから見ていきましょう。

!animator.GetCurrentAnimatorStateInfo(0).IsName(“Attack”)

というのはアニメーターの0レイヤー(Base Layer)の現在のいる状態がAttackではない時という条件です。

0というのはアニメーターのレイヤー番号で

アニメーターのレイヤー

↑の赤い部分を押すと新しいレイヤーを作成出来ます。

作成したレイヤーはドラッグして順番を変える事が出来、1番上にあるのが0番になり、ベースレイヤーとなります。

今回の場合はBase Layerという元々あるレイヤーしか使いませんので0のまま使用します。

レイヤーが1の状態を見たいならば

!animator.GetCurrentAnimatorStateInfo(1).IsName(“Attack”)

となります。

IsInTransition

!animator.IsInTransition(0)

はアニメーターの0レイヤーが遷移途中ではないという条件です。

レイヤーの番号に関してはGetCurrentAnimatorStateInfoと同じなので割愛します。

GetCurrentAnimatorStateInfo.IsNameとIsInTransitionの違い

さてGetCurrentAnimatorStateInfo.IsNameとIsInTransitionはどう違うのでしょうか?

Animatorを使い始めのころは違いがわからず困りました・・・(^_^;)

というわけで画像を使って両方を確認してみます。

まずはGetCurrentAnimatorStateInfo.IsName(“Attack”)の状態です。

GetCurrentAnimatorStateInfo.IsName

Attackのアニメーションを再生している時に条件に合致します。

つまり

!animator.GetCurrentAnimatorStateInfo(0).IsName(“Attack”)

の条件はAttackの状態にいてAttackのアニメーションを再生していない時という条件になります。

次はIsInTransition(0)を見ていきます。

IsInTransition

↑のように0レイヤーであるBase Layerの遷移途中が合致します。

つまり

!animator.IsInTransition(0)

はアニメーションが別の状態へと遷移する途中ではないという条件になります。

したがって攻撃へと遷移させる条件を読み解けば

攻撃ボタンを押し、Attackアニメーションを再生中でなく、他の状態への遷移をしている時でない

という状態の時に攻撃のアニメーションへと遷移させている事になります。

つまりIdle状態、Walk状態にいる時だけ攻撃ボタンであるマウスの左ボタンを押して攻撃のアニメーションへと遷移します。

終わりに

Animatorの状態遷移や条件でつまづく事もあると思うのであらためてスクリプトからAnimatorの状態の確認について記事にしました。

正直なところ前半のサンプル作成のところはいらなかったかも・・・・。

まぁ実際作って確認した方が忘れないかなと思いまして・・・・(-_-)

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます