UnityUnityメモ

UnityでクリックするたびにPrefabを切り替えて発射する方法【初心者向け】

Unity

1. はじめに

Unityでゲームを作るとき、クリックでオブジェクトを発射する仕組みは、シューティングゲームやターゲット練習ゲームなどでよく使われる基本的な機能です。さらに、発射するオブジェクト(Prefab)をクリックのたびに切り替えることができれば、より幅広いアイデアに応用できます。

例えば、以下のようなシーンで活用できます:

  • ターゲット練習:異なる種類の弾丸を使い分けてターゲットを狙う。
  • パズルゲーム:発射するボールの種類を切り替えて特定の仕掛けを作動させる。
  • エフェクト表現:クリックごとに色や形の違うエフェクトを発生させる。

本記事では、初心者でもわかりやすく、以下の3つの内容を順番に解説していきます:

  1. クリックでPrefabを順番に発射する方法
  2. UIボタンを使って発射するPrefabを切り替える方法
  3. 一時停止ボタンで発射機能を制御する方法

ゲーム開発を始めたばかりの方でも理解しやすいように、スクリプトの作成方法からUnityの操作手順まで丁寧に説明していきます。それでは早速始めましょう!


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



2. 事前準備

実際に機能を作成する前に、プロジェクトを準備します。今回は、3種類の色が異なるボール(Sphere)をPrefabとして作成します。このPrefabを発射するスクリプトを後で適用します。


1. Unityプロジェクトの新規作成

  1. Unityを起動し、「New Project」をクリックします。
  2. プロジェクト名を入力し、テンプレートを「3D」に設定して「Create Project」をクリックします。

2. ボール用Prefabの作成

  1. 3Dオブジェクトを作成
    • Hierarchyウィンドウを右クリックし、「3D Object」→「Sphere」を選択します。
    • これでシーンに球体(Sphere)が追加されます。
  2. 球体に色をつける
    • Materialを作成:Projectウィンドウを右クリックし、「Create」→「Material」を選択します。
    • 作成したMaterialを選択し、Inspectorウィンドウで「Albedo」の色を変更します(例:赤、青、緑)。
    • Materialを球体にドラッグ&ドロップして色を適用します。
  3. Prefab化
    • Hierarchyにある球体をProjectウィンドウにドラッグ&ドロップします。
    • 同じ手順で、異なる色の球体を3種類作成し、それぞれPrefabにします。

3. Rigidbodyの追加

発射時に物理的な動きを加えるため、各PrefabにRigidbodyコンポーネントを追加します。

  1. Projectウィンドウで作成したPrefabをダブルクリックして編集モードに入ります。
  2. Inspectorウィンドウの「Add Component」をクリックし、「Rigidbody」を選択して追加します。
  3. 「Use Gravity」のチェックを外します(重力を無効化するため)。

4. スクリプト用オブジェクトの準備

  1. 空のGameObjectを作成
    • Hierarchyウィンドウで右クリックし、「Create Empty」を選択します。
    • 作成した空のGameObjectを「Shooter」とリネームします。
  2. Scriptsフォルダの作成
    • Projectウィンドウで右クリックし、「Create」→「Folder」を選択します。
    • フォルダ名を「Scripts」とします。

これで事前準備は完了です!次に、スクリプトを作成して、クリックごとにPrefabを発射する機能を実装していきます。



3. クリックごとにPrefabを切り替えながら発射する方法

ここでは、クリックするたびに順番にPrefab(ボール)を切り替えながら発射する方法を解説します。
スクリプト作成から適用まで、初心者でも分かりやすい手順で進めます。


1. スクリプトの作成

  1. 新しいスクリプトを作成
    • Projectウィンドウで「Scripts」フォルダを右クリックし、「Create」→「C# Script」を選択します。
    • スクリプト名をBallShooterとしてください。
  2. スクリプトにコードを記述
    • 作成したBallShooterスクリプトをダブルクリックして開き、以下のコードを入力します:
using UnityEngine;

public class BallShooter : MonoBehaviour
{
    public GameObject[] ballArray; // 発射するPrefabを格納する配列
    private int count; // 現在のPrefabのインデックス

    void Start()
    {
        count = 0; // 最初のPrefabを指定
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウスの左クリックを検知
        {
            // 現在のPrefabを発射
            GameObject ball = Instantiate(ballArray[count], transform.position, Quaternion.identity);
            Rigidbody rb = ball.GetComponent<Rigidbody>();
            
            // 発射方向に力を加える
            if (rb != null)
            {
                rb.AddForce(transform.forward * 3000);
            }

            // 次のPrefabに切り替え
            count = (count + 1) % ballArray.Length;
        }
    }
}
  • コードのポイント
    • ballArray配列にPrefabを格納。
    • count変数で現在のPrefabを追跡し、クリックごとに次のPrefabに切り替えます。
    • %演算子を使用して、最後のPrefabに到達したら最初に戻るようにしています。

2. スクリプトのアタッチ

  1. スクリプトをGameObjectに追加
    • HierarchyウィンドウでShooterオブジェクトを選択します。
    • 作成したBallShooterスクリプトをドラッグ&ドロップしてShooterにアタッチします。
  2. Prefabを設定
    • Shooterを選択した状態で、Inspectorウィンドウを確認します。
    • BallShooterスクリプトのBall Arrayフィールドに3種類のPrefabをドラッグ&ドロップして設定します。

3. 実行と確認

  1. プレイモードで実行
    • Unityエディタで「Play」ボタンをクリックします。
    • マウスの左クリックを押すと、3種類のPrefabが順番に発射されることを確認します。
  2. 動作確認ポイント
    • ボールが順番に発射されているか。
    • Rigidbodyが正しく適用されているか(ボールが飛ぶ)。
    • 発射方向が意図した方向(GameObjectのforward方向)になっているか。

これで、クリックするたびにPrefabを順番に切り替えて発射する仕組みが完成しました!次は、UIボタンで発射するPrefabを手動で切り替える方法を解説します。



4. UIボタンで発射するPrefabを手動で切り替える方法

ここでは、UnityのUIボタンを使用して、発射するPrefabを手動で切り替える方法を解説します。ボタンをクリックするたびに、異なるPrefabを選択できる仕組みを実装します。


1. UIボタンの作成

  1. UI Canvasの作成
    • Hierarchyウィンドウで右クリックし、「UI」→「Canvas」を選択します。
    • これにより、UIを配置するためのキャンバスがシーンに追加されます。
  2. ボタンの追加
    • Canvasを右クリックし、「UI」→「Button」を選択します。
    • 作成されたボタンを「Button1」とリネームします。
    • Prefabの数(例:3つ)だけボタンを複製し、それぞれ「Button2」「Button3」にリネームします。
  3. ボタンのデザイン変更(任意)
    • ボタンの「Text」オブジェクトを選択し、Inspectorの「Text」フィールドに「Prefab1」「Prefab2」「Prefab3」などと入力します。
    • ボタンの配置を調整し、見やすくレイアウトします。

2. スクリプトの変更

  1. スクリプトの編集
    • 先ほど作成したBallShooterスクリプトを開き、以下のように編集します:
using UnityEngine;
using UnityEngine.EventSystems;

public class BallShooter : MonoBehaviour
{
    public GameObject[] ballArray; // 発射するPrefabを格納する配列
    private int selectedPrefabIndex = 0; // 選択されたPrefabのインデックス

    // UIボタンから呼び出されるメソッド
    public void SelectPrefab(int index)
    {
        selectedPrefabIndex = index;
    }

    void Update()
    {
        // UI上で操作中なら発射を無効化
        if (EventSystem.current.IsPointerOverGameObject())
        {
            return;
        }

        if (Input.GetMouseButtonDown(0)) // マウスの左クリックを検知
        {
            // 選択されたPrefabを発射
            GameObject ball = Instantiate(ballArray[selectedPrefabIndex], transform.position, Quaternion.identity);
            Rigidbody rb = ball.GetComponent<Rigidbody>();

            if (rb != null)
            {
                rb.AddForce(transform.forward * 3000);
            }
        }
    }
}
  1. コードのポイント
    • SelectPrefabメソッドでPrefabの選択を切り替えられるようにします。
    • UI操作中(ボタンを押している状態)は発射が無効になるように、EventSystem.current.IsPointerOverGameObject()を使用。

3. ボタンに関数を登録

  1. Button1の設定
    • 「Button1」を選択し、Inspectorで「On Click ()」イベントを確認します。
    • 「+」ボタンをクリックし、Shooterオブジェクトをドラッグ&ドロップします。
    • 関数リストからBallShooter → SelectPrefabを選択し、引数に0を指定します。
  2. Button2, Button3の設定
    • 同じ手順で「Button2」「Button3」にもSelectPrefabを設定し、それぞれ引数に12を指定します。

4. 実行と確認

  1. プレイモードで実行
    • Unityエディタで「Play」ボタンをクリックします。
    • UIボタンをクリックしてPrefabを選択し、その後マウスの左クリックで発射してみましょう。
  2. 動作確認ポイント
    • ボタンをクリックするたびに、選択されるPrefabが正しく切り替わるか。
    • 発射されるPrefabがボタンで選択したものになっているか。

これで、UIボタンを使って発射するPrefabを手動で切り替える仕組みが完成しました!次は、発射機能を一時停止する方法を解説します。



5. 発射機能を一時停止する方法

ここでは、発射機能を一時停止できるようにする方法を解説します。これにより、プレイヤーが必要に応じて発射を一時停止したり再開したりできるようになります。


1. スクリプトの変更

  1. 一時停止フラグの追加
    • BallShooterスクリプトを開き、以下のようにコードを編集します:
using UnityEngine;
using UnityEngine.EventSystems;

public class BallShooter : MonoBehaviour
{
    public GameObject[] ballArray; // 発射するPrefabを格納する配列
    private int selectedPrefabIndex = 0; // 選択されたPrefabのインデックス
    public bool isPaused = false; // 一時停止状態を管理するフラグ

    // UIボタンから呼び出されるメソッド
    public void SelectPrefab(int index)
    {
        selectedPrefabIndex = index;
    }

    // 一時停止ボタンから呼び出されるメソッド
    public void TogglePause()
    {
        isPaused = !isPaused; // フラグを反転
    }

    void Update()
    {
        // 一時停止中は発射を無効化
        if (isPaused || EventSystem.current.IsPointerOverGameObject())
        {
            return;
        }

        if (Input.GetMouseButtonDown(0)) // マウスの左クリックを検知
        {
            // 選択されたPrefabを発射
            GameObject ball = Instantiate(ballArray[selectedPrefabIndex], transform.position, Quaternion.identity);
            Rigidbody rb = ball.GetComponent<Rigidbody>();

            if (rb != null)
            {
                rb.AddForce(transform.forward * 3000);
            }
        }
    }
}
  • コードのポイント
    • isPausedフラグを追加し、一時停止状態を管理します。
    • TogglePauseメソッドでフラグを反転させ、一時停止と再開を切り替えます。
    • 一時停止中はUpdate内の処理を無効化します。

2. 一時停止ボタンの追加

  1. ボタンの作成
    • HierarchyウィンドウでCanvasを右クリックし、「UI」→「Button」を選択します。
    • ボタンを「PauseButton」とリネームします。
  2. ボタンのデザイン変更(任意)
    • ボタンの「Text」オブジェクトを選択し、Inspectorの「Text」フィールドに「Pause」と入力します。

3. 一時停止ボタンに機能を登録

  1. PauseButtonの設定
    • 「PauseButton」を選択し、Inspectorで「On Click ()」イベントを確認します。
    • 「+」ボタンをクリックし、Shooterオブジェクトをドラッグ&ドロップします。
    • 関数リストからBallShooter → TogglePauseを選択します。
  2. 一時停止時の表示を切り替える(任意)
    • Pauseボタンのテキストを「Pause」→「Resume」に切り替えるコードを追加したい場合、以下のコードをTogglePauseに追加します:
public GameObject pauseButtonText; // ボタンのTextオブジェクト

public void TogglePause()
{
    isPaused = !isPaused; // フラグを反転

    // ボタンのテキストを切り替える
    pauseButtonText.GetComponent<UnityEngine.UI.Text>().text = isPaused ? "Resume" : "Pause";
}
  • 注意pauseButtonTextには、PauseボタンのTextオブジェクトをアタッチしてください。

4. 実行と確認

  1. プレイモードで実行
    • Unityエディタで「Play」ボタンをクリックします。
    • 一時停止ボタンをクリックして発射が停止するか確認します。
    • 再度ボタンをクリックして発射が再開するか確認します。
  2. 動作確認ポイント
    • 一時停止中にクリックしてもボールが発射されないか。
    • 再開後に通常通り発射されるか。
    • (任意)ボタンのテキストが「Pause」→「Resume」に切り替わるか。

これで、一時停止機能が完成しました!これにより、発射機能を柔軟にコントロールできるようになります。次の開発ステップに進む際の基盤として役立ててください。



よくある質問 (FAQ)

Q
Prefabが発射されないのですが?
A

ballArrayにPrefabを正しく設定しているか確認してください。

Q
ボールが飛んでいかない場合は?
A

RigidbodyコンポーネントがPrefabにアタッチされているか確認してください。

Q
ボタンが効かないときは?
A

ボタンの「OnClick」イベントに正しい関数が設定されているか確認してください。