Unity 3Dシューティングゲームで弾を撃つ作り方|Unity6対応・初心者向け | Unity入門の森 ゲームの作り方

Unity 3Dシューティングゲームで弾を撃つ作り方|Unity6対応・初心者向け

Unity初心者向け入門講座 Unityの使い方・基本操作・ミニゲームの作り方

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

「弾を発射したいけど、どうやって作るの?」
「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」を開きます。

  1. デスクトップまたはスタートメニューからUnity Hubを起動する
  2. 左メニューの「Projects(プロジェクト)」をクリック
  3. 右上の「New project(新規プロジェクト)」ボタンをクリック

テンプレート・プロジェクト名・保存場所を選ぶ

プロジェクト作成画面が開きます。ここで「どんな種類のゲームを作るか」のテンプレートを選びます。

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

Universal 3Dが青くハイライトされて選択されている状態

Universal 3Dを選ぶ理由
「Universal 3D」はUniversal Render Pipeline(URP)という描画システムを使ったテンプレートです。Unity 6では標準的なテンプレートで、軽量かつ高品質な見た目でゲームを作れます。この記事のコードはUniversal 3D前提で書かれています。
プロジェクト名のポイント

  • スペースや日本語は避ける(エラーの原因になることがある)
  • 半角英数字とアンダーバー(_)だけで付けるのが安全
  • 例:ShootingGame、shooting_game など

Unityエディターが起動するまで待つ

「Create project」を押すと、Unityエディターが自動で起動します。

初回は数分かかることがあります。画面が真っ暗なまましばらく動かないこともありますが、止まっているわけではないので待ちましょう。

エディターが開いたら準備完了です。ここからステップ1に進みましょう!

画面の見方がわからない方はこちら
HierarchyやInspectorなど、各ウィンドウの役割がわからない方は先に読んでおくとスムーズです。

ステップ1:弾のプレハブを作る

まず弾として使うプレハブを作ります。

プレハブとは「設計図」のようなもので、ゲーム中に何度でも同じオブジェクトを生成できます。

弾のオブジェクトを作る

  1. Hierarchyウィンドウで右クリック→「3D Object」→「Sphere(スフィア)」を選択
  2. 名前を「Bullet」に変更する(Hierarchyで選択してF2キー)
  3. 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で力を加えることができません。

  1. HierarchyのBulletを選択した状態で、Inspectorの一番下の「Add Component」ボタンをクリック
  2. 検索欄に「Rigidbody」と入力
  3. 「Rigidbody」をクリックして追加

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

ただし、このままだと弾が重力で落下してしまいます。

Rigidbodyの「Use Gravity(ユーズグラビティ)」のチェックを外して重力の影響をなくしておきましょう。

なぜUse Gravityを外すの?
チェックが入ったままだと、発射した弾がすぐに重力で下に落ちてしまいます。「弾が出るけどすぐ落ちてしまう」という場合はここを確認してください。

BulletをプレハブにしてSceneから削除する

  1. HierarchyのBulletをProjectウィンドウのAssetsにドラッグ&ドロップ
  2. ProjectにBullet.prefabが作成されることを確認
  3. HierarchyのBulletを右クリック→Deleteで削除する(Bulletを選択してDeleteでもOK)

プレハブ化できたのでScene上のオブジェクトはもう不要。ゲーム実行時にInstantiateで生成するので削除してOKです。

HierarchyのBulletが消え、Assetsフォルダにプレハブ化したBulletが表示されていたらOKです。(Bulletが青くなっている状態)

これで弾のプレハブが完成しました。

ステップ2:プレイヤーを作る

弾を発射するプレイヤーオブジェクトを作ります。今回はシンプルにCube(立方体)をプレイヤーとして使います。

  1. Hierarchyウィンドウで右クリック→「3D Object」→「Cube」を選択
  2. 名前を「Player」に変更する(F2キー)
  3. InspectorのPositionをX:0・Y:0・Z:0(原点)に設定する

 

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

ステップ3:Unityシューティングゲームの弾を撃つスクリプトを書く

