Unityでバイオハザード風のヘッドショット機能を追加をする

今回はバイオハザードのヘッドショットの機能を追加したいと思います。
頭を撃ち抜いて頭がなくなる状態にしたいと思います。(文章にするとなんだか怖い表現・・・)

この機能を追加するには条件が二つあります。

・敵キャラクターの3DグラフィックのMeshが部位ごとにわかれている。
(こちらはblender等で頭の部分を別のレイヤーにする必要がある)
・敵キャラクターの部位ごとにコライダを設定している。

の2点です。

コライダの設定の仕方は

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

を参照してください

最初の条件が成立していないと、頭だけを消す事が出来ないので必須です。
二つ目の条件は前の記事を参考にしてください。

ヘッドショット1

上のようにMeshがわかれている事が第一の条件です。頭部分が他の部位と別れています。
ヘッドショットだけをするのであれば頭だけ分かれていればOKです。

ヘッドショット2

上のように頭の部分のMeshだけが選択出来ます。

スポンサーリンク

敵キャラのダメージ処理メソッドTakeDamageにヘッドショット処理を追加する

ヘッドショットの条件は頭の部分に設定しているコライダに弾が当たった時なので、敵キャラのダメージ処理スクリプト内に処理を記述します。

今までの記事をご覧になってくださった方はEnemy内にTakeDamageメソッドがあるのでそこを修正します。

それでは処理を記述していきましょう。

まずは頭に弾が当たった時に消すオブジェクトを指定したいので、

を宣言します。

TakeDamageメソッド内で

と記述します。

ヘッドショット機能以外は

Unityのゲームで敵に攻撃を与えた時、与えた場所によって敵のダメージアニメーションを変更します

で追加した処理なので、そちらを参考にしてください。

当たった場所(コライダ)に設定しているタグがHeadだった時は、deleteBodyに指定されているゲームオブジェクト部分を非アクティブにします。
今回は頭だけですが、インスペクタ上でdeleteBodyに頭以外を指定すれば、腕なども消す事が出来ます。

これでスクリプトの修正は終了です。

ヘッドショットで消すゲームオブジェクトを設定

次にインスペクタでdeleteBodyにゲームオブジェクトを設定します。

ヘッドショットで消す場所を設定

敵キャラに設定されているEnemyのdeleteBodyのSizeを2にし、グラフィック部分のmesh_Headと当たり判定のコライダHitHeadをドラッグ&ドロップします。

これで敵キャラの頭を撃った時に頭がなくなり、頭があった部分にレーザーポインタが当たらなくなりました。

これでヘッドショットの機能は完成です。最初から頭がない敵を出したり、頭を撃ち抜かれても通常と変わらず動く敵を
作る事も出来ます。

ヘッドショットされた時に頭が転げ落ちるようにする

ヘッドショットされた時にそのまま頭が消えるだけでもいいんですが、例えば頭がゴロンと地面に転がり落ちるという演出をしたい場合があります。

今度はこの機能を作成してみます。

まずは敵キャラ(わたしの場合はゾンビ)のプレハブをシーン上に配置します。

すぐに名前をZombiHeadと変更してください。

変更したらそれをAssetsフォルダにドラッグ&ドロップして新しいプレハブを作成します。

ここで注意してください!!

名前を変更後、すぐにそれをAssetsフォルダにドラッグ&ドロップしたのは元のプレハブと別物にする為です。

元のプレハブの中身を変更してそれをApplyしてしまうと、元のプレハブが更新されてしまいます。

なのでプレハブをシーンに配置してそれを変更する前に、別のプレハブとして保存後に変更するようにしてください。

さてそれでは新しいプレハブZombieHeadが出来たのでこれを変更していきます。

まずは頭以外のMeshを削除、ボーンに設定している当たり判定コライダの削除、設定していたスクリプトを全部削除します。

ゾンビの頭だけのプレハブの階層

上のようになります。

ゾンビの頭にRigidbodyとSphereColliderの取り付け

ZombieHeadにRigidbodyとSphereColliderを追加します。

RigidbodyはUse Gravityにチェックを入れ、重力を働かせ、Massを20にします。

SphereColliderのIs Triggerのチェックを外し、他のコライダと接触した時にぶつかるようにします。

ここまで出来たらApplyして修正をプレハブに反映させます。

次はEnemyの修正です。

まずはインスペクタ上で頭のプレハブを指定出来るように変数を宣言します。

また銃でダメージを受けた時用にTakeDamageを追加で定義します。

TakeDamageの第2引数でRaycastHit型の変数を受け取ります。

それに合わせて以前からあるTakeDamageのtraをRaycasthitから得られるtagにします。

頭に攻撃を受けた時に頭のプレハブをインスタンス化しますが、頭のプレハブの基点はゾンビと同じになる為、transform.positionを設定し頭のプレハブがゾンビの頭の位置の少し上に出るようにします。

本来であれば3DCG作成ソフト等で頭のモデルを分けて作っておくと使い勝手がいいんですが、そうもいかない為このような処理にしてあります。

頭のプレハブに設定したRigidbodyを取得し、hit.normalで衝突面のメッシュの向きの反対側に力を加えています。

ここはRaycastHitの衝突面から方向を決めていますが、主人公が持つ銃の向きに力を加えた方が銃によって飛ばされた感じがでていいと思います。

今回は敵が主人公を追いかけていない限り主人公キャラクターのTransformを取得していない為、衝突面の反対方向の向きに力を加えています。

力を加えた後は、Destoryを使って3秒後に消すようにします。

これでヘッドショットがされたら頭がゴロンと下に転がります。

それではUnityの実行ボタンを押して確認してみましょう。

ヘッドショット6

これでバイオハザード風のヘッドショット機能の追加が出来ました。

この記事の内容・・・ゲームの話じゃなければずいぶん怖い話ですね・・・(^_^;)

ヘッドショットした場合にエフェクトを加えるとよりリアルな感じがでそうですね・・・・(;一_一)

スポンサーリンク

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

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