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

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

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

Unityの敵キャラの当たり判定を細かくして、部位毎に攻撃出来るようにしていきます。

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

スポンサーリンク

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

当たり判定のコライダにはタグをつけていきます。

敵に細かく当たり判定を取り付けた階層

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

モーション1

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

インスペクタのTagを選択し、Add Tagで敵の体の部位毎にタグを作成します。

敵の部位毎にTagを作成

敵の当たり判定用の空のゲームオブジェクトの部位毎にTagを設定します。

敵の部位毎にTagを設定

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

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

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

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

敵にDamageLeftとDamageRight状態を設定する

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

モーション5

上のようにMirrorにチェックを入れます。

そうするとDamageRightに設定したアニメーションとは反対のアニメーションになります。

左右対称のアニメーションにしたい場合はMirrorにチェックを入れれば簡単に出来ます。

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

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

次は敵に銃弾が当たった時の処理を修正します。

敵のダメージを受けた時の処理を修正

敵に銃弾が当たった時の処理は敵キャラに設定しているEnemyスクリプトのTakeDamageメソッドで、そこで状態変更メソッドSetState内でアニメーションパラメータのDamageをトリガーしていました。

ここのDamage部分をダメージを受けたコライダのタグで判断し分岐させたいところですが、SetStateに新たに引数を作るのも大変なので、SetStateを呼び出しているTakeDamageメソッド内でアニメーションパラメータのトリガーをします。

その為、まずは先ほどのanimator.SetTrigger(“Damage”)の処理を削除します。

次にTakeDamageメソッドです。

以前の記事をご覧頂いている方はTakeDamageを二つ作成していると思いますが、銃を撃った時はコライダのTransform情報を受け取っているのでそれを活用します。

近接武器で攻撃した場合は1回の攻撃で複数個所に当たる可能性もある為、今回は今まで通りDamageをトリガーするだけにしておきます。

とします。

近接攻撃スクリプトの修正

敵の当たり判定のコライダをEnemyHitからHit部位名へと変えた為、近接攻撃の当たり判定でEnemyHitコライダと接触した時に攻撃が当たったとしていたので、ここを修正します。

以前の記事で作ったAttackSwordスクリプトを修正します。

以前はタグで判定していた箇所をレイヤーで判定することにします。

当たり判定のコライダのTagはHit部位という名前に変えましたがレイヤーはEnemyHitのままにしている為、これで判定をする事が出来ます。

複数個所の当たり判定をする為、ダメージをすでに受けている場合はダメージを与えないようにします。

近接攻撃でもアニメーションを分ける場合

近接攻撃でもアニメーションを分ける場合はAttackSwordのOnTriggerEnterメソッドで、

第2引数にTransform情報を渡します。

Deadメソッドの修正

最後にEnemyスクリプトのDeadメソッドを修正します。

Dead状態になったらDamage系のトリガーをリセットする処理を追加します。

終わりに

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

モーション6

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

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

スポンサーリンク

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

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