4.

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()型で検索遅い (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 で個別調整も可能です。

編集
Post Share
子ページ
  1. オブジェクトの追加方法
  2. 地形
  3. キャラクター
  4. カメラ
同階層のページ
  1. Unityの導入方法
  2. エディタ(画面)の説明
  3. プロジェクトの作成と削除
  4. オブジェクト
  5. コンポーネント
  6. スクリプト
  7. アセットのインポート方法
  8. ゲームの実行/一時停止/コマ送り
  9. パッケージのインポート
  10. ゲームの公開(Build)方法
  11. 重力の変更
  12. 用語集
  13. エラー一覧
  14. おすすめアセット一覧