学習記事一覧 · Unityクラス

【学習】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 の生成・削除は ゲームの動きを広げる 基本です。敵や弾、アイテムの出現に使います。