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

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

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

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

コライダの設定の仕方は

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

を参照してください

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

ヘッドショット1


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

ヘッドショット2

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

スポンサーリンク

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

ヘッドショットの条件は頭の部分に設定しているコライダに弾が当たった時なので、敵キャラのダメージ処理スクリプト内に、今までの記事をご覧になってくださった方はMoveEnemy内にNockBack関数があるのでそこを修正します。

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

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

public var deleteBody : GameObject[];

を宣言します。

NockBack関数(ダメージ処理関数)内で

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

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

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

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

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

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

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

ヘッドショット3

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

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

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

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

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

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

まずは敵キャラ(わたしの場合はゾンビ)のプレハブをシーン上に配置します。
すぐに名前をZombiHeadと変更してください。
変更したらそれをAssetsエリアにドラッグ&ドロップして新しいプレハブを作成します。

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

名前を変更後、すぐにそれをAssetsエリアにドラッグ&ドロップしたのは元のプレハブと別物にする為です。
元のプレハブの中身を変更してそれをApplyしてしまうと、元のプレハブが更新されてしまいます。
なのでプレハブをシーンに配置してそれを変更する前に、別のプレハブとして保存後に変更するようにしてください。

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

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

ヘッドショット4

全部は縦に長かったので表示していませんが、上のようになります。

ヘッドショット5

ZombiHeadにRigidbodyとCapsuleColliderを追加します。

RigidbodyはUse Gravityにチェックを入れ、重力を働かせます。
CapsuleColliderのIs Triggerのチェックを外し、他のコライダと接触した時にぶつかるようにします。

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

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

public var headObj : GameObject;

ヘッドショットした時に頭のプレハブをインスタンス化して弾がヒットした位置より少し上の位置と角度にします。

同じ位置にすると後で飛ばす時に体とぶつかって飛ばない為です。
次に頭のRigidbodyに主人公キャラが向いている方向へ力を加えます。200と設定していますが、ここを大きくすればより頭が飛んでいきます。

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

これでヘッドショットがされたら頭がゴロンと下に転がります。
それではUnityの実行ボタンを押して確認してみましょう。

ヘッドショット6

少し頭の登場位置が高すぎたような気がします・・・・。
ここら辺は自由に調整してください。

これでバイオハザード風のヘッドショット機能の追加が出来ました。
この記事の内容・・・ゲームの話じゃなければずいぶん怖い話ですね・・・(^_^;)