【学習】プレハブと生成(Prefab、Instantiate、Destroy)
これまでの学習では、
- プレイヤーを動かした
- 当たり判定を設定した
- Sprite で見た目を整えた
という形でゲームの基本を作ってきました。
しかし、敵や弾、アイテムのように、同じオブジェクトを複数 作りたい場合があります。シーンに1つずつ配置するのは非効率です。
プレハブと Instantiate
という仕組みを使います。
今回は プレハブ(Prefab) の作成と、スクリプトから Instantiate で生成、Destroy で削除する方法を学びます。
今日学ぶこと
- プレハブ(Prefab) … 再利用できるオブジェクトのひな形
- Instantiate … プレハブからオブジェクトを生成する
- Destroy … オブジェクトを削除する
- 生成位置の指定 … どこに、どの向きで生成するか
プレハブとは
プレハブ は、オブジェクトの「ひな形」です。
- 同じオブジェクトを何度でも生成できる
- プレハブを編集すると、そこから作ったすべてのオブジェクトに反映される
- 敵、弾、アイテム、エフェクトなどに使う
プレハブを作成する
- Hierarchy で、プレハブにしたい GameObject を用意する(Sprite、Collider、スクリプトなどを設定)
- その GameObject を Project ウィンドウにドラッグ&ドロップ
- プレハブが作成され、Project に保存される(青いアイコンで表示)
- 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 を学びましょう。