⚠️ このスクリプトはUnity 6のNew Input Systemを使っています。
Universal 3Dテンプレートで作成した場合は最初から入っているので追加作業は不要です。

もしエラーが出た場合は「Window」→「Package Management」→「Package Manager」を開き、「Input System」がIn Projectに表示されているか確認してください。

Input Systemについてはこちらをごらんください。
【Unity6対応】Input.GetAxisでエラーが出る原因と解決法|Input ManagerとInput Systemの違いを初心者向けに解説

 

スクリプトを作成する

  1. ProjectウィンドウのAssetsフォルダ内で右クリック
  2. 「Create」→「Scripting」→「MonoBehaviour Script」を選択
  3. ファイル名を「PlayerShooter」と入力してEnterキーを押す
ファイル名はあとから変えるとエラーの原因になります。必ず最初に「PlayerShooter」という名前で作成してください。

ProjectウィンドウでMonoBehaviour Scriptを作成する操作

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

コードエディターにPlayerShooterのコードが入っている状態

コードを貼り付けて保存した状態

コードを書く

  1. ProjectのPlayerShooter.csをダブルクリックしてコードエディター(Visual Studio等)で開く
  2. 最初から書いてあるコードをCtrl+A(Mac:Command+A)で全選択してDeleteキーで全部消す
  3. 以下のコードをコピーして貼り付ける
  4. Ctrl+S(Mac:Command+S)で保存する

 

 

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にアタッチする

スクリプトは作っただけでは動きません。「アタッチ」という操作でオブジェクトに紐付けて、はじめて動くようになります。

  1. HierarchyのPlayerをクリックして選択する
  2. 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を登録しないと、スクリプトは「どのプレハブを生成すればいいか」わからないためエラーになります。

  1. HierarchyのPlayerが選択されていることを確認する
  2. InspectorのPlayer Shooter (Script)の中に「Bullet Prefab」という欄がある(「None (Game Object)」と表示されているはず)
  3. ProjectウィンドウのAssets直下にある「Bullet」を「Bullet Prefab」の欄にドラッグ&ドロップする

BulletをBullet Prefab欄にドラッグしてセットする操作

 

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

ステップ6:実際に動かしてみよう!

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

Gameビューをクリックしてフォーカスをあてる操作

スペースを押して弾が発射されたら成功です。

スペースキーを押しても反応しない場合は、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に変更するだけです。

transform.upは「このオブジェクトの上方向」という意味です。プレイヤーが回転しても、その向きに弾が飛ぶようになります。

さらに発展させるには?

  • 弾の連射・間隔を設定する:Invokeやタイマーを使うと一定間隔で自動発射できます
  • 敵に当たったら消える:OnTriggerEnterで当たり判定を実装します(別記事で解説)

まとめ|Unity 3Dシューティングゲームで弾を撃つ基本はこれだけ

Gameビューをクリックしてフォーカスをあてる操作

UnityシューティングゲームでDで弾を撃つ処理について、ポイントをまとめます。

  • 弾はプレハブ(Prefab)として作っておき、Instantiateで生成する
  • 弾を動かすにはRigidbodyコンポーネントが必要
  • AddForceでRigidbodyに力を加えて弾を飛ばす
  • Destroy(bullet, 3f)で一定時間後に弾を削除する。忘れるとゲームが重くなる
  • Use Gravityのチェックを外すと重力の影響をなくせる
  • transform.upを使うとプレイヤーの向いてる方向に弾を撃つ3D対応ができる

Unity シューティングゲームの弾が撃てたら、次は「敵に当たったら消える」当たり判定を実装していきましょう。OnTriggerEnterを使った当たり判定の作り方は次の記事で解説します。

C#のコードについて詳しく学びたい方はこちらをご覧ください。

Unity入門の森では、初心者向けに丁寧な解説動画・講座を多数用意しています。「次は何を学べばいいかわからない」と感じたら、ぜひ講座をチェックしてくださいね。

 

【ゲームの作り方講座もプレゼント中!】

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

タイトルとURLをコピーしました