【学習】GameObject クラス(オブジェクトの生成と削除)
Unity 入門シリーズでは、
- プレハブから Instantiate でオブジェクトを生成した
- Destroy でオブジェクトを削除した
という形でオブジェクトの動的な生成・削除を学びました。
しかし、GameObject には他にも便利な静的メソッドやプロパティがあります。
GameObject クラス
の主な API をまとめて押さえましょう。
今回は GameObject の Instantiate、Destroy、Find、SetActive などを解説します。
今日学ぶこと
- Instantiate … プレハブからオブジェクトを生成する
- Destroy … オブジェクトを削除する
- Find … 名前でオブジェクトを検索する
- SetActive … オブジェクトの有効・無効を切り替える
- CompareTag … Tag で判別する
GameObject とは
GameObject は、Unity のシーンに配置されるオブジェクトです。空のオブジェクト、Sprite、UI、カメラなど、すべて GameObject です。
MonoBehaviour の gameObject プロパティで、自分がアタッチされている GameObject にアクセスできます。
Instantiate(生成)
Instantiate は、プレハブから新しいオブジェクトを生成します。
// 原点に生成
GameObject obj = Instantiate(prefab);
// 位置を指定して生成
Instantiate(prefab, new Vector3(5, 2, 0), Quaternion.identity);
// 親を指定して生成
Instantiate(prefab, parentTransform);| オーバーロード | 説明 |
|---|---|
| Instantiate(prefab) | 原点に生成 |
| Instantiate(prefab, position, rotation) | 位置と回転を指定 |
| Instantiate(prefab, parent) | 親を指定(親の子として生成) |
2D では回転なしがほとんどなので、Quaternion.identity を使います。
Destroy(削除)
Destroy は、オブジェクトを削除します。
// 自分自身を削除
Destroy(gameObject);
// ぶつかった相手を削除
Destroy(other.gameObject);
// 遅延して削除(2秒後)
Destroy(gameObject, 2f);DestroyImmediate はエディタ用で、実行時には通常 Destroy を使います。
Find(名前で検索)
GameObject.Find は、シーン内のオブジェクトを名前で検索します。
GameObject player = GameObject.Find("Player");
GameObject canvas = GameObject.Find("Canvas");
if (player != null)
{
player.transform.position = Vector3.zero;
}- アクティブなオブジェクトのみ検索される
- 非アクティブなオブジェクトは Find で見つからない
- 重い処理なので、Start で1回取得してキャッシュするのがおすすめ
FindObjectOfType(型で検索)
FindObjectOfType は、指定した型のコンポーネントを持つオブジェクトを検索します。
ScoreManager scoreManager = FindObjectOfType<ScoreManager>();
Camera mainCamera = FindObjectOfType<Camera>();FindObjectsOfType は、該当するすべてのオブジェクトを取得します。
SetActive(有効・無効)
SetActive で、オブジェクトの表示・非表示と、スクリプトの実行を切り替えられます。
gameObject.SetActive(true); // 有効(表示される)
gameObject.SetActive(false); // 無効(非表示、Update なども呼ばれない)無効にしたオブジェクトは、Find で検索されません。
CompareTag(Tag で判別)
CompareTag で、オブジェクトに割り当てられた Tag を判定できます。
if (gameObject.CompareTag("Player"))
{
// プレイヤーの処理
}
if (other.gameObject.CompareTag("Item"))
{
// アイテムの処理
}gameObject.tag == "Item" より CompareTag の方が推奨されています(パフォーマンス)。
完成コード例(生成と削除)
using UnityEngine;
public class SpawnSample : MonoBehaviour
{
[SerializeField] private GameObject itemPrefab;
void Start()
{
InvokeRepeating("SpawnItem", 1f, 2f);
}
void SpawnItem()
{
float x = Random.Range(-4f, 4f);
Vector3 position = new Vector3(x, 6, 0);
Instantiate(itemPrefab, position, Quaternion.identity);
}
}
// 別のスクリプト:当たったら削除
public class ItemController : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
Destroy(gameObject);
}
}
}重要ポイント
GameObject はシーン内のオブジェクト。静的メソッドで操作します。
- Instantiate … プレハブから生成。位置・回転・親を指定可能
- Destroy … オブジェクトを削除。遅延指定も可能
- Find … 名前で検索。重いのでキャッシュを推奨
- FindObjectOfType … 型で検索
- SetActive … 有効・無効の切り替え
- CompareTag … Tag で判別
発展アイデア
- DontDestroyOnLoad … シーン切り替えで破棄されないようにする
- FindWithTag … Tag で検索
- Instantiate の戻り値 … 生成したオブジェクトを変数に代入して操作する
GameObject の生成・削除は ゲームの動きを広げる 基本です。敵や弾、アイテムの出現に使います。