Unityメモ

【Unity】ボタンを長押ししている間、n秒おきにボールを発射する仕組み

Unityメモ

1. はじめに

ゲーム開発をしていると、「ボタンを長押しして攻撃を繰り返す」といった仕組みを実装したいと思うことがありますよね。たとえば、プレイヤーがスペースキーを押し続けると、自動的に弾丸が一定間隔で発射される仕組みは、シューティングゲームやアクションゲームでよく使われます。

この記事では、Unityを使って「スペースキーを長押しすると1秒おきにボールがプレイヤーから前方向に発射される」という仕組みをC#スクリプトで実現する方法を解説します。Unity初心者の方でもわかりやすいように、手順を一つひとつ丁寧に説明していきます。

この方法を覚えれば、単純な攻撃以外にも、リズムゲームや防衛ゲームなど、幅広いゲームジャンルで応用が可能です。Unityの基本操作やプレハブ(Prefab)の使い方も解説するので、初心者の方にとってはスキルアップ間違いなし!

では、さっそく始めてみましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



2.準備:Unityプロジェクトを設定

1. 新規プロジェクトを作成しよう

まずはUnityを起動し、新しいプロジェクトを作成します。

  1. Unity Hubを開き、「New Project」をクリックします。
  2. テンプレートとして「3D」を選択し、プロジェクト名をわかりやすい名前(例: AutoShooterProject)に設定します。
  3. 保存場所を指定し、「Create Project」をクリックしてプロジェクトを作成しましょう。

これで基本的なプロジェクトが準備できました!


2. 必要なオブジェクトを配置する

プレイヤーとしてのCubeを配置

  1. ヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選択します。
  2. シーンビューにCubeが配置されます。このCubeがプレイヤーになります。
  3. インスペクターウィンドウでCubeの「Transform」項目を確認し、次のように設定してください。
    • Position: X = 0, Y = 0.5, Z = 0
    • Scale: X = 1, Y = 1, Z = 1
    ※ Cubeが地面の上に浮いているように見えるはずです。

ボールとしてのSphereを配置

  1. 再びヒエラルキーウィンドウで右クリックし、「3D Object」→「Sphere」を選びます。
  2. シーンビューにSphereが追加されます。これが発射されるボールになります。
  3. インスペクターウィンドウで次の設定を行います。
    • Position: X = 0, Y = 1, Z = 0
    • Scale: X = 0.2, Y = 0.2, Z = 0.2
  4. 次に、このSphereに物理挙動を追加します。インスペクターウィンドウの「Add Component」をクリックし、「Rigidbody」を検索して追加してください。

3. ボールのPrefabを作成

ボールをPrefab化することで、スクリプトで簡単に複数のボールを生成できます。

  1. プロジェクトウィンドウの空白部分を右クリックし、「Create Folder」を選択して「Prefabs」という名前のフォルダーを作成します。
  2. ヒエラルキーウィンドウでSphereを選択し、プロジェクトウィンドウ内の「Prefabs」フォルダーにドラッグ&ドロップします。
  3. Sphereが青いアイコンに変わり、Prefabとして保存されます。
  4. ヒエラルキーウィンドウのSphereを削除してください。Prefabとして保存されているので、ヒエラルキーから削除しても問題ありません。

これで、プロジェクトの基本設定が完了しました。次は、この準備したオブジェクトを使用して、発射システムを作るスクリプトを書いていきます!



3. C#スクリプト「AutoShooter」の作成

次に、スペースキーを長押しすると1秒おきにボールを発射する仕組みを作成するためのスクリプトを書いていきます。C#スクリプトを新しく作成し、Cubeにアタッチして動作させましょう!

スクリプトの作成

  1. プロジェクトウィンドウを右クリックします。
  2. 「Create」→「C# Script」を選択します。
  3. スクリプトの名前を「AutoShooter」と入力します。

これで新しいスクリプトが作成されました!

Cubeにスクリプトをアタッチ

  1. ヒエラルキーウィンドウで、Cubeを選択します。
  2. 作成した「AutoShooter」スクリプトをCubeにドラッグ&ドロップします。

これで、スクリプトがCubeにアタッチされました。次に、スクリプトを開いてコードを記述していきましょう。


コードの記述

作成したスクリプトをダブルクリックして開き、以下のコードを入力してください。

using System.Collections;
using UnityEngine;

public class AutoShooter : MonoBehaviour
{
    public GameObject bulletPrefab;  // 発射するボールのPrefab
    public Transform bulletSpawnPoint;  // ボールが発射される位置
    public float shootInterval = 1.0f;  // 発射間隔
    public int ShootPower = 500;        // 発射する力

    private bool isShooting = false;  // 長押し状態を管理するフラグ

    void Update()
    {
        // スペースキーが押されたら発射を開始
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (!isShooting)
            {
                isShooting = true;
                StartCoroutine(ShootBullets());
            }
        }

