【Unity】Unityの再利用システム「Prefab」を完全理解する - オブジェクトの複製と管理を効率化!

作成: 2025-12-07最終更新: 2026-07-13

Unity開発の効率を飛躍的に向上させる最重要機能の一つ、Prefab(プレハブ)。Prefabとは何か、その作り方から使い方、そしてネストやバリアントといった応用までを徹底解説します。

シーンに敵を50体並べたあとで「やっぱり敵のHPを変えたい」——50体をひとつずつ直す悪夢を想像してみてください。コピー&ペーストでオブジェクトを増やしていると、この悪夢はいつか必ず現実になります。

この問題をエレガントに解決するのが、Unityで最も重要な機能のひとつ、 Prefab(プレハブ) です。Prefabはゲームオブジェクトとそのコンポーネント・設定をひとまとめにした「設計図」で、 設計図を1箇所直せば、そこから作った全部のオブジェクトに反映されます

Prefabのイメージ。1枚の設計図から、同じ姿のオブジェクトが何体でも量産される

この記事でわかること

  • Prefabの仕組み(設計図とインスタンスの関係)
  • Prefabの作り方と、シーンへの配置・スクリプトからの動的生成
  • 特定の1体だけ設定を変える「オーバーライド」
  • 応用のNested Prefabs(入れ子)とPrefab Variants(亜種)

Sponsored

Prefabとは?

Prefabは、 再利用可能なゲームオブジェクトのアセット です。ヒエラルキーウィンドウで作成・設定したゲームオブジェクトを、プロジェクトウィンドウにドラッグ&ドロップするだけで、誰でも簡単にPrefabを作成できます。

一度Prefab化してしまえば、そのPrefabアセットをまるでスタンプのようにシーンに何度でも配置(インスタンス化)できます。そして、Prefabの最も強力な点は、 元のPrefabアセット(設計図)を変更すると、そのPrefabから生成されたすべてのインスタンス(シーン上のオブジェクト)に変更が自動的に反映される ことです。

Prefabの設計図とインスタンスの関係図。設計図であるPrefabアセットからスタンプのように複数のインスタンスが生成され、設計図の編集が全インスタンスに反映される

Prefabを使うメリット

  • 再利用性: 同じオブジェクトを簡単に、何度でもシーンに配置できます。
  • 一括編集: 元のPrefabを編集するだけで、全てのインスタンスを一度に更新できます。これにより、仕様変更に強く、メンテナンス性の高いプロジェクトを構築できます。
  • 動的生成: Instantiate()メソッドを使って、ゲーム実行中にPrefabからオブジェクトを動的に生成できます。弾の発射や敵の出現などに必須の機能です。

Prefabの作り方と使い方

1. Prefabの作成

  1. オブジェクトの準備: ヒエラルキーウィンドウで、Prefabにしたいゲームオブジェクトを作成し、必要なコンポーネント(スクリプト、Colliderなど)を追加して、Inspectorで値を設定します。
  2. Prefab化: 設定が完了したゲームオブジェクトを、ヒエラルキーウィンドウからプロジェクトウィンドウの任意のフォルダ(Prefabsフォルダを作成するのが一般的)にドラッグ&ドロップします。

これだけで、プロジェクトウィンドウに青い立方体のアイコンを持つPrefabアセットが作成されます。同時に、ヒエラルキー上の元のオブジェクトも青いアイコンに変わり、Prefabインスタンスであることを示すようになります。

Sponsored

2. Prefabのインスタンス化(配置)

  • 手動配置: プロジェクトウィンドウのPrefabアセットを、シーンビューまたはヒエラルキーウィンドウにドラッグ&ドロップします。
  • 動的生成: スクリプトからInstantiate()メソッドを使って生成します。
using UnityEngine;

public class Spawner : MonoBehaviour
{
    // Inspectorで設定するPrefab
    public GameObject enemyPrefab;

    void Start()
    {
        // 3秒ごとに敵を生成するコルーチンを開始
        StartCoroutine(SpawnEnemies());
    }

    IEnumerator SpawnEnemies()
    {
        while (true)
        {
            // Prefabから新しいインスタンスを生成
            Instantiate(enemyPrefab, transform.position, Quaternion.identity);
            yield return new WaitForSeconds(3f);
        }
    }
}

Prefabの編集とオーバーライド

Prefabの編集

Prefabアセットを編集するには、以下の方法があります。

  • Prefabモード: プロジェクトウィンドウのPrefabアセットをダブルクリックするか、ヒエラルキー上のPrefabインスタンスを選択してInspectorの「Open」ボタンを押すと、Prefab編集専用の「Prefabモード」に入ります。ここで加えた変更は、すべてのインスタンスに影響します。

オーバーライド (Override)

シーンに配置した特定のインスタンスだけ、Prefabの設定から一部を変更したい場合もあります。例えば、「この敵だけHPを少し多くしたい」「この木だけ少し大きくしたい」といったケースです。

