【Unity】FPSで弾を発射し、あたり判定を検知する方法


今回は大きく2部に分けてFPSにおける銃弾の発射、あたり判定について書いていきます。

本記事の内容は以下の通りです。

〇FPS視点で銃から弾を発射させる方法

  • プレーヤーをつくる
  • 銃を用意する(UnityAssetStoreのフリーアセット)
  • FPS視点をつくりだす
  • 弾を発射する
  • 照準器をつくる

〇あたり判定を分ける方法

  • 下準備
  • あたり判定の使いわけ
  • 試し打ち

銃から弾を発射させる方法

プレイヤーをつくる

まずは下準備として銃を撃つプレイヤーをつくっていきます。

Hierarchy→Create→3D Object→Plane Planeの名前を「Ground」にし、地面をつくっていきます。

地面作成

色はMaterialを使用して好きな色を付けてください。

Scaleはお好きな大きさに設定してください。

Hierarchy→Create→Create Empty の手順で新しくフォルダを作成してください。

名前を「Player」に変更してください。

Player作成

Positionを「Ground」より上に来るように配置しておきましょう。

銃を用意する

次に銃を配置していきます。

お好きな銃のモデルをUnityのアセットストア等でプロジェクトにインポートしてください。

アセット_AKM_インポート

インポートが完了したら、銃のファイルをHierarchyエリアにドラッグ&ドロップしてください。名前を「Gun」に変更してください。

AKM_ドラッグアンドドロップ

このままだと「Gun」が「Ground」に埋まってしまっているのでPositionのY軸座標を調整して任意の高さに変更してください。Scaleはお好きな値に設定してください。

AKM_高さ変更

FPS視点を作り出す

「Main Camera」の名前を「FPS Camera」に変更して下さい。

「FPS Camera」のPositionを一人称視点になるように調整してください。

一人称視点

銃のPositionが( X : 0 ,Y : 2 ,Z : 0 )の時

「FPS Camera」のPositionを( X :-0.5 ,Y : 2.5 ,Z : -1.15 )に設定すると上記の画像のようになります。この場合、右利きの視点になります。

次に「FPS Camera」を「Player」の子オブジェクトにしてください。

続いて「Gun」を「FPS Camera」の子オブジェクトにしてください。

Player_FPSCamera_Gun_親子関係

マウスの動きとカメラを連動させる

狙いを定められるようにマウス操作とFPS Cameraを連動させていきます。

Project→Create→C#Script を選択し名前を「CameraController」とします。

以下のコードを入力してください。

 

入力が完了したら、「CameraController」スクリプトを「FPS Camera」にドラッグ&ドロップしてください。

CameraController_ドラッグアンドドロップ

下記の画像の個所を調整することでカメラの感度を変更できます。

CameraController_感度変更

マウスを動かした方向にカメラが動けば成功です。

*動作していることをわかりやすくするために「Ground」の四つ角にそれぞれ色違いのCubeを配置しています。

FPSらしくなってきましたね。

CameraController_動作確認

弾を発射する

いよいよ射撃のオブジェクトの作成に入ります。

「Player」が「Gun」をうてるようにしていきます。搭載する機能としては「連射機能」と「リロード機能」です。

Project→Create→C#Script を選択し名前を「Shooting」とします。

以下のコードを入力してください。

 

次にHierarchy→Create→Create Emptyで新しくオブジェクトをつくり名前を「Shooting」に変更してください。

Positionを「Gun」オブジェクトの銃口の少し前に設定しましょう。

Shootingオブジェクト_位置(横)

Shootingオブジェクト_位置(真上)

 

「Shooting」スクリプトを「Shooting」オブジェクトにドラッグ&ドロップしてください。

そのあと「Shooting」オブジェクトを「Gun」の子オブジェクトにしてください。

ShootingScript_ShootingObject_Gun

「ShotCount」が弾倉に込められる弾数、「ShotSpeed」が弾速を表しています。

お好きな値で設定してください。

弾数_弾速_変更

弾薬をつくる

Unityのアセットストアにも弾薬のアセットがたくさん存在するので、興味がある方はそちらでも構いません。

今回はSphereを用います。

Hierarchy→Create→3D Object→Sphereの手順でSphereを作成し、名前を「Shell」に変更してください。

Position、Scale、は自由に設定してください。

Shell→Add Component→Physics→Rigidbodyと設定してください。その際に“Use Gravity”を解除しておくと、弾の勢いが減衰することなくまっすぐ飛ぶようになります。

Shell設定

そのあと、「Shell」をPrefab化します。

Project→Create→Folderを選択しフォルダ名を「Prefab」とします。

「Prefab」フォルダに「Shell」をドラッグ&ドロップします。

Shell_Prefab化

「Shell」のPrefab化が完了したらHierarchyエリアのShellは削除します。

次に「Gun」の子オブジェクトの「Shooting」をクリックしてください。

先ほどPrefab化した「Shell」を「Bullet Prefab」にドラッグ&ドロップしてください。

ShellPrefab_ドラッグ&ドロップ

ついに銃弾を撃てるようになりました。

再生ボタンを押して試してみましょう。

