UnityUnityメモ

Unity初心者向け!タイムアップでPrefabを一括削除する方法を解説

Unity

1. はじめに

Unityを使ったゲーム開発では、タイマーやPrefabを活用するシーンがよくあります。その中でも、特定の時間が経過したら生成したオブジェクトを一括で削除する仕組みは、ゲームの整理やパフォーマンス向上に非常に役立ちます。たとえば、画面に大量のアイテムや敵キャラクターが表示されたままだと、ゲームが重くなってしまうことがあります。これを防ぐために、タイマーを使って不要なオブジェクトを削除する方法を知っておくと便利です。

この記事では、Unity初心者でもわかりやすいように「タイムアップ時に生成したPrefabをすべて削除する仕組み」の作り方を解説します。基本的な3Dオブジェクトの作成から、スクリプトを使ったタイマーの設定、Prefabの削除までの手順をステップバイステップで紹介します。

「ゲームに動きを加えたい」「効率よくオブジェクトを管理したい」と考えている方にはピッタリの内容です。一緒に作業を進めて、Unityの基本操作とスクリプトの知識を楽しく学んでいきましょう!

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



2. ボールPrefabの準備

タイムアップ時に削除するPrefabをまず準備しましょう。この例では、落下するボールを作成し、Prefabとして保存します。以下の手順を順番に進めてください。


① 3Dモデルとしてのボールを作成

  1. Sphereを作成する
    Hierarchyウィンドウを右クリックし、「3D Object」→「Sphere」を選択します。画面上に白い球体(Sphere)が表示されるはずです。
  2. 名前を変更する
    作成したSphereを選択した状態で、Inspectorウィンドウの上部にある名前欄に「Ball」と入力し、名前を変更します。これにより、他のオブジェクトと区別しやすくなります。

② Rigidbodyを追加して物理挙動を設定

  1. Rigidbodyコンポーネントを追加する
    Sphere(Ball)を選択した状態で、Inspectorウィンドウの「Add Component」ボタンをクリックします。検索欄に「Rigidbody」と入力し、表示されたRigidbodyを選択します。
  2. 物理設定を調整する
    Rigidbodyコンポーネントを設定し、ボールがゆっくり落下するように調整します。
    • Drag(抵抗): 5 に設定します。これにより、ボールの落下速度が遅くなり、見た目にも動きが確認しやすくなります。

③ Prefabとして保存

  1. Projectウィンドウに保存する
    HierarchyウィンドウのSphere(Ball)を、Projectウィンドウにドラッグ&ドロップします。これで、BallがPrefabとして保存されます。
  2. Prefabの名前を確認する
    Projectウィンドウに保存されたPrefabに「Ball」という名前が付いているか確認します。必要に応じて名前を変更してください。

④ テストして確認

  1. シーン上で確認する
    Prefabとして保存したBallをProjectウィンドウからシーンにドラッグして配置します。Playボタンを押して、ボールが正しく落下するか確認してください。
  2. 問題があれば調整する
    • ボールが落下しない場合はRigidbodyが正しく追加されているか確認しましょう。
    • 落下速度が速すぎる場合はDrag値をさらに大きくして調整してください。

これで、ボールのPrefabの準備は完了です!次は、このPrefabを生成したり削除したりするスクリプトを作成していきます。



3. スクリプトの作成

このセクションでは、タイマーを使ってPrefabを生成し、指定した時間が経過したら全てのPrefabを削除する仕組みをスクリプトで実装します。具体的には以下の機能を実装します:

  • 一定間隔でPrefabを生成する。
  • 指定時間が経過したら生成したPrefabを削除する。

スクリプトファイルの作成

まずはスクリプトファイルを作成します。以下の手順に従って進めてください:

  1. Projectウィンドウを開く
    Unityエディターの下部にある「Project」ウィンドウを開きます。
  2. 新しいスクリプトを作成する
    「Assets」フォルダーで右クリックして、メニューから「Create」→「C# Script」を選びます。
  3. スクリプト名を設定する
    スクリプトの名前を「BallManager」とします。名前を付けたらスクリプトをダブルクリックして、コードエディターで開きます。

コードの記述

以下のコードをスクリプトに入力してください。このコードはPrefabの生成と削除の両方を処理します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallManager : MonoBehaviour
{
    public GameObject ballPrefab; // ボールのPrefabを指定する
    public float spawnInterval = 1f; // ボール生成間隔(秒)
    public float destroyTime = 5f; // 全ボールを削除するタイミング(秒)
    public float spawnRangeX = 5f; // X座標で生成される範囲

    private List<GameObject> spawnedBalls = new List<GameObject>(); // 生成されたボールを管理するリスト

    void Start()
    {
        // ボールの生成を開始
        StartCoroutine(SpawnBalls());
    }

    IEnumerator SpawnBalls()
    {
        while (true)
        {
            // destroyTimeが経過するまでボールを生成
            for (float elapsed = 0; elapsed < destroyTime; elapsed += spawnInterval)
            {
                SpawnBall();
                yield return new WaitForSeconds(spawnInterval);
            }

            // destroyTimeが経過したら全てのボールを削除
            ClearBalls();
        }
    }

    void SpawnBall()
    {
        // ランダムな位置にボールを生成
        float randomX = Random.Range(-spawnRangeX, spawnRangeX);
        Vector3 spawnPosition = new Vector3(randomX, 5f, 0f); // 高さ5の位置
        GameObject newBall = Instantiate(ballPrefab, spawnPosition, Quaternion.identity);
        spawnedBalls.Add(newBall); // リストに追加
    }

    void ClearBalls()
    {
        // リスト内の全てのボールを削除
        foreach (GameObject ball in spawnedBalls)
        {
            Destroy(ball);
        }
        spawnedBalls.Clear(); // リストをリセット
    }
}

コードの説明

  • public GameObject ballPrefab;
    ボールのPrefabをInspectorで指定できるようにするための変数です。
  • spawnIntervaldestroyTime
    ボールの生成間隔と、削除するまでの時間を設定する変数です。
  • SpawnBalls メソッド
    コルーチンで実行され、指定した間隔でボールを生成し、一定時間後に削除します。
  • SpawnBall メソッド
    ランダムなX座標でボールを生成し、リストに追加します。
  • ClearBalls メソッド
    生成された全てのボールを削除し、リストをリセットします。

スクリプトを保存したら、次はこのスクリプトを空のオブジェクトにアタッチして設定を行います。その方法については次のセクションで説明します!



4. スクリプトのアタッチと設定

ボールの生成や削除を管理する「BallManager」スクリプトを作成したら、次はこのスクリプトをUnityエディタ内で設定していきましょう。以下の手順を参考にしてください。


1. 空のゲームオブジェクトを作成する

まず、スクリプトを管理するための空のオブジェクトを作成します。

  1. Hierarchyウィンドウで右クリックし、メニューから「Create Empty」を選択します。
  2. 作成されたオブジェクトを選択し、Inspectorウィンドウで名前を「BallManager」に変更します。

2. スクリプトをアタッチする

次に、「BallManager」スクリプトを先ほど作成したオブジェクトにアタッチします。

  1. Projectウィンドウで、先ほど作成した**「BallManager」スクリプト**を探します。
  2. スクリプトをドラッグ&ドロップして、「BallManager」オブジェクトにアタッチします。
  3. スクリプトが正しくアタッチされていることを確認するには、BallManagerオブジェクトを選択し、Inspectorウィンドウを確認してください。「BallManager (Script)」コンポーネントが表示されていれば完了です。

3. Ball Prefabの設定

「BallManager」スクリプトには、生成するボールのPrefabを指定する必要があります。以下の手順で設定しましょう。

  1. Inspectorウィンドウで「BallManager (Script)」コンポーネントを見つけます。
  2. 「Ball Prefab」というフィールドが表示されているはずです。
  3. Projectウィンドウで、先ほど作成したボールのPrefab(例: Ball)を探します。
  4. Ball Prefabフィールドに、ボールのPrefabをドラッグ&ドロップします。

4. スクリプトのパラメータを調整する

ボールの生成間隔や削除タイミングなどを調整することで、挙動をカスタマイズできます。

  1. Inspectorウィンドウの「BallManager (Script)」コンポーネント内で以下のパラメータを設定します:
    • Spawn Interval: ボールが生成される間隔(例: 1 秒)
    • Destroy Time: ボールを一括削除するまでの時間(例: 5 秒)
    • Spawn Range X: ボールが生成される範囲のX座標(例: 5
  2. 必要に応じて値を変更し、ゲームに合った挙動を作りましょう。

5. 設定内容を保存

設定が完了したら、作業内容を保存します。

  1. 上部メニューのFileから「Save」を選択します。
  2. 設定が保存され、シーンが安全に保存されます。

これでスクリプトのアタッチと設定は完了です!次は、プレイモードで動作を確認し、ボールが生成・削除される仕組みをテストしてみましょう。



5. テストと確認

ここでは、作成した仕組みをUnityエディターでテストし、正しく動作するか確認する方法を解説します。以下の手順に従って進めてください。


① シーンを再生する

  1. シーンを保存
    • まず、現在のシーンを保存していない場合は、「File」→「Save As」でシーンを保存しましょう。
    • 任意の名前(例:「PrefabDeleteTest」)を付けて保存します。
  2. 再生ボタンをクリック
    • Unityエディター上部にある「▶(再生ボタン)」をクリックして、シーンを再生します。
    • 再生中は、シーンの状態がプレビューとして確認できます。

② 動作確認ポイント

シーンを再生すると、以下のような動作が確認できるはずです。

  1. ボールが1秒ごとに生成される
    • ランダムなX座標の位置にボールが1秒間隔で生成されるか確認します。
    • 生成位置が画面内に収まらない場合は、スクリプト内のspawnRangeXを調整してください。
  2. 5秒経過後にすべてのボールが削除される
    • ボールが生成されてから約5秒後に、すべてのボールがシーンから削除されるか確認します。
    • 削除後もスクリプトはループし、再度ボールが生成される動作が繰り返されるはずです。

③ 想定されるエラーと対処法

テスト中に以下のような問題が発生する場合、それぞれの対処法を試してください。

  1. ボールが生成されない
    • BallManagerスクリプトのballPrefab欄にPrefabが正しくアタッチされているか確認してください。
    • Prefabが削除された場合は、再度作成してスクリプトにアタッチしましょう。
  2. タイマーが機能しない
    • スクリプト内のspawnIntervaldestroyTimeが正しい値(例:1秒や5秒)に設定されているか確認してください。
    • タイマーの挙動に問題がある場合は、デバッグ用にDebug.Logをコード内に挿入して実行状況を確認します。
    csharpコピーする編集するDebug.Log("現在の経過時間: " + elapsed);
  3. ボールが削除されない
    • ClearBallsメソッド内でリストを正しくクリアしているか確認します。
    • リストspawnedBallsが空の場合、削除処理が実行されないため、生成時にリストへ正しく追加されているか確認してください。

④ デバッグ用のポイント

開発中に挙動をチェックするために、Unityのコンソールビューでエラーメッセージが表示されていないか確認してください。

  • コンソールに表示されるエラーメッセージをクリックすると、該当箇所のコードにジャンプできます。
  • 問題箇所を修正し、再度シーンを再生してテストを繰り返してください。

以上でテストと確認のステップは完了です。次は、この仕組みを応用してさらに便利な機能を追加する方法を紹介します!



6. 応用例

タイムアップ時にPrefabを削除する仕組みは、アイデア次第でさまざまな場面に応用できます。このセクションでは、設定を少し変更して使い方の幅を広げる例を紹介します。


6.1 タイマーの時間を変更する方法

例えば、削除までの時間を5秒ではなく10秒に変更したい場合は、スクリプト内のdestroyTimeの値を調整するだけです。

public float destroyTime = 10f; // 削除までの時間を10秒に設定

また、ゲームプレイ中にタイマーの時間を変えたい場合は、以下のように外部から値を変更するメソッドを追加できます。

public void SetDestroyTime(float newTime)
{
destroyTime = newTime;
}

このメソッドを他のスクリプトやUIボタンから呼び出すことで、動的にタイマーの時間を変更できます。


6.2 複数種類のPrefabを同時に削除する方法

タイマーで削除する対象を増やしたい場合、例えば異なる種類のPrefabをランダムに生成し、同時に削除する仕組みを追加できます。

まず、異なるPrefabを管理するためにリストを用意します。

public List<GameObject> ballPrefabs; // 複数のPrefabを管理

そして、Prefabをランダムに選んで生成します。

void SpawnBall()
{
int randomIndex = Random.Range(0, ballPrefabs.Count); // ランダムなPrefabを選択
GameObject selectedPrefab = ballPrefabs[randomIndex];
float randomX = Random.Range(-spawnRangeX, spawnRangeX);
Vector3 spawnPosition = new Vector3(randomX, 5f, 0f);
GameObject newBall = Instantiate(selectedPrefab, spawnPosition, Quaternion.identity);
spawnedBalls.Add(newBall);
}

この方法を使うと、プレイヤーにバリエーション豊かなゲーム体験を提供できます。


6.3 特定条件でPrefabを削除する方法

例えば、画面外に出たオブジェクトだけを削除したい場合、PrefabにColliderとOnTriggerExitメソッドを設定します。

Prefabに以下のスクリプトを追加します。

void OnTriggerExit(Collider other)
{
if (other.CompareTag("Boundary")) // "Boundary"タグのトリガー外に出たら削除
{
Destroy(gameObject);
}
}

さらに、削除範囲を定義するために、”Boundary”タグを持つInvisibleなColliderを画面外に配置します。


応用例を活かしたゲームアイデア

これらの応用例を組み合わせることで、以下のようなゲームが作成可能です。

  • タイマーで異なるオブジェクトを削除するパズルゲーム
  • プレイヤーがPrefabを収集し、タイムアップで未収集のオブジェクトを消去するアクションゲーム
  • 複数種類のオブジェクトを出現させ、削除条件を工夫したサバイバルゲーム

ぜひこの記事を参考に、独自の仕組みを開発してみてください!



よくある質問(FAQ)

Q
スクリプトが動かない場合、どうすればよいですか?
A

以下のポイントを確認してください:

  1. Prefabがアタッチされているか確認する
    • BallManagerスクリプトのInspectorビューで、ballPrefabに正しいPrefabが設定されているか確認してください。
  2. エラーメッセージを確認する
    • コンソール(Console)ウィンドウでエラーメッセージを確認し、不足しているコンポーネントやスペルミスがないかチェックしてください。
  3. スクリプトが正しいオブジェクトにアタッチされているか
    • スクリプトを空のオブジェクト(BallManager)にアタッチしていることを再確認してください。
Q
タイマーの時間を変更するにはどうすればよいですか?
A

スクリプト内の変数spawnIntervaldestroyTimeを調整することで、ボールの生成間隔や削除タイミングを変更できます。たとえば:

public float spawnInterval = 2f; // 2秒間隔で生成
public float destroyTime = 10f; // 10秒後に削除

これらの値を変更した後、Unityエディターで再生ボタンを押して挙動を確認してください。

Q
Prefabが削除されない場合、原因は何ですか?
A

以下を確認してください:

  1. リストにPrefabが追加されているか
    • SpawnBall()メソッド内で生成したPrefabがspawnedBallsリストに確実に追加されているか確認してください。
  2. Destroy関数が正しく動作しているか
    • Prefabオブジェクトが非アクティブ(Inactive)になっている場合、Destroy()が機能しない可能性があります。
    • Debug.Log()を使って削除処理が実行されているかデバッグするとよいでしょう。
  3. リファレンスが正しいか
    • 削除対象が正しいオブジェクトであるか確認してください。Prefabがヒエラルキー上に表示されているオブジェクトでない場合、削除が失敗します。

おすすめのアセット

「Screw Puzzle Template + Editor」は、ユニークな「ねじを回す」操作を取り入れたパズルゲームテンプレートです。直感的な操作でギミックを解く構造になっており、シーンエディターも付属しているため、簡単にカスタマイズや新レベルの追加が可能です。初心者でも扱いやすく、プロジェクトの立ち上げがスムーズに行えます。Unityの主要レンダリングパイプラインにも対応しています。