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

シンプルですが、これがシューティングゲームの弾発射の基本形です。
敵に当たったら消す・弾の速度を変えるなど、ここからどんどん応用できます。
弾の発射に必要な3つの知識
実装を始める前に、今回使う3つのキーワードを確認しておきましょう。
Instantiate(インスタンシエイト)
プレハブをゲーム中に生成(コピー)する命令です。
弾を発射するたびにInstantiateで弾のプレハブを生成します。
Rigidbody(リジッドボディ)
オブジェクトに「物理演算」を追加するコンポーネントです。
Rigidbodyをつけると、そのオブジェクトは重力・速度・力などの物理法則の影響を受けるようになります。
弾を動かすためにはRigidbodyが必要です。
AddForce(アドフォース)
Rigidbodyがついたオブジェクトに「力を加える」命令です。
AddForce(Vector3.up * 力の大きさ) と書くことで、上方向に力を加えて弾を飛ばします。
ステップ1:弾のプレハブを作る
まず弾として使うプレハブを作ります。
弾のオブジェクトを作る
- Hierarchyウィンドウで右クリック→「3D Object」→「Sphere(スフィア)」を選択
- 名前を「Bullet」に変更する(Hierarchyで選択してF2キー)
- InspectorのTransformのScaleをX:0.3・Y:0.3・Z:0.3に変更して小さくする
BulletにRigidbodyを追加する
弾を物理的に動かすためにRigidbodyを追加します。
- HierarchyのBulletを選択した状態で、Inspectorの一番下の「Add Component(アドコンポーネント)」ボタンをクリック
- 検索欄に「Rigidbody」と入力
- 「Rigidbody」をクリックして追加
- InspectorにRigidbodyの欄が追加されることを確認

InspectorにRigidbodyが追加された状態
ただし、このままだと弾が重力で落下してしまいます。
Rigidbodyの「Use Gravity(ユーズグラビティ)」のチェックを外して重力の影響をなくしておきましょう。
BulletをプレハブにしてSceneから削除する
- HierarchyのBulletをProjectウィンドウのAssetsにドラッグ&ドロップ
- ProjectにBullet.prefabが作成されることを確認
- HierarchyのBulletを右クリック→Deleteで削除する(プレハブ化したので、Scene上のものは不要)

ProjectにBullet.prefabが作成された
これで弾のプレハブが完成しました。
ステップ2:プレイヤーを作る
弾を発射するプレイヤーオブジェクトを作ります。
- Hierarchyウィンドウで右クリック→「3D Object」→「Cube」を選択
- 名前を「Player」に変更する
- InspectorのPositionをX:0・Y:0・Z:0(原点)に設定する

HierarchyにPlayerが作られ、Sceneビューに見えている
ステップ3:発射スクリプトを作る
スクリプトを作成する
- ProjectウィンドウのAssetsで右クリック
- 「Create」→「Scripting」→「MonoBehaviour Script」を選択
- ファイル名を「PlayerShooter」にしてEnter
コードを書く
- PlayerShooter.csをダブルクリックしてコードエディターで開く
- 最初から書いてあるコードを全部消して、以下をコピペする
- 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); } } } |
コードの意味をひとつずつ確認しよう
- ① public GameObject bulletPrefab:「どの弾プレハブを使うか」をInspectorから指定できるようにする変数
- ② public float bulletSpeed = 10f:弾の速度。10fは「10.0」という意味。Inspectorから数値を変更できる
- ③ Keyboard.current.spaceKey.wasPressedThisFrame:スペースキーが押された瞬間を検知する(Unity 6のInput System対応)
- ④ Instantiate(bulletPrefab, transform.position, Quaternion.identity):プレイヤーの位置(transform.position)に弾を生成する
- ⑤ rb.AddForce(Vector3.up * bulletSpeed, ForceMode.Impulse):弾のRigidbodyに上方向の力を加える。ForceMode.ImpulseはAddForceの種類で「瞬間的な力」という意味
- ⑥ Destroy(bullet, 3f):3秒後に弾オブジェクトを削除する。削除しないと弾が増え続けてゲームが重くなる
ステップ4:スクリプトをPlayerにアタッチする
スクリプトは書いただけでは動きません。Playerオブジェクトに「アタッチ(貼り付け)」する必要があります。
- HierarchyのPlayerをクリックして選択する
- ProjectのPlayerShooterをInspectorウィンドウにドラッグ&ドロップする
- Inspectorに「Player Shooter (Script)」という欄が追加されればアタッチ成功

