学習記事一覧 · Unity基礎

【学習】プレハブと生成(Prefab、Instantiate、Destroy)

これまでの学習では、

  • プレイヤーを動かした
  • 当たり判定を設定した
  • Sprite で見た目を整えた

という形でゲームの基本を作ってきました。

しかし、敵や弾、アイテムのように、同じオブジェクトを複数 作りたい場合があります。シーンに1つずつ配置するのは非効率です。

プレハブと Instantiate

という仕組みを使います。

今回は プレハブ(Prefab) の作成と、スクリプトから Instantiate で生成、Destroy で削除する方法を学びます。

今日学ぶこと

  • プレハブ(Prefab) … 再利用できるオブジェクトのひな形
  • Instantiate … プレハブからオブジェクトを生成する
  • Destroy … オブジェクトを削除する
  • 生成位置の指定 … どこに、どの向きで生成するか

プレハブとは

プレハブ は、オブジェクトの「ひな形」です。

  • 同じオブジェクトを何度でも生成できる
  • プレハブを編集すると、そこから作ったすべてのオブジェクトに反映される
  • 敵、弾、アイテム、エフェクトなどに使う

プレハブを作成する

  1. Hierarchy で、プレハブにしたい GameObject を用意する(Sprite、Collider、スクリプトなどを設定)
  2. その GameObject を Project ウィンドウにドラッグ&ドロップ
  3. プレハブが作成され、Project に保存される(青いアイコンで表示)
  4. Hierarchy の元のオブジェクトは削除してよい(シーンには残さない)

Instantiate で生成する

Instantiate は、プレハブから新しいオブジェクトを生成します。

public GameObject enemyPrefab;

void Start()
{
    Instantiate(enemyPrefab);
}

Inspector で enemyPrefab にプレハブを割り当てます。これでシーンの原点 (0, 0, 0) に生成されます。


生成位置を指定する

第2引数で位置、第3引数で回転を指定できます。

Vector3 position = new Vector3(5, 2, 0);
Quaternion rotation = Quaternion.identity;  // 回転なし
Instantiate(enemyPrefab, position, rotation);

2D では回転なし(Quaternion.identity)がほとんどです。


ランダムな位置に生成する

float x = Random.Range(-5f, 5f);
float y = Random.Range(0f, 4f);
Vector3 position = new Vector3(x, y, 0);
Instantiate(enemyPrefab, position, Quaternion.identity);

一定間隔で生成する(InvokeRepeating)

InvokeRepeating で、一定間隔で処理を繰り返せます。

void Start()
{
    InvokeRepeating("SpawnEnemy", 1f, 2f);  // 1秒後から、2秒ごとに実行
}

void SpawnEnemy()
{
    float x = Random.Range(-8f, 8f);
    Instantiate(enemyPrefab, new Vector3(x, 6, 0), Quaternion.identity);
}

Destroy で削除する

Destroy は、オブジェクトを削除します。

Destroy(gameObject);  // 自分自身を削除
Destroy(other.gameObject);  // ぶつかった相手を削除

遅延して削除する場合:

Destroy(gameObject, 2f);  // 2秒後に削除

完成コード例(落ち物を生成)

using UnityEngine;

public class ItemSpawner : MonoBehaviour
{
    [SerializeField] private GameObject itemPrefab;
    [SerializeField] private float spawnInterval = 1.5f;

    void Start()
    {
        InvokeRepeating("SpawnItem", 1f, spawnInterval);
    }

    void SpawnItem()
    {
        float x = Random.Range(-4f, 4f);
        Vector3 position = new Vector3(x, 6, 0);
        Instantiate(itemPrefab, position, Quaternion.identity);
    }
}

プログラムの流れ

Start で InvokeRepeating を設定

一定間隔で SpawnItem が呼ばれる

ランダムな X 座標で Instantiate

落ちたオブジェクトは OnTriggerEnter2D などで Destroy

重要ポイント

プレハブ はひな形、Instantiate で生成、Destroy で削除します。

  • プレハブ … Project に保存したオブジェクトのひな形
  • Instantiate … プレハブからオブジェクトを生成
  • Destroy … オブジェクトを削除
  • InvokeRepeating … 一定間隔で生成するときに便利
  • プレハブは Inspector で public 変数に割り当てる

発展アイデア

プレハブと生成が分かったら、次のステップです。

  • 落ち物キャッチゲーム … 上から落ちるアイテムを生成する
  • 横スクロールアクション … 敵を一定間隔で生成する
  • スコアとゲームオーバー … 取得したアイテムの数をスコアに反映する

プレハブと生成は ゲームの動きを広げる 基本です。次は UI を学びましょう。