Unityで弾を発射する作り方|Unity6対応・初心者向けシューティング入門 | Unity入門の森 ゲームの作り方

Unityで弾を発射する作り方|Unity6対応・初心者向けシューティング入門

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

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

【永久会員チケット】

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

全講座を見放題で学ぶ

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

「弾を発射したいけど、どうやって作るの?」
「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:弾のプレハブを作る

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

弾のオブジェクトを作る

  1. Hierarchyウィンドウで右クリック→「3D Object」→「Sphere(スフィア)」を選択
  2. 名前を「Bullet」に変更する(Hierarchyで選択してF2キー)
  3. InspectorのTransformのScaleをX:0.3・Y:0.3・Z:0.3に変更して小さくする

BulletにRigidbodyを追加する

弾を物理的に動かすためにRigidbodyを追加します。

  1. HierarchyのBulletを選択した状態で、Inspectorの一番下の「Add Component(アドコンポーネント)」ボタンをクリック
  2. 検索欄に「Rigidbody」と入力
  3. 「Rigidbody」をクリックして追加
  4. InspectorにRigidbodyの欄が追加されることを確認

InspectorにRigidbodyが追加された状態

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

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

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

  1. HierarchyのBulletをProjectウィンドウのAssetsにドラッグ&ドロップ
  2. ProjectにBullet.prefabが作成されることを確認
  3. HierarchyのBulletを右クリック→Deleteで削除する(プレハブ化したので、Scene上のものは不要)

ProjectにBullet.prefabが作成された

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

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

弾を発射するプレイヤーオブジェクトを作ります。

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

HierarchyにPlayerが作られ、Sceneビューに見えている

ステップ3:発射スクリプトを作る

スクリプトを作成する

  1. ProjectウィンドウのAssetsで右クリック
  2. 「Create」→「Scripting」→「MonoBehaviour Script」を選択
  3. ファイル名を「PlayerShooter」にしてEnter

コードを書く

  1. PlayerShooter.csをダブルクリックしてコードエディターで開く
  2. 最初から書いてあるコードを全部消して、以下をコピペする
  3. Ctrl+S(Mac:Command+S)で保存する

コードの意味をひとつずつ確認しよう

  • ① 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オブジェクトに「アタッチ(貼り付け)」する必要があります。

  1. HierarchyのPlayerをクリックして選択する
  2. ProjectのPlayerShooterをInspectorウィンドウにドラッグ&ドロップする
  3. Inspectorに「Player Shooter (Script)」という欄が追加されればアタッチ成功

InspectorにPlayer Shooter (Script)が表示された

ステップ5:InspectorにBullet.prefabをセットする

コードの「①」で作ったbulletPrefab変数に、Bullet.prefabを登録します。

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

InspectorのBullet Prefab欄に「Bullet」がセットされた

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

  1. 画面上部の▶ Playボタンを押してゲームを開始する
  2. Gameビューをクリックしてフォーカスをあてる
  3. スペースキーを押す
  4. Playerの位置から弾が上方向に飛んでいく!
  5. 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に変更するだけです。

transform.upは「このオブジェクトの上方向」という意味です。

プレイヤーが回転しても、その向きに弾が飛ぶようになります。

まとめ

弾の発射処理について、ポイントをまとめます。

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

弾の発射ができたら、次は「敵に当たったら消える」当たり判定を実装していきましょう。

OnTriggerEnterを使った当たり判定の作り方は次の記事で解説します。

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

Unity入門の森では、初心者向けに丁寧な解説動画・講座を多数用意しています。

「次は何を学べばいいかわからない」と感じたら、ぜひ講座をチェックしてくださいね。

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

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

【永久会員チケット】

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

全講座を見放題で学ぶ

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

コメント

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