今回はUnityでバイオハザードのヘッドショットの機能を追加したいと思います。
頭を撃ち抜いて頭がなくなる状態にしたいと思います。(文章にするとなんだか怖い表現・・・)
この機能を追加するには条件が二つあります。
・敵キャラクターの3DグラフィックのMeshが部位ごとにわかれている。
(こちらはblender等で頭の部分を別のオブジェクトにする必要がある)
・敵キャラクターの部位ごとにコライダを設定している。
の2点です。
コライダの設定の仕方は
を参照してください
最初の条件が成立していないと、頭だけを消す事が出来ないので必須です。
二つ目の条件は前の記事を参考にしてください。
上のようにMeshがわかれている事が第一の条件です。頭部分が他の部位と別れています。
ヘッドショットだけをするのであれば頭だけ分かれていればOKです。
上のように頭の部分のMeshだけが選択出来ます。
敵キャラのダメージ処理メソッドTakeDamageにヘッドショット処理を追加する
ヘッドショットの条件は頭の部分に設定しているコライダに弾が当たった時なので、敵キャラのダメージ処理スクリプト内に処理を記述します。
今までの記事をご覧になってくださった方はEnemy内にTakeDamageメソッドがあるのでそこを修正します。
それでは処理を記述していきましょう。
まずは頭に弾が当たった時に消すオブジェクトを指定したいので、
1 2 3 4 5 | // ヘッドショットが行われた時に消す場所 [SerializeField] private GameObject[] deleteBody; |
を宣言します。
SetStateメソッド内で
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | } else if (tempState == EnemyState.Damage) { animator.ResetTrigger("Attack"); if (targetObj.name == "HitRightUpperFoot" || targetObj.name == "HitRightLowerFoot" || targetObj.name == "HitRightUpperArm" || targetObj.name == "HitRightLowerArm") { animator.SetTrigger("DamageRight"); } else if (targetObj.name == "HitLeftUpperFoot" || targetObj.name == "HitLeftLowerFoot" || targetObj.name == "HitLeftUpperArm" || targetObj.name == "HitLeftLowerArm") { animator.SetTrigger("DamageLeft"); } else { animator.SetTrigger("Damage"); Debug.Log(targetObj.name); if(targetObj.name == "HitHead") { foreach (var item in deleteBody) { item.SetActive(false); } } } navMeshAgent.isStopped = true; |
と記述します。
ヘッドショット機能以外は
で追加した処理なので、そちらを参考にしてください。
当たった場所(コライダ)の名前がHitHeadだった時は、deleteBodyに指定されているゲームオブジェクト部分を非アクティブにします。
今回は頭だけですが、インスペクタ上でdeleteBodyに頭以外を指定すれば、腕なども消す事が出来ます。
これでスクリプトの修正は終了です。
ヘッドショットで消すゲームオブジェクトを設定
次にインスペクタでdeleteBodyにゲームオブジェクトを設定します。
敵キャラに設定されているEnemyのdeleteBodyのSizeを2にし、グラフィック部分のmesh_Headと当たり判定のコライダHitHeadをドラッグ&ドロップします。
これで敵キャラの頭を撃った時に頭がなくなり、頭があった部分にレーザーポインタが当たらなくなりました。
これでヘッドショットの機能は完成です。最初から頭がない敵を出したり、頭を撃ち抜かれても通常と変わらず動く敵を作る事も出来ます。
ヘッドショットされた時に頭が転げ落ちるようにする
ヘッドショットされた時にそのまま頭が消えるだけでもいいんですが、例えば頭がゴロンと地面に転がり落ちるという演出をしたい場合があります。
今度はこの機能を作成してみます。
ゾンビの頭のプレハブを作成する
まずはゾンビの頭のプレハブを作成していきます。
まずは敵キャラ(わたしの場合はゾンビz@walk)のモデルをシーン上に配置します。
ヒエラルキー上で選択したまま右クリックからUnpack Prefab Completelyを選択し、普通のゲームオブジェクトとして扱います(古いバージョンのUnityではありません)。
子要素のmesh_Head以外のメッシュを削除します(元のプレハブのモデルに反映しないように気を付けてください)。
わたくしの場合は以下のような感じで選択し削除します。
ヒエラルキー上で右クリックからCreate Emptyを選択し、名前をZombieHeadとします。
ZombieHeadを選択しゾンビも頭の中心に移動させます。
先ほどの頭以外のメッシュを消したゾンビモデルのボーン(Bip01)と頭のメッシュ(mesh_Head)を選択しZombieHeadの子要素に移動させます。
子要素のなくなった元のゾンビモデルはいらないので削除します。
ここまでで以下のような階層になります。
次にZombieHeadにRigidbodyとSphereColliderを追加します。
RigidbodyはUse Gravityにチェックを入れ、重力を働かせ、Massを20にし、Dragを2にします。
SphereColliderのIs Triggerのチェックを外し、他のコライダと接触した時にぶつかるようにします。
ここまで出来たらZombieHeadをAssetsフォルダにドラッグ&ドロップしてプレハブにします。
ヘッドショット処理をスクリプトに追加
次はEnemyの修正です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // ゾンビの頭のプレハブ [SerializeField] private GameObject headPrefab; } else if (tempState == EnemyState.Damage) { animator.ResetTrigger("Attack"); if (targetObj.name == "HitRightUpperFoot" || targetObj.name == "HitRightLowerFoot" || targetObj.name == "HitRightUpperArm" || targetObj.name == "HitRightLowerArm") { animator.SetTrigger("DamageRight"); } else if (targetObj.name == "HitLeftUpperFoot" || targetObj.name == "HitLeftLowerFoot" || targetObj.name == "HitLeftUpperArm" || targetObj.name == "HitLeftLowerArm") { animator.SetTrigger("DamageLeft"); } else { animator.SetTrigger("Damage"); Debug.Log(targetObj.name); if(targetObj.name == "HitHead") { foreach (var item in deleteBody) { item.SetActive(false); } // 頭のプレハブの基点は敵の位置と同じなので敵の位置に登場させる var headInstance = Instantiate<GameObject>(headPrefab, targetObj.position, Quaternion.identity); Destroy(headInstance, 3f); } } navMeshAgent.isStopped = true; |
まずはインスペクタ上で頭のプレハブを指定出来るように変数を宣言します。
SetStateメソッド内の敵の状態がEnemyState.Damageの時に頭部への攻撃だったらその場所に頭部のプレハブのインスタンスを生成し、3秒後に消しています。
頭部のプレハブにはコライダとRigidbodyを取り付けてあるので出現したらそのまま重力が働いて落下します。
頭のプレハブにはRigdbodyを取り付けているので銃口の方向に力を加えて飛ばすようにすることも出来ますが、SetStateメソッドでは銃の向いている方向の情報を取得していない為に今回は特に力を加えていません。
銃口の方向に力を加えてそちらに頭を飛ばしたい時はそういった情報もSetStateメソッドで受け取れるようにするといいかもしれません。
これでヘッドショットがされたら頭がゴロンと下に転がります。
それではUnityの実行ボタンを押して確認してみましょう。
これでバイオハザード風のヘッドショット機能の追加が出来ました。
この記事の内容・・・ゲームの話じゃなければずいぶん怖い話ですね・・・(^_^;)
ヘッドショットした場合にエフェクトを加えるとよりリアルな感じがでそうですね・・・・(;一_一)