現場レベルのゲーム制作が、すべてここで学べます。
「Instantiateは使ったけど、弾が動かない…」
「Rigidbodyって何?AddForceって何?」
Unityで3Dシューティングゲームを作るとき、最初の壁になるのが「弾の発射処理」です。
この記事では、スペースキーを押すと弾が上方向に飛ぶシンプルな発射処理を、ゼロから実装していきます。Unity シューティングゲームの作り方として、まずは弾を撃つ基本をしっかり押さえましょう。
- 使用バージョン:Unity 6.3 LTS(6000.3.11f1)
- 使用テンプレート:Universal 3D
プレハブ・Rigidbody・AddForceという3つのキーワードを使います。プレハブをまだ理解していない方は先にこちらをご覧ください。
完成イメージ
この記事で作るものはこちらです。
- 画面中央に「プレイヤー(Cube)」が置かれている
- スペースキーを押すと弾(小さいCube)が上方向に飛んでいく
- 弾は一定時間後に自動で消える

シンプルですが、これがシューティングゲームの弾発射の基本形です。
敵に当たったら消す・弾の速度を変えるなど、ここからどんどん応用できます。
この記事では、以下の6ステップで実装します。
弾の発射に必要な3つの知識
実装を始める前に、今回使う3つのキーワードを確認しておきましょう。
Instantiate(インスタンシエイト)
プレハブをゲーム中に生成(コピー)する命令です。
弾を発射するたびにInstantiateで弾のプレハブを生成します。
Rigidbody(リジッドボディ)
オブジェクトに「物理演算」を追加するコンポーネントです。
Rigidbodyをつけると、そのオブジェクトは重力・速度・力などの物理法則の影響を受けるようになります。
弾を動かすためにはRigidbodyが必要です。
AddForce(アドフォース)
Rigidbodyがついたオブジェクトに「力を加える」命令です。
AddForce(Vector3.up * 力の大きさ) と書くことで、上方向に力を加えて弾を飛ばします。
事前準備:Unityプロジェクトを新規作成する
まだプロジェクトを作っていない方は、ここから始めましょう。すでにプロジェクトがある方はステップ1に進んでください。
Unity Hubを起動する
Unityのプロジェクト管理ツール「Unity Hub」を開きます。
- デスクトップまたはスタートメニューからUnity Hubを起動する
- 左メニューの「Projects(プロジェクト)」をクリック
- 右上の「New project(新規プロジェクト)」ボタンをクリック

テンプレート・プロジェクト名・保存場所を選ぶ
プロジェクト作成画面が開きます。ここで「どんな種類のゲームを作るか」のテンプレートを選びます。
- 上部のUnityバージョンが6000.3.XXfX LTSになっていることを確認する(今回は6000.3.11f1 LTSを使用)
- テンプレート一覧から「Universal 3D」を選択する
- 右側の「Project name(プロジェクト名)」欄に名前を入力する
例:ShootingGame(半角英数字推奨。日本語はエラーの原因になることがある) - 「Location(保存場所)」が自分のわかりやすい場所になっているか確認する
デフォルトはドキュメントフォルダなのでそのままでもOK(今回はC\work\Unityを選択) - 右下の「Create project(プロジェクトを作成)」ボタンをクリック

「Universal 3D」はUniversal Render Pipeline(URP)という描画システムを使ったテンプレートです。Unity 6では標準的なテンプレートで、軽量かつ高品質な見た目でゲームを作れます。この記事のコードはUniversal 3D前提で書かれています。
- スペースや日本語は避ける(エラーの原因になることがある)
- 半角英数字とアンダーバー(_)だけで付けるのが安全
- 例:ShootingGame、shooting_game など
Unityエディターが起動するまで待つ
「Create project」を押すと、Unityエディターが自動で起動します。
初回は数分かかることがあります。画面が真っ暗なまましばらく動かないこともありますが、止まっているわけではないので待ちましょう。
エディターが開いたら準備完了です。ここからステップ1に進みましょう!
HierarchyやInspectorなど、各ウィンドウの役割がわからない方は先に読んでおくとスムーズです。
ステップ1:弾のプレハブを作る
まず弾として使うプレハブを作ります。
プレハブとは「設計図」のようなもので、ゲーム中に何度でも同じオブジェクトを生成できます。
弾のオブジェクトを作る
- Hierarchyウィンドウで右クリック→「3D Object」→「Sphere(スフィア)」を選択
- 名前を「Bullet」に変更する(Hierarchyで選択してF2キー)
- InspectorのTransformのScaleをX:0.3・Y:0.3・Z:0.3に変更して小さくする
※ デフォルトのScaleは1なので、そのままだとPlayerと同じ大きさになります。弾らしく見せるために0.3に小さくしておきましょう。

HierarchyにBulletが追加され、InspectorのScaleがX・Y・Z全て「0.3」になっていればOKです。

BulletにRigidbodyを追加する
弾を物理的に動かすためにRigidbodyを追加します。RigidbodyがないとAddForceで力を加えることができません。
- HierarchyのBulletを選択した状態で、Inspectorの一番下の「Add Component」ボタンをクリック
- 検索欄に「Rigidbody」と入力
- 「Rigidbody」をクリックして追加

