敵にダメージを与えた時、部位によってアニメーションを変える

今回は、敵キャラクターが主人公の発砲によってダメージを受けた時に受けた個所によってアニメーションを変更してみます。
アニメーションを変えるだけでなく、与えるダメージの変更機能も同じように追加する事が出来ます。

今回の機能を追加する前に

Unityの敵キャラの当たり判定を細かくしてよりバイオっぽくする
Unityゲームの敵キャラクターに取りつけるコライダを細かく設定し、当たり判定を細かくします。

の記事のように部位によって当たり判定を分けておく必要があります。

スポンサーリンク

当たり判定に使うコライダにタグを設定する

当たり判定のコライダにはタグをつけておき、例えば左手にはLeftHandというタグを設定しておきます。

モーション2

上のように部位ごとにコライダを設定し、Hit部位の名前、という名前を付けておきます。


モーション1

今回は上のように当たり判定のコライダを用意しました。

モーション3

頭の部分のコライダHitHeadにはHeadというタグを作成し設定します。コライダの設定は上のようになります。

これで銃弾が当たった部位はコライダから設定されているタグを取得し、どこの部位だったかを知る事が出来るようになります。

アニメーターコントローラでダメージアニメーションを変更する

次は敵キャラのアニメーターコントローラーを修正します。

モーション4

上のようにDamage、DamegeRight、DamageLeftを作成します。

Damageは元々あるダメージを受けた時の処理です。

アニメーションパラメータにDamageRightとDamageLeftをTriggerとして作成し、AnyStateからDamegeRight、DamageLeftにTransitionを繋げます。DamageRight、DamageLeftがそれぞれOnになった時に状態遷移するように条件に設定します。

その後に、DamageRight、DamageLeftからIdleにMakeTransitionで遷移を繋げ、条件はなしで、HasExitTimeにチェックを入れます。
Has Exit Timeにチェックが入っているので、アニメーションの再生が終わればIdleに遷移します。

DamageRight、DamageLeftからはアニメーションパラメータのAttackがOnになった時にAttackへと遷移するようにMakeTransitionします。

DamageRightとDamageLeftに設定するアニメーションクリップはまったく別物を準備してもいいのですが、例えば体の右側をのけ反るアニメーションがあったならば、それをDamageRightに設定し、DamageLeftにも同じアニメーションを設定して、

モーション5

上のようにMirrorにチェックを入れます。
そうするとDamageRightに設定したアニメーションとは反対のアニメーションになります。
左右対称のアニメーションにしたい場合はMirrorにチェックを入れれば簡単に出来ます。

これでアニメーターコントローラの修正は終了です。

ダメージ処理関数内でダメージアニメーションを振り分ける

次は敵に銃弾が当たった時の処理を修正します。
敵に銃弾が当たった時の処理は敵キャラに設定しているMoveEnemyスクリプトのNockBack関数なので、そこで

animator.SetTrigger(“Damage”)

としていた個所を

if(pos.gameObject.tag == “RightHand” || pos.gameObject.tag == “RightLeg”) {
animator.SetTrigger(“DamageRight”);
} else if (pos.gameObject.tag == “LeftHand” || pos.gameObject.tag == “LeftLeg”) {
animator.SetTrigger(“DamageLeft”);
} else {
animator.SetTrigger(“Damage”);
}

とします。

今回は右側、左側、中央でアニメーションを分けています。
右側、左側ではなかった時は通常のダメージアニメーションを実行します。
さて、これで完成!といきたいところですが前の記事等を参考にしてくださっている方は、もしかしたらNockBack関数内の修正を加えた方がいいかもしれません。

連続でダメージを受ける事を避けるために条件として

if(state != State.damage) {

という条件があったのですが、これをコメントアウトします。
この条件があると何回か連続して発砲した時に敵のアニメーションの動きがなくなるだけでなく、ダメージ自体もなくなってしまうからです。

おそらく銃以外の攻撃で連続してダメージが当たるのを防ぐための処理だったと思うんですが・・・、例えば、剣を装備していて敵を攻撃した時、今回のようにヒットコライダを分けていた場合、それぞれの部位毎にダメージを計算してしまいます。
(1回の攻撃で左手にも、胴体にも右手にも当たった場合3度のダメージ処理が行われる)

この場合はこの条件が必要になります。主人公が持っている武器によって処理を分ける必要があるかもしれません。

銃の時はそれぞれの部位での当たり判定、剣等の近接攻撃の時にCharacterControllerのコライダを当たり判定としている場合はこのif(state != State.damage)という条件は必要ありません。
現状わたしはこちらでダメージ判定しています。

では出来上がったのでUnityの実行ボタンを押して確認してみましょう。

モーション6

当たった部位によって敵のダメージアニメーションが変更されました。

今回は3パターンですが、右手と右足をわけたり、前からと後ろからの攻撃でも分けたりと細かく作り込む事も出来ます。