InspectorにPlayer Shooter (Script)が表示された
ステップ5:InspectorにBullet.prefabをセットする
コードの「①」で作ったbulletPrefab変数に、Bullet.prefabを登録します。
- HierarchyのPlayerが選択されていることを確認する
- InspectorのPlayer Shooter (Script)の中に「Bullet Prefab」という欄がある(「None (Game Object)」と表示されている)
- ProjectウィンドウのAssets直下にある「Bullet」をその欄にドラッグ&ドロップ
- 「None」が「Bullet」に変わればセット完了

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

実行してスペースを押すと弾が発射されている

うまく動きましたか?
弾が動かない場合は次の「つまずきポイント」を確認してみてください。
初心者がつまずきやすいポイント
スペースキーを押しても弾が出ない
以下を順番に確認してみましょう。
- Gameビューをクリックしてフォーカスがあたっているか(フォーカスがないとキー入力が効かない)
- InspectorのBullet Prefab欄にBulletがセットされているか
- PlayerShooterスクリプトがPlayerにアタッチされているか
- Consoleウィンドウに赤いエラーが出ていないか
弾が出るけどすぐ落ちてしまう
Bullet.prefabのRigidbodyの「Use Gravity」にチェックが入っています。
ProjectのBullet.prefabをダブルクリックしてプレハブ編集モードに入り、RigidbodyのUse Gravityのチェックを外してください。
弾のスピードを変えたい
HierarchyのPlayerを選択してInspectorを見ると、Player Shooter (Script)の中に「Bullet Speed」という欄があります。
この数値を変えるだけでスピードが変わります。大きいほど速くなります。
弾が消えずにたまっていく
コードの「⑥ Destroy(bullet, 3f)」が正しく書かれているか確認してください。
この1行がないと弾がどんどん蓄積されてゲームが重くなります。
発展:弾の向きをプレイヤーの向きに合わせるには
今回は「常に上方向」に弾を飛ばしましたが、プレイヤーが向いている方向に飛ばすこともできます。
向きを合わせるには、Vector3.upをtransform.upに変更するだけです。
|
1 2 |
rb.AddForce(transform.up * bulletSpeed, ForceMode.Impulse); |
transform.upは「このオブジェクトの上方向」という意味です。
プレイヤーが回転しても、その向きに弾が飛ぶようになります。
まとめ
弾の発射処理について、ポイントをまとめます。
- 弾はプレハブ(Prefab)として作っておき、Instantiateで生成する
- 弾を動かすにはRigidbodyコンポーネントが必要
- AddForceでRigidbodyに力を加えて弾を飛ばす
- Destroy(bullet, 3f)で一定時間後に弾を削除する。忘れるとゲームが重くなる
- Use Gravityのチェックを外すと重力の影響をなくせる
- transform.upを使うとプレイヤーの向きに合わせた方向に発射できる
弾の発射ができたら、次は「敵に当たったら消える」当たり判定を実装していきましょう。
OnTriggerEnterを使った当たり判定の作り方は次の記事で解説します。
C#のコードについて詳しく学びたい方はこちらをご覧ください。
Unity入門の森では、初心者向けに丁寧な解説動画・講座を多数用意しています。
「次は何を学べばいいかわからない」と感じたら、ぜひ講座をチェックしてくださいね。
現場レベルのゲーム制作が、すべてここで学べます。





コメント