Unityでアニメーションイベントが実行されない時の為にビヘイビアを設定しておく

記事内に広告が含まれています。

今回は記事の修正をしていて気付いた事を新しく記事として作成することにしました。

以前の記事で主人公が敵キャラを攻撃出来る機能を作成しました。

Unityで主人公キャラが敵を攻撃出来るようにする機能
Unityで主人公キャラが剣を振って敵キャラを攻撃出来るようにする機能を作成します

主人公に装備させた剣のコライダのオン・オフはアニメーションイベントを使って行っていましたが、

例えば主人公が攻撃中に敵から攻撃を受けた場合に、すぐさま主人公のダメージアニメーションへと遷移させていると主人公の攻撃アニメーションの攻撃終了のアニメーションイベントが再生されず、実行されない事がありました。

そこで今回はアニメーションイベントが実行されない時を考慮してビヘイビアを設定し、それに対応出来るようにします。

スポンサーリンク

ビヘイビアとは

ビヘイビアはアニメーターコントローラーの状態に設定出来るスクリプトで、Animatorの状態等を変更する時に使用すると便利です。

UnityのアニメーターコントローラーのStateMachineBehaviourでアニメを制御する
Unityのアニメーターコントローラーを通常のスクリプトで制御するのではなくBehaviourを使って制御するようにします

アニメーションイベント受け取りスクリプトの修正

主人公キャラクターのアニメーションイベント受け取りスクリプトはProcessMyAttackとしていたのでまずはこちらを修正します。

ProcessMyAttackは↑のようになっていて、コライダのオフをしているのはAttackEndメソッドなので、外部スクリプトから呼び出せるようにアクセス修飾子をpublicにします。

主人公用のビヘイビアの作成

主人公のアニメーターコントローラーのAttack状態を選択し、インスペクタでAdd Behaviourを押します。

そこでPlayerAttackStateBehaviourという名前のビヘイビアスクリプトを作成します。

主人公のAttack状態にアタック状態用ビヘイビアを設定

ProcessMyAttackを保持するフィールドを作成し、OnStateExitメソッド内でanimatorから取得します。

OnStateExitメソッドはこの状態を抜けた時に呼ばれるので、その時にprocessMyAttack.AttackEnd()を実行し、攻撃用コライダのオフを強制します。

主人公の攻撃アニメーションを分けている場合はそれらの状態にもPlayerAttackStateBehaviourを取り付けます。

敵キャラ用のビヘイビアを作成

敵キャラのAttack状態も主人公と同じように作成しますが、敵キャラ用のアニメーションイベント受け取りスクリプトはProcessAttackとしていました。

攻撃状態に関しては主人公と同じなので敵のAttack状態用のビヘイビアは割愛します。

敵がダメージを受けた後EndDamageのアニメーションイベントを受け取り状態をEnemyState.Walk状態へと遷移させていますが、Damage状態に設定したアニメーションの最後にEndDamageアニメーションイベントを作成せず、ビヘイビアを取り付けてEndDamageメソッドを呼び出すようにする事も出来ます。

ProcessAttackのEndDamageメソッドのアクセス修飾子にpublicを付けます。

敵のDamage状態にEnemyDamageStateBehaviourを作成し取り付けます。

アニメーションイベントのEndDamageはアニメーションの最後にイベントを発生させているだけなので、ビヘイビアを使った方がアニメーションイベントを取り付ける必要もなく、

元のアニメーションを他のキャラクターと共有する場合にアニメーションイベントの受け取りスクリプトを用意しなくてもよくなるので便利かもしれません。

主人公のDamage状態も同じような感じで作成出来ます。

終わりに

アニメーションイベントは便利ですが、アニメーションが最後まで再生されないような時はイベントが発生しないので、こういった対処が必要になりますね。

知らないうちに敵がバッタバッタと倒れたのでなんでだろう?と思ったんですが、剣のコライダがずっと有効になってたんですね。

(^_^;)

タイトルとURLをコピーしました