左クリックで射撃、「R」でリロード(弾の補充)ができたら成功です。

照準器をつける

以上の設定で様々な方向に銃を撃てるようにはなりましたが、狙いをうまく定められません。そこで画面上に照準器を表示していきます。

Hierarchy→Create→UI→Imageを作成しImageの名前を「AimAssist」に変更してください。

次にお好きな照準器の画像をUnityにインポートしてください。

使用する照準器の画像を選択し、Inspectorエリアの“Texture Type”を変更します。

カーソル_タイプ変更

上記の画像のように“Sprite(2D and UI)”を選択してください。

選択ができたらどこでもいいので余白をクリックしてください。すると下記の画像が表記されるので“Apply”をクリックしてください。

ここまでの設定が完了したらまず「AimAssist」をクリックしInspectorエリアを表示してください。

カーソルの画像をInsapectorエリアのSource Imageにドラッグ&ドロップしてください。

カーソル画像_D&G

Inspectorエリア上部で照準器の大きさや位置を任意で変更してください。

カーソル位置変更

*銃弾が照準器の真ん中に飛んでいくように微調整すると狙った個所に飛んでいくようになります。

カーソル画像_配置_動作確認1

敵のあたり判定を分ける方法

下準備

Hierarchy→Create→3DObjectから

Sphere ×1 名前を「Head」に変更。

Cube ×1 名前を「Body」に変更。

Cylinder ×4 それぞれ名前を「Right_Arm」「Left_Arm」「Right_Leg」「Left_Leg」に変更。

それぞれのTransformを任意の値で調整し、人型になるように配置します。

Enemy_作成方法

HierarchyエリアでCreate Emptyを選択し名前を「Enemy」に変更してください。

「Head」「Body」「Right_Arm」「Left_Arm」「Right_Leg」「Left_Leg」オブジェクトを「Enemy」の子オブジェクトにしてください。

Enemy_子オブジェクト

あたり判定の使いわけ

このまま銃弾を「Enemy」に当てたとしても

あたり判定‗反射

このように弾が反射してしまいます。

ここであたり判定が必要になってきます。

「Enemy」にHPをつける

まず下準備として「Enemy」のHP設定をつくっていきます。

Project→Create→C#Script を選択し名前を「HP」とします。

以下のコードを入力してください。

「Shell」が「Enemy」にあたった際に、「HP」すなわち体力が減り、0になった時にオブジェクトが破壊されるように設定されています。

入力が完了したら「HP」スクリプトを「Enemy」オブジェクトにドラッグ&ドロップしてください。

HP_D&G

「HP」はお好きな値で設定してください。

HP設定

ダメージ量を体の部位によって変える

銃弾、すなわち「Shell」が敵オブジェクトにあたった際に破壊(Destroy)される仕様を作成していきます。

Project→Create→C#Script を選択し名前を「DestroyObject」とします。

以下のコードを入力してください。

このスクリプトは「Enemy」に「Shell」が当たった際のダメージ量を、任意で設定できるようにしたものです。そのためには「Enemy」オブジェクトに「Shell」オブジェクトを「Shell」と認識させる必要があります。

上記スクリプトにも書いてあるように「Shell」にTag付けをします。AssetsエリアのPrefabフォルダを開き「Shell」を選択してください。

Shell_Tag付け

Inspectorエリアの“Untagged”をクリックし“Add Tag…”を選択してください。

次に“+“をクリックしTagの名前を”Shell“にしてSaveします。

Saveが完了したらもう一度Prefabフォルダの「Shell」を開きInspectorエリアの“Untagged”をクリックします。

Shell_Tag付け_完了

すると先ほど追加した“Shell”のTagが選択できるようになっているはずです。

上記の画像の手順で“Shell”のTagを選択してTag付け完了です。

続いて先ほど作成した「DestroyObject」スクリプトを「Enemy」の子オブジェクトに割り振ってください。

Destroy_D&G

上記の画像のように「Head」以外の子オブジェクトにも割り振ってください。

ダメージ割り振り

それぞれ任意で各部位のダメージ量を設定してください。上記の画像は「Head」にあたった際のダメージ量です。

以上で設定は終了です。試し打ちをしてみましょう。

試し打ち

* 「Enemy」: HP.100 に対して

「Head」: 100

「Body」: 25

「Right_Arm」「Left_Arm」「Right_Leg」「Left_Leg」: 20

のダメージ量で設定しています。

「Body」にあたった場合(25ダメージ)

体の場合

 

「Right_Arm」(手足)にあたった場合(20ダメージ)

手足の場合

 

「Head」にあたった(100ダメージ・即死)の場合

ヘッドショットの場合

それぞれ設定したダメージが「Enemy」のHPに反映されていることが確認できれば成功です。

ダメージ量を調整することで、FPSゲームでよく見るヘッドショット機能も実現することができます。

まとめ

いかがだったでしょうか。

今回はFPSにおけるあたり判定の使い分けについて触れてきました。今回作成したスクリプトは合計4つですが、使い方次第でFPSの基本的な構造を作り出すことができます。

少しでも興味を持っていただけたら幸いです。


この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!