        // スペースキーが離されたら発射を停止
        if (Input.GetKeyUp(KeyCode.Space))
        {
            isShooting = false;
        }
    }

    IEnumerator ShootBullets()
    {
        // スペースキーが押されている間、ボールを発射
        while (isShooting)
        {
            // ボールを生成して前方向に発射
            GameObject bullet = Instantiate(bulletPrefab, bulletSpawnPoint.position, bulletSpawnPoint.rotation);
            bullet.GetComponent<Rigidbody>().AddForce(transform.forward * ShootPower);  // 前方向に力を加える

            yield return new WaitForSeconds(shootInterval);  // 次の発射まで1秒待つ
        }
    }
}

コードの説明

  • bulletPrefab
     発射するボール(Prefab)を指定するための変数です。
  • bulletSpawnPoint
     ボールが発射される位置を指定するための変数です。
  • shootInterval
     ボールを発射する間隔(秒)を設定します。デフォルトでは1秒ごとに発射されます。
  • ShootPower
     ボールを発射する力(スピード)を設定します。大きな値にすると速く飛びます。
  • Updateメソッド
     スペースキーの押下・解放を検知し、ボール発射のオン・オフを管理します。
  • IEnumerator ShootBullets()
     発射処理を繰り返すコルーチンです。スペースキーが押されている間、ボールを生成して発射します。

注意点

  • bulletPrefabbulletSpawnPoint は、後でインスペクターから設定しますので、今のところは未設定で問題ありません。
  • Rigidbodyコンポーネントがボール(Prefab)に含まれていないと、発射の際にエラーが発生する可能性があります。事前に確認しておきましょう。

これで「AutoShooter」スクリプトの作成と基本的な説明は完了です。次のセクションでは、スクリプトの設定とテストについて解説します!



4. スクリプトの設定とテスト

ここでは、作成したスクリプト「AutoShooter」を設定し、実際に動作を確認する手順を解説します。以下の手順に従って進めていきましょう!

4.1 スクリプトをCubeにアタッチ

  1. ヒエラルキーウィンドウでCubeを選択します。
  2. プロジェクトウィンドウで作成した「AutoShooter」スクリプトを見つけます。
  3. 「AutoShooter」スクリプトをCubeにドラッグ&ドロップしてアタッチします。
  4. インスペクターウィンドウに「AutoShooter」スクリプトが追加されていることを確認してください。

4.2 スクリプトのパラメータを設定

  1. インスペクターウィンドウで「AutoShooter」スクリプトのパラメータが表示されます。
  2. Bullet Prefab:
    • プロジェクトウィンドウから先ほど作成したSphereのPrefabをドラッグ&ドロップします。
  3. Bullet Spawn Point:
    • Cubeの子オブジェクトとして、空のゲームオブジェクトを作成します。
      • ヒエラルキーウィンドウでCubeを右クリックし、「Create Empty」を選択。
      • 作成した空のオブジェクトを「BulletSpawnPoint」とリネームします。
      • BulletSpawnPointをCubeの前方向に配置します(シーンビューで位置を調整してください)。
    • Bullet Spawn Pointフィールドに、この空のゲームオブジェクトをドラッグ&ドロップします。

4.3 テストプレイを実行

  1. **再生ボタン(Playボタン)**を押してテストプレイを開始します。
  2. スペースキーを押し続けると、Cubeの前方向から1秒ごとにSphereが発射されることを確認してください。
  3. 発射されたSphereが物理的に前方に飛んでいき、適切に動作しているか確認します。

4.4 問題が発生した場合

  • Prefabが発射されない場合:
    • Bullet Prefabフィールドに正しくPrefabが設定されているか確認してください。
  • 発射位置が不適切な場合:
    • BulletSpawnPointの位置や向きをシーンビューで調整してください。
  • ボールが飛ばない場合:
    • スクリプトのShootPowerの値を大きくしてみてください。

これでスクリプトの設定とテストは完了です!次に進む前に、動作が正常であることを確認してください。動作確認中に気づいた改善点やアイデアがあれば、自由にスクリプトを編集してみましょう!



5. コードの応用例

ここでは、作成した「AutoShooter」スクリプトを応用して、発射間隔や発射する力を変更したり、発射方向をコントロールする方法を解説します。少しコードを編集するだけで、より自由度の高い発射システムが作れます!


5.1 発射間隔を変更する

発射間隔を変更したい場合は、スクリプト内の shootInterval の値を調整します。この変数は、ボールが発射される間隔を秒単位で制御しています。

変更箇所:

public float shootInterval = 0.5f;  // 発射間隔を0.5秒に変更

これで、ボールが0.5秒おきに発射されるようになります。より頻繁に発射したい場合は値を小さくし、ゆっくり発射したい場合は値を大きくしてください。


5.2 発射する力を変更する

ボールの発射速度を調整するには、スクリプト内の ShootPower を変更します。この値が大きいほど、ボールは遠くまで飛ぶようになります。

変更箇所:

public int ShootPower = 1000;  // 発射する力を強くする

例えば、値を500から1000に変更すると、ボールがより遠くに飛びます。逆に小さい値にすると、近距離で発射されるようになります。


5.3 発射方向をコントロールする

発射方向を変更する場合は、transform.forward の部分を修正します。例えば、Cubeのローカル座標に基づかず、シーン全体の方向に基づいて発射したい場合は、Vector3 を直接指定することも可能です。

変更箇所:

bullet.GetComponent<Rigidbody>().AddForce(Vector3.up * ShootPower);  // 真上に発射

これにより、ボールが上方向に発射されます。以下のように変更することで、別の方向に発射することもできます。

  • 右方向に発射:csharpコードをコピーするVector3.right * ShootPower
  • 斜め上に発射:csharpコードをコピーする(Vector3.forward + Vector3.up).normalized * ShootPower

5.4 発射キーを変更する

スペースキー以外のキーで発射を制御したい場合は、Input.GetKeyDownInput.GetKeyUp の引数を変更します。

変更箇所:

if (Input.GetKeyDown(KeyCode.F))  // Fキーで発射を開始

これにより、Fキーを長押ししてボールを発射する仕組みに変更できます。KeyCode の部分を他のキーに変更することで、好きなキーに割り当てることが可能です。


このセクションでは、簡単な変更で「AutoShooter」の動作をカスタマイズする方法を解説しました。発射間隔や力、方向を自由に調整することで、さまざまなゲームプレイに対応できます。ぜひ自分のゲームに合った設定を試してみてください!



6. まとめ

この記事では、Unityを使ってスペースキーを長押しすることで、1秒おきにボールを発射する仕組みを作成しました。以下のポイントを学びました。

  • プレハブ(Prefab)の作成と活用
    ヒエラルキーに作成したオブジェクトをプレハブとして保存し、効率的に複数のオブジェクトを生成する方法を理解しました。
  • C#スクリプトによる自動発射機能の実装
    スペースキーを長押ししている間、一定の間隔でオブジェクトを生成・発射するスクリプトを作成しました。このスクリプトは「コルーチン(Coroutine)」を活用することで、時間制御を簡単に実現しています。
  • シーンの設定と動作確認
    作成したスクリプトとPrefabをシーン内に設定し、発射位置や方向を調整しながらテストプレイを行いました。

このような仕組みは、シューティングゲームやキャラクターのスキル発動など、さまざまなゲームで応用できます。例えば、発射間隔や発射方向を変えることで、多様な攻撃パターンを実現することも可能です。



よくある質問(FAQ)

Q
Prefabを割り当てたのに発射されない場合は?
A

主に以下の点を確認してください:

  • Prefabが正しく設定されているか
    「AutoShooter」スクリプトの「Bullet Prefab」欄に、作成したボールのPrefabをドラッグ&ドロップしていますか?
  • Rigidbodyの設定
    ボールのPrefabにRigidbodyが追加されていることを確認してください。Rigidbodyがないと物理的な挙動が適用されません。
  • スクリプトのエラー
    スクリプトにエラーがある場合、Unityのコンソールに赤いエラーメッセージが表示されます。それを確認し、問題箇所を修正してください。
Q
発射する方向が意図と異なるときの修正方法は?
A

Cubeの向き(TransformのRotation)が正しいか確認してください。ボールはtransform.forwardの方向に発射されます。具体的には:

  • Cubeの向きを調整
    SceneビューでCubeを選択し、Rotationの値を調整して前方向を確認してください。
  • 発射方向をコードで変更
    スクリプトの以下の部分を修正することで、発射方向を調整できます:
    bullet.GetComponent<Rigidbody>().AddForce(transform.forward * ShootPower);
    たとえば、上方向に発射したい場合はVector3.upを使います:
    bullet.GetComponent<Rigidbody>().AddForce(Vector3.up * ShootPower);
Q
スペースキー以外のキーに変更するには?
A

スクリプト内のKeyCode.Spaceを別のキーに変更してください。例えば、「Fキー」を使いたい場合は以下のように書き換えます:

if (Input.GetKeyDown(KeyCode.F))
{
if (!isShooting)
{
isShooting = true;
StartCoroutine(ShootBullets());
}
}

if (Input.GetKeyUp(KeyCode.F))
{
isShooting = false;
}

Unityではさまざまなキーを指定できるので、必要に応じてキーコード一覧を参照してください。

おすすめのアセット

Shooter 2 | Game Creator 2は、Unityで簡単にシューティングゲームを作成できる強力なツールです。直感的なUIを使い、FPSやTPSなどのシューティングゲームのメカニクスを簡単に実装できます。キャラクターの移動や武器の使用、エイムシステムなどの基本機能が含まれており、カスタマイズも可能です。スクリプトを書くことなく、ビジュアルでゲームプレイを作成できるため、初心者にもおすすめです。