U
12 / 22 · 8 分
FAQ

Prefab:ファイル、コピー、その間の変更

短い答え

Unity における Prefab とは?

Prefab は Project パネルにファイルとして保存された GameObject のことです。シーン内のコピーはそれに従うので、ファイルを編集すると全部が一括で変わります。コピー側を編集すると、そのコピーだけの override として記録され——太字で表示され、Overrides ドロップダウンの Apply All と Revert All で扱えます。

Prefab とは、ファイルとして保存された GameObject のことです。シーンに置いたあれは互いのコピーではなく、全員がたった一つのファイルについていきます。だからファイルを変えれば、すべてが一気に変わる。アイデアはそれだけで、prefab の分かりにくい点は例外なく一つの質問に行き着きます:今触っているのはファイルか、それともそのコピーか。

Prefab を作る

  1. 1

    シーン内で、納得のいくまでオブジェクトを組み立てます:mesh、material、collider、スクリプト、子オブジェクト、すべて込みで完成させてから次に進みます。

  2. 2

    Hierarchy から Project パネル内のフォルダへドラッグすると、Hierarchy での名前が青くなります —— これでそのコピーは、ディスク上のファイルのインスタンスになりました。

  3. 3

    ファイルは何度でもシーンへドラッグし戻せます。敵が 20 体いても、ファイルは一つです。

コピーではなく、ファイルそのものを編集する

Project パネルで prefab をダブルクリックすると Prefab Mode が開きます —— 他には何もじゃまのない、がらんとしたステージにそのオブジェクトだけが立っています。そこでの変更はそのままファイルへの変更なので、あらゆるシーンのあらゆる instance が即座についていきます。

  • シーン内の instance を変更した場合は override が生まれます:あのコピーの、そのプロパティひとつだけが、今後ファイルに従わなくなるということです。Inspector では太字表示になり、余白に青い線が付きます。

  • Inspector 上部の Overrides ドロップダウンであらゆる override を一覧でき、本当に効いてくる二つのボタンもそこにあります:変更をファイルへ書き戻す Apply All と、変更を捨てる Revert All です。

  • override は誤りではありません。巡回ポイント、速度、コピーごとに違う色 —— それらのためにある機能です。ただし override を三十個も抱えたコピーは、名ばかりの prefab と言ってよいでしょう。

Variant —— ほぼ同じもののために

Prefab Variant は別の prefab をベースにした prefab です。親からすべてを受け継ぎ、上から数カ所だけ変えます。土台となる Enemy を作ってから、速度と色だけを変えた Fast Enemy の variant を作れば、土台のバグを直すだけで両方が治ります。

  • Project パネルで prefab を右クリック → Create▸Prefab Variant を選び、variant を開いたら、それを 他と違わせる部分だけを編集します。

  • prefab は別の prefab の中 —— 車の中のホイールのようなもの —— にも入れられ、それぞれが独自のリンクを保ちます。Unity では nested prefab と呼ばれ、外側の prefab と全く同じように振る舞います。

コードから prefab を生成する

Spawner.cs — the field holds the file, never the copy in the scene
using UnityEngine;

public class Spawner : MonoBehaviour
{
    public GameObject enemyPrefab;   // drag the asset from the Project panel

    void Start()
    {
        Instantiate(enemyPrefab, transform.position, Quaternion.identity);
    }
}

Project パネルからあのスロットへファイルをドラッグしてください —— Hierarchy に立っている コピーではなく、ファイルの方です。シーン上のオブジェクトを指しておくと、そのオブジェクトが 削除か無効化を受けるまで何事もなく動くため、これまで生まれた壊れた spawner のほぼ半分は これが原因です。 Instantiate には専用のガイドがあります。

見分けておきたい 2 つの状態

  • Missing Prefab という名前の赤いオブジェクトは、それが付けていたファイルが Unity の外で削除、もしくは移動されたことを意味します。シーンに残っているのは空の殻です:ファイルを元の場所へ戻すか、殻を消してください。

  • Prefab > Unpack は意図的にリンクを断ち切る操作です:オブジェクトは手元に残りますが、もうファイルには追随しません。二度と再利用しない小道具に一度だけ役に立ち、他の場面ではほぼ後悔します。

これを作るレッスン

ブロックのプレハブ

この記事はそれだけで完結するレシピです。コースでは同じものを、5 つのタブを貫くひとつのプロジェクトの一部として作ります — 基礎 のレッスン 07。