シーン上のPrefabインスタンスの値をInspectorで変更すると、そのプロパティは太字で表示され、 オーバーライド された(上書きされた)ことを示します。この変更は、そのインスタンスにのみ適用され、元のPrefabや他のインスタンスには影響しません。

オーバーライドの実例。同じPrefabから生成した3体のうち、真ん中の1体だけHPを150に上書きしていて、他の2体と元のPrefabには影響しない

オーバーライドした設定を元のPrefabに適用したくなった場合は、Inspectorの上部にあるOverridesドロップダウンからApply Allを選択します。逆に、オーバーライドを破棄してPrefabと同じ設定に戻したい場合はRevert Allを選択します。

Apply Allの定番事故に注意: Apply Allは「このインスタンスの 全オーバーライド をPrefab本体へ書き戻す」操作です。つまり、実行した瞬間に 他のすべてのインスタンスへ変更が波及 します。「この1体だけ強くしたつもりが、シーン中の敵全員が強くなっていた」は誰もが一度はやる事故です。1項目だけ反映したいときは、Overridesドロップダウンで 項目を選んで個別にApply しましょう。「このインスタンスだけの差分をずっと保ちたい」なら、後述のVariantにするのが安全です。

応用:Nested Prefabs と Prefab Variants

Unity 2018.3から、Prefabはさらに強力になりました。

  • Nested Prefabs(ネストされたPrefab): Prefabの中に別のPrefabを入れることができます。例えば、「銃」のPrefabを作成し、それを「兵士」のPrefabに組み込む、といったことが可能です。これにより、よりモジュール化されたコンポーネントの組み立てが可能になります。
  • Prefab Variants(Prefabバリアント): あるPrefabを基にして、その差分だけを保存する「亜種」のPrefabを作成できます。例えば、「通常ゴブリン」Prefabを基に、「赤ゴブリン」(マテリアルの色だけが違う)や「ゴブリンアーチャー」(弓を持つという差分がある)といったバリアントを作成できます。元の「通常ゴブリン」PrefabのHPを変更すれば、その変更はすべてのバリアントに継承されるため、非常に効率的な管理が可能です。

多段継承はほどほどに: 便利な反面、「バリアントのバリアントのバリアント…」と重ねると、 どの層でどの値が決まっているのか を追うのが一気に難しくなります。継承は1〜2段までを目安にし、それ以上複雑になりそうなら構成を見直しましょう。

Prefab Variantのツリー図。基本のゴブリンPrefabから、色ちがいと弓もちの2つのバリアントが差分だけ保存されて派生している

おまけ:先に知っておくと良いこと

Prefabを使いこなし始めると、いずれ次のような「その先の話」に出会います。存在だけ知っておくと、後で困ったときの引き出しになります。

  • 大量のInstantiateはカクつきの原因になる: 弾のように毎秒何十個も生成・破棄するオブジェクトは、PrefabからのInstantiate/Destroyを繰り返すと処理落ちの原因になります。生成済みのインスタンスを使い回す オブジェクトプーリング が定番の対策です。オブジェクトプーリングの記事 で解説しています。
  • 「3秒ごとに生成」のような時間制御はコルーチンで: この記事のSpawnerの例で使ったStartCoroutineコルーチン という仕組みです。時間差の処理全般に使えるので、早めに覚えると便利です。コルーチンの記事 を参照してください。
  • 「データ」はPrefabではなくScriptableObjectという選択肢も: 敵のHPや攻撃力のような数値データだけを管理したい場合、GameObjectを持たない ScriptableObject というアセットの方が適していることがあります。ScriptableObjectの記事 が参考になります。
  • Prefabとの縁を切りたいときはUnpack: インスタンスを右クリック →「Prefab > Unpack」で、Prefabとのつながりを解除して普通のGameObjectに戻せます。「このPrefabを下敷きに、まったく別物を作りたい」ときに使います(Unpack Completelyは入れ子のPrefabまで全部ほどきます)。

まとめ

Prefabは、Unityにおけるオブジェクト指向的な考え方を体現した機能であり、効率的でスケーラブルなゲーム開発を行うための根幹をなすシステムです。

  • Prefabは再利用可能なオブジェクトの「設計図」。
  • 元のPrefabを編集すれば、全てのインスタンスが一括で更新される。
  • Instantiate()で、ゲーム実行中にオブジェクトを動的に生成できる。
  • オーバーライドで、特定のインスタンスだけ設定を上書きできる。
  • バリアントを使えば、基本Prefabを継承した差分Prefabを効率的に管理できる。

Prefab化の目安は、 「再利用するもの」「実行中に生成するもの」「構造が複雑で壊したくないもの」 の3つです。敵・弾・アイテム・UIパーツはPrefab化がほぼ必須ですが、逆に「このシーンに1回しか登場しない背景の飾り」まで機械的にPrefab化する必要はありません。この引き際も含めて使いこなせるようになれば、脱初心者への大きな一歩です。