この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:atom
更新日時:2026-06-11 07:10:02

タイトル: オブジェクト
SEOタイトル: Unity GameObject 完全ガイド — 生成・検索・Prefab 化

この記事の要点
  • Unity の GameObject はシーン上のあらゆるオブジェクトの基底クラス
  • 新規作成は Hierarchy で右クリック → Create Empty / 3D Object / UI 等
  • Prefab 化で再利用可能になり、Instantiate() で動的生成、Destroy() で削除
  • 検索は GameObject.Find("名前") / FindWithTag("Player") が定番
  • Active 状態SetActive(true/false)、Tag/Layer で分類管理

GameObject とは

Unity のシーンに登場する すべての要素 は GameObject です。空の入れ物に Component を取り付けることで、カメラにも・キャラクターにも・光源にもなります。

新規 GameObject の作り方

Hierarchy ウィンドウで右クリック、または上部 GameObject メニューから選択します。

項目用途
Create Empty空の GameObject (グループ化や Manager に多用)
3D Object → Cube立方体プリミティブ
3D Object → Sphere球プリミティブ
3D Object → Plane / Quad平面 (床や壁)
Light → Directional Light太陽光
Cameraカメラ
UI → CanvasUI のルート

階層化 (Hierarchy)

GameObject は親子関係を持てます。子は親の Transform を継承し、親を動かすと子も一緒に動きます。

// 親子関係の操作
child.transform.SetParent(parent.transform);        // 親に登録
child.transform.SetParent(parent.transform, false); // ローカル座標を維持
child.transform.parent = null;                      // 親を外す

// 子の取得
foreach (Transform c in transform) {
    Debug.Log(c.name);
}

// パス指定で深い子を探す
Transform deep = transform.Find("Body/Head/Hat");

Transform: 位置 / 回転 / 拡縮

// 位置
transform.position = new Vector3(0, 1, 0);          // ワールド座標
transform.localPosition = Vector3.zero;             // 親基準

// 回転 (Quaternion or Euler)
transform.rotation = Quaternion.Euler(0, 90, 0);
transform.Rotate(Vector3.up, 30f);                  // 30 度回す

// 拡縮
transform.localScale = new Vector3(2, 2, 2);

// 移動 (毎フレーム)
transform.Translate(Vector3.forward * Time.deltaTime * 5f);

Active / Inactive の切替

// 表示・非表示
obj.SetActive(false);                 // 完全に無効化 (Update も止まる)
obj.SetActive(true);

// 自身が active か
bool isOn = obj.activeSelf;           // 自分の Active フラグ
bool isHier = obj.activeInHierarchy;  // 親まで含めて表示中か

Tag と Layer

// Tag (Inspector で文字列を設定)
if (collision.gameObject.CompareTag("Enemy")) { /* ... */ }

// 推奨: CompareTag (内部で文字列比較を最適化)
// 非推奨: collision.gameObject.tag == "Enemy"

// Layer (0-31 の整数)
obj.layer = LayerMask.NameToLayer("Ground");

// LayerMask (Raycast や Physics の絞り込み)
int mask = LayerMask.GetMask("Ground", "Wall");
Physics.Raycast(origin, dir, out hit, 100f, mask);

GameObject.Find 系の検索

メソッド用途速度
GameObject.Find("Name")名前で検索遅い (シーン全走査)
GameObject.FindWithTag("Tag")Tag で 1 個普通
GameObject.FindGameObjectsWithTag("Tag")Tag 全件普通
FindObjectOfType<T>()型で検索遅い (Update 内禁止)
transform.Find("子の名前")子オブジェクト限定速い

Update 内で Find は呼ばない のが鉄則です。Start で参照を取得してフィールドに保存します。

Prefab 化と動的生成

シーン上の GameObject を Project にドラッグすると Prefab になります。

public class Spawner : MonoBehaviour {
    [SerializeField] private GameObject enemyPrefab;

    void Start() {
        // 位置と回転を指定して生成
        GameObject e = Instantiate(enemyPrefab, new Vector3(0, 0, 5), Quaternion.identity);

        // 親付きで生成
        Instantiate(enemyPrefab, transform);

        // 3 秒後に破棄
        Destroy(e, 3f);
    }
}

Destroy のタイミング

Destroy(gameObject);          // フレーム終端で削除
Destroy(gameObject, 2f);      // 2 秒後に削除
DestroyImmediate(obj);        // 即時 (Editor 拡張専用、ランタイム使用は非推奨)

// シーン遷移しても残す
DontDestroyOnLoad(gameObject);

よくあるトラブル

症状原因対処
Find が null を返す非アクティブ / 名前ミスHierarchy で名前確認、SetActive 状態確認
Instantiate した Prefab が見えないカメラ範囲外 / Scale=0position と localScale を Debug.Log
子が動かない親の Transform を見落としlocalPosition で確認
Destroy 後に MissingReferenceException参照が残っている使う前に obj != null チェック

FAQ

Q: 空の GameObject は何に使う?
A: 関連 Object のグループ化、Manager スクリプトの置き場、空間的なマーカー (スポーン位置) などに頻用されます。

Q: Find は本当に遅い?
A: 1 回なら問題ありません。毎フレーム呼ぶと FPS が大幅低下 します。Start で取得してキャッシュしてください。

Q: Prefab を編集すると既存のインスタンスにも反映?
A: はい。Prefab Variant や Override で個別調整も可能です。