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
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 由来)
ハンズオン手順
Scene から Prefab を作成
セットアップ完了 → Hierarchy から Project ウィンドウの Assets フォルダへドラッグ。
Prefab Mode で編集
.prefab をダブルクリック → 隔離された編集空間。変更はすべての Instance に伝播します。
[SerializeField] で割り当て
Inspector で Project の Prefab Asset をフィールドへドラッグし、スクリプトから Instantiate できるようにします。
Override を Prefab Asset に適用
Instance を選択 → Inspector → Overrides → Apply All。
インタラクティブシミュレーター
Prefab タイプを選び Instantiate で複製。Instance をクリックして Override を変更し、Destroy で削除できます。
"Instantiate()" で Prefab から GameObject を生成
Inspector
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:事前生成し、作成/破棄の代わりに有効/無効