Unity Term Book
コアとアーキテクチャ

Prefab

Prefab は再利用可能なテンプレート Asset です。一度設計して何度も Instantiate でき、元の Prefab を変えると継承中の Instance も更新されます。Override・Nested Prefab・高頻度生成時の Object Pooling まで基礎をここで学べます。

想像してみてください...

Prefab はパンの型のようです。材料ごと型(Prefab Asset)を一度設計し、生地を流し込めば(Instantiate())同じパンを何百個でも作れます。味を変えたい?型を編集すれば、これからのバッチすべてに反映されます。

概念の詳細

Prefab は GameObject の階層全体——Component・設定・子——を保存する .prefab ファイルです。 Scene にドラッグすると、その Asset にリンクした Prefab Instance が作られます。

Prefab Overrides:各 Instance は選んだプロパティ (色、HP…)だけ上書きでき、それ以外は継承します。Prefab Asset が更新されると、 Override のない Instance は新しい値を自動で受け取ります。

Nested Prefabs:Prefab の中に別の Prefab を含められます。 Level Prefab が Room Prefab を持ち、各 Room が Enemy Prefab を持つ、といった構成に便利です。

タイトなループで Instantiate()/Destroy() を呼ぶとラグ (Garbage Collection スパイク)の原因になります。高頻度スポーン(マシンガン弾、VFX…)では Object Pooling を使ってください。

ダイアグラム:Prefab → Instances

📦 Prefab Asset

Enemy_Goblin.prefab

⚙ Rigidbody · ⚙ Collider · ⚙ EnemyAI

HP: 100 · Speed: 3

↓ Instantiate()

Instance #1

pos: (2, 0, 5)

HP: 100(Prefab 由来)

Instance #2 — Override

pos: (-3, 0, 7)

HP: 150 ← Override!

Instance #3

pos: (0, 0, 10)

HP: 100(Prefab 由来)

ハンズオン手順

1

Scene から Prefab を作成

セットアップ完了 → Hierarchy から Project ウィンドウの Assets フォルダへドラッグ。

2

Prefab Mode で編集

.prefab をダブルクリック → 隔離された編集空間。変更はすべての Instance に伝播します。

3

[SerializeField] で割り当て

Inspector で Project の Prefab Asset をフィールドへドラッグし、スクリプトから Instantiate できるようにします。

4

Override を Prefab Asset に適用

Instance を選択 → Inspector → Overrides → Apply All。

インタラクティブシミュレーター

Prefab タイプを選び Instantiate で複製。Instance をクリックして Override を変更し、Destroy で削除できます。

Instances: 0

"Instantiate()" で Prefab から GameObject を生成

Inspector

Instance を選択

Prefab: Enemy_Goblin|Selected: None|ヒント: Instance をクリックしてプロパティを表示

コード例

基本
using UnityEngine;

public class PrefabSpawner : MonoBehaviour
{
  [SerializeField] private GameObject enemyPrefab;
  [SerializeField] private Transform  spawnPoint;

  void Start()
  {
      // Spawn a copy at the spawnPoint pose
      GameObject clone = Instantiate(
          enemyPrefab, spawnPoint.position, spawnPoint.rotation
      );

      // Configure the clone immediately
      EnemyAI ai = clone.GetComponent<EnemyAI>();
      if (ai != null)
      {
          ai.patrolSpeed    = 3f;
          ai.detectionRange = 8f;
      }

      clone.name = $"Enemy_{Random.Range(100, 999)}";
  }
}

コード例

上級
using System.Collections;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
  [SerializeField] private GameObject[] enemyPrefabs;  // multiple enemy types
  [SerializeField] private Transform[] spawnPoints;   // multiple spawn points
  [SerializeField] private int    enemiesPerWave = 5;
  [SerializeField] private float  spawnInterval  = 0.5f;
  [SerializeField] private float  waveCooldown   = 5f;

  private int _waveCount = 0;

  void Start() => StartCoroutine(SpawnLoop());

  private IEnumerator SpawnLoop()
  {
      while (true)
      {
          _waveCount++;
          for (int i = 0; i < enemiesPerWave; i++)
          {
              // Pick a Prefab and SpawnPoint at random
              var prefab = enemyPrefabs[Random.Range(0, enemyPrefabs.Length)];
              var point  = spawnPoints[Random.Range(0, spawnPoints.Length)];
              Instantiate(prefab, point.position, point.rotation);
              yield return new WaitForSeconds(spawnInterval);
          }
          yield return new WaitForSeconds(waveCooldown);
      }
  }
}

📌 要点

  • ▸Prefab = 再利用テンプレート——一度設計、ずっと使う
  • ▸Instance は個別プロパティを Override できる
  • ▸Prefab Asset を編集 → リンク中の Instance が更新される
  • ▸高頻度スポーン → Instantiate/Destroy より Object Pooling

⚠️ よくあるミス

  • ❌ 参照を残さず Instantiate

    生成しても後からその clone を制御できない

    ✅ var clone = Instantiate(prefab);

  • ❌ ホットループで毎フレーム Instantiate/Destroy

    GC スパイクとヒッチ——特にマシンガン弾

    ✅ Object Pool:事前生成し、作成/破棄の代わりに有効/無効