InspectorにRigidbodyの欄が追加されたらOKです。

ただし、このままだと弾が重力で落下してしまいます。
Rigidbodyの「Use Gravity(ユーズグラビティ)」のチェックを外して重力の影響をなくしておきましょう。

チェックが入ったままだと、発射した弾がすぐに重力で下に落ちてしまいます。「弾が出るけどすぐ落ちてしまう」という場合はここを確認してください。
BulletをプレハブにしてSceneから削除する
- HierarchyのBulletをProjectウィンドウのAssetsにドラッグ&ドロップ
- ProjectにBullet.prefabが作成されることを確認
- HierarchyのBulletを右クリック→Deleteで削除する(Bulletを選択してDeleteでもOK)

プレハブ化できたのでScene上のオブジェクトはもう不要。ゲーム実行時にInstantiateで生成するので削除してOKです。
HierarchyのBulletが消え、Assetsフォルダにプレハブ化したBulletが表示されていたらOKです。(Bulletが青くなっている状態)

これで弾のプレハブが完成しました。
ステップ2:プレイヤーを作る
弾を発射するプレイヤーオブジェクトを作ります。今回はシンプルにCube(立方体)をプレイヤーとして使います。
- Hierarchyウィンドウで右クリック→「3D Object」→「Cube」を選択
- 名前を「Player」に変更する(F2キー)
- InspectorのPositionをX:0・Y:0・Z:0(原点)に設定する

HierarchyにPlayerが作成され、InspectorのPositionがX:0・Y:0・Z:0だったらOKです。

ステップ3:Unityシューティングゲームの弾を撃つスクリプトを書く
Universal 3Dテンプレートで作成した場合は最初から入っているので追加作業は不要です。
もしエラーが出た場合は「Window」→「Package Management」→「Package Manager」を開き、「Input System」がIn Projectに表示されているか確認してください。
Input Systemについてはこちらをごらんください。
【Unity6対応】Input.GetAxisでエラーが出る原因と解決法|Input ManagerとInput Systemの違いを初心者向けに解説


スクリプトを作成する
- ProjectウィンドウのAssetsフォルダ内で右クリック
- 「Create」→「Scripting」→「MonoBehaviour Script」を選択
- ファイル名を「PlayerShooter」と入力してEnterキーを押す

ProjectのAssetsフォルダにPlayerShooter.csができていればOKです。

コードを貼り付けて保存した状態
コードを書く
- ProjectのPlayerShooter.csをダブルクリックしてコードエディター(Visual Studio等)で開く
- 最初から書いてあるコードをCtrl+A(Mac:Command+A)で全選択してDeleteキーで全部消す
- 以下のコードをコピーして貼り付ける
- Ctrl+S(Mac:Command+S)で保存する
|
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 27 28 29 |
using UnityEngine; using UnityEngine.InputSystem; public class PlayerShooter : MonoBehaviour { // ① 弾のプレハブをセットする変数 public GameObject bulletPrefab; // ② 弾の速度 public float bulletSpeed = 10f; void Update() { // ③ スペースキーを押したとき if (Keyboard.current.spaceKey.wasPressedThisFrame) { // ④ プレイヤーの位置に弾を生成する GameObject bullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity); // ⑤ 弾のRigidbodyに上方向の力を加える Rigidbody rb = bullet.GetComponent<Rigidbody>(); rb.AddForce(Vector3.up * bulletSpeed, ForceMode.Impulse); // ⑥ 3秒後に弾を自動で消す Destroy(bullet, 3f); } } } |

PlayerShooter.csにコードを入力して、Unityに戻ってきたらOKです。

コードの意味をひとつずつ確認しよう
- ① public GameObject bulletPrefab:「どの弾プレハブを使うか」をInspectorから指定できるようにする変数。あとでBullet.prefabをここに登録します
- ② public float bulletSpeed = 10f:弾の速度。「10f」は「10.0」という意味。Inspectorから自由に数値を変更できます
- ③ Keyboard.current.spaceKey.wasPressedThisFrame:スペースキーが押された瞬間(1フレームだけ)を検知します。Unity 6のInput Systemの書き方です
- ④ Instantiate(bulletPrefab, transform.position, Quaternion.identity):プレイヤーの位置(transform.position)に弾のプレハブを生成します。Quaternion.identityは「回転なし(初期の向き)」という意味
- ⑤ rb.AddForce(Vector3.up * bulletSpeed, ForceMode.Impulse):弾のRigidbodyに上方向の力を加えます。ForceMode.Impulseは「瞬間的な力を加える」という意味で、ボールを投げるような動きになります
- ⑥ Destroy(bullet, 3f):3秒後に弾オブジェクトを削除します。これがないと弾がどんどん蓄積されてゲームが重くなるので必ず書きましょう
ステップ4:スクリプトをPlayerにアタッチする
スクリプトは作っただけでは動きません。「アタッチ」という操作でオブジェクトに紐付けて、はじめて動くようになります。
- HierarchyのPlayerをクリックして選択する
- ProjectのPlayerShooter.csをInspectorウィンドウにドラッグ&ドロップする

Inspectorに「Player Shooter (Script)」という欄が追加されればアタッチ成功です。

Inspectorに「Player Shooter (Script)」が表示されない場合、HierarchyでPlayerが選択されていない可能性があります。Hierarchyで「Player」をクリックしてから、もう一度ドラッグ&ドロップを試してみてください。
ステップ5:InspectorにBullet.prefabをセットする
コードの「①」で作ったbulletPrefab変数に、Bullet.prefabを登録します。
現時点ではInspectorの「Bullet Prefab」欄が「None(空)」の状態です。
ここにBullet.prefabを登録しないと、スクリプトは「どのプレハブを生成すればいいか」わからないためエラーになります。
- HierarchyのPlayerが選択されていることを確認する
- InspectorのPlayer Shooter (Script)の中に「Bullet Prefab」という欄がある(「None (Game Object)」と表示されているはず)
- ProjectウィンドウのAssets直下にある「Bullet」を「Bullet Prefab」の欄にドラッグ&ドロップする

「None」が「Bullet」に変わればセット完了です。

ステップ6:実際に動かしてみよう!
- 画面上部の▶ Playボタンを押してゲームを開始する
- スペースキーを押す
- Playerの位置から弾が上方向に飛んでいく!
- Hierarchyを見ると「Bullet(Clone)」が生成され、3秒後に自動で消えることを確認できる

スペースを押して弾が発射されたら成功です。
スペースキーを押しても反応しない場合は、Gameビューをクリックしてからもう一度試してみてください。

初心者がつまずきやすいポイント
弾が動かない場合は次の「つまずきポイント」を確認してみてください。
スペースキーを押しても弾が出ない
以下を順番に確認してみましょう。
- Gameビューをクリックしてフォーカスがあたっているか(フォーカスがないとキー入力が効かない)
- InspectorのBullet Prefab欄に「Bullet」がセットされているか(「None」のままになっていないか)
- PlayerShooterスクリプトがPlayerにアタッチされているか
- Consoleウィンドウ(Window→General→Console)に赤いエラーが出ていないか
「using UnityEngine.InputSystem;」でエラーが出る
Input Systemパッケージが正しく入っていない可能性があります。
「Window」→「Package Management」→「Package Manager」を開き、「Input System」がIn Projectに表示されているか確認してください。
「NullReferenceException」というエラーが出る
InspectorのBullet Prefab欄が「None(空)」のままになっている可能性があります。
ステップ5を見直して、Bullet.prefabをセットしてください。
弾が出るけどすぐ落ちてしまう
Bullet.prefabのRigidbodyの「Use Gravity」にチェックが入っています。
ProjectのBullet.prefabをダブルクリックしてプレハブ編集モードに入り、RigidbodyのUse Gravityのチェックを外してください。
弾のスピードを変えたい
HierarchyのPlayerを選択してInspectorを見ると、Player Shooter (Script)の中に「Bullet Speed」という欄があります。この数値を変えるだけでスピードが変わります。大きいほど速くなります。
弾が消えずにたまっていく
コードの「⑥ Destroy(bullet, 3f)」が正しく書かれているか確認してください。この1行がないと弾がどんどん蓄積されてゲームが重くなります。
発展:Unityで向いてる方向に弾を撃つ3D対応の書き方
今回は「常に上方向」に弾を飛ばしましたが、プレイヤーが向いている方向に飛ばすこともできます。向きを合わせるには、Vector3.upをtransform.upに変更するだけです。
|
1 2 |
rb.AddForce(transform.up * bulletSpeed, ForceMode.Impulse); |
transform.upは「このオブジェクトの上方向」という意味です。プレイヤーが回転しても、その向きに弾が飛ぶようになります。
- 弾の連射・間隔を設定する:Invokeやタイマーを使うと一定間隔で自動発射できます
- 敵に当たったら消える:OnTriggerEnterで当たり判定を実装します(別記事で解説)
まとめ|Unity 3Dシューティングゲームで弾を撃つ基本はこれだけ

UnityシューティングゲームでDで弾を撃つ処理について、ポイントをまとめます。
- 弾はプレハブ(Prefab)として作っておき、Instantiateで生成する
- 弾を動かすにはRigidbodyコンポーネントが必要
- AddForceでRigidbodyに力を加えて弾を飛ばす
- Destroy(bullet, 3f)で一定時間後に弾を削除する。忘れるとゲームが重くなる
- Use Gravityのチェックを外すと重力の影響をなくせる
- transform.upを使うとプレイヤーの向いてる方向に弾を撃つ3D対応ができる
Unity シューティングゲームの弾が撃てたら、次は「敵に当たったら消える」当たり判定を実装していきましょう。OnTriggerEnterを使った当たり判定の作り方は次の記事で解説します。
C#のコードについて詳しく学びたい方はこちらをご覧ください。
Unity入門の森では、初心者向けに丁寧な解説動画・講座を多数用意しています。「次は何を学べばいいかわからない」と感じたら、ぜひ講座をチェックしてくださいね。
現場レベルのゲーム制作が、すべてここで学べます。







コメント