【Unity】Prefab(プレハブ)とは?複数配置・Variant・Instanceをやさしく解説

Unity
記事内に広告が含まれています。

VRChat用にワールドを作りたいだけなのに、Prefabって何? というところでつまずきました…。

照明や植物、イスなど、同じようなオブジェクトをたくさん配置したいだけなのに、1つ1つ設定していくのは正直めんどくさい……。
調べてみると、Prefabを使えば「オリジナルを1つ作って、それを複製する」だけで済むらしい。
ということで、Prefabをちゃんと理解することにしました。

この記事では、実際に自分が調べて試していく中で「ここがわかりにくかった」「最初に知りたかった」 ことを中心にまとめています。

Prefabとは何か、どうやって作るのか、
Prefabとシーン・ファイル保存の関係、
Prefabの親子関係、
そしてPrefab Variantの使いどころまで、
「複数のオブジェクトを配置したい」 という視点で解説しています。

基本的には、VRChat用のワールド作成で使うことを前提にしているため、ゲーム制作用の細かい話や高度な最適化の話はしていません。
とにかく「同じものをたくさん置きたい」という人向けの内容です。

なお、理解の助けとして、ところどころでBlender用語やBlenderの考え方に例えて説明しています。

Unityのバージョン 2022.3.22f1

スポンサーリンク

そもそもPrefab(プレハブ)って何

簡単に言うと、Prefabとは再利用できる「設計図」のようなもので、それを元に同じオブジェクトを何度も配置できる仕組みです。
最大の特徴は、元のPrefabを変更すると、シーンに配置したすべてのコピーにその変更が反映される点です。

Prefab(プレハブ)の特徴

  • あるオブジェクトを参照して、同じものをたくさん複製できる
  • Prefabを複製したものは、トランスフォーム(位置・回転・スケール)や一部の設定は、個別に変更することができます
  • オリジナルのPrefabに変更を加えると複製した全てのPrefabにもその変更が反映される
  • シーン内の位置情報や描画処理は増えるので、ワールドのポリゴン数の削減にはならない(※描画最適化の仕組みとは別の話です)

ワールド作成などで木やイスや照明などをたくさん出して複製したいときがあると思います。そういうときにPrefabとしてシーンに追加するとオリジナルを1個設定するだけで済んで、効率的に作成できます。

アバター作成でも、素体をprefabにして複製し、着せ替えや色を変えたり違うバージョンを作って、素体の修正などをPrefabで行えば修正が全てのバージョンに適用されるといった使い方ができます。

Unityの解説だけどスザンヌポリゴンを使っているだけです。これはUnityの解説です。

Blenderのインスタンスとの違い

1つのオリジナルがあり「それを複製して使う」という言い方から、Blenderで言うインスタンスに近いですが、微妙に違いもあります。

Blenderのインスタンスは、同じメッシュデータを共有して描画されるため、複数配置しても比較的描画負荷を抑えられますが、UnityのPrefabはテンプレートを作って複製すると、描画するポリゴンは増えるしグローバルな位置情報なども常に持っているので処理負荷は割と普通にかかります。

Blenderのインスタンス的な感覚で使うとよくないので気を付けた方がいいかもしれません。

スポンサーリンク

Prefab(プレハブ)の作り方

Prefabの作り方は簡単です。

Cubeを作ってそれをPrefabにしてみます

  • ヒエラルキーで右クリック、
    3D Object > Cube でCubeのGame Objectを作ります。
    (ちなみにヒエラルキーにあるものは全て GameObject です。
    GameObject自体は空の入れ物で、Mesh Renderer や Collider などのコンポーネントによって形状や性質が決まります。
  • そのCubeをProject画面のAsset内にドラッグ&ドロップします。
  • すると Asset 内に Cube の Prefab Asset(オリジナルの設計図) が作成され、ヒエラルキーにあった Cube は、その設計図を参照する Prefab Instance に変わり、アイコンが青い箱になります。
    これが Prefab 化された状態です。
  • Asset内にあるPrefab Assetをヒエラルキーにドラッグ&ドロップすると、Prefab Instanceが複数できます。

PrefabにはPrefab Asset(オリジナルの設計図) と、その設計図を参照する Prefab Instance があること、アイコンが青い箱になることがポイントです。

Prefab Instanceとは?

Prefab Instance は、Prefab Asset(設計図)を元にしてシーン上に配置されたオブジェクトです。
見た目は普通のGameObjectと同じですが、「元になったPrefab Assetとつながっている」という点が大きな違いです。
Prefab Assetを編集すると、シーン上にあるすべてのPrefab Instanceにも自動的に変更が反映されます。
つまり、Instanceは「コピー」ではなく、「設計図を参照している配置物」だと考えるとわかりやすいです。

スポンサーリンク

ファイル管理について

シーンとプロジェクトファイルの管理は別

Blenderを使っていると、シーンでいろいろ作って、ファイルを保存すると、そのシーンの情報が保存されますよね。でも他のファイルやフォルダを参照する場合は、ちゃんと保存しておかないと使えません。例えばテクスチャを作ったら、その都度ファイルとして保存しておかないと、Blenderを閉じたときに消えてしまいます。マテリアルも同じで、作っただけでは別にファイルが作られるわけではありません。

Unityは少し考え方が違います。ゲームを作るソフトなので、Projectという画面でファイルやフォルダを管理します。ここにオブジェクトやマテリアルをドラッグ&ドロップすると、その瞬間にファイルとして保存されるんです。だからPrefabを作るためにヒエラルキーからProjectにドラッグするだけで、Prefab Asset(オリジナルの設計図)のファイルが自動的に作られます。マテリアルも同じで、Project内に作った瞬間にマテリアルファイルが保存されます。

一方で、Prefab Instanceをシーンに置いた状態を保存するには、File > Saveでシーンを保存する必要があります。つまりUnityでは、Projectに置いたものとシーンの中にあるものは別管理になっているんです。Projectに置いたAssetはもうファイルとして保存されているけど、シーン内に配置した状態は保存しないと消えてしまう。

Blenderと比べると少しややこしいですが、簡単に言うと、Blenderは「シーンを保存することで作業データを丸ごと保存するソフト」、Unityは「Projectに置いたものはファイルとして保存されていて、シーンは別に保存する必要があるソフト」という違いがあります。こう考えると、Prefabやマテリアルを作るときに、Projectに置く意味がすっきりしてくると思います。

CubeをAssetにドラッグ&ドロップしてprefabを作ったら、Cube.prefabなどのファイルがプロジェクト内に勝手に作成されている

Blender的に言うと、ドラッグ&ドロップするだけでmark as assetして、ファイルも作られてアセットになってる感じです。結構感覚が違うので最初は自分も全然理解できなかったです。

AssetからPrefab AssetをDeleteすればファイルも消えます。ファイルの作成、削除が結構気軽にできてしまうので気をつけましょう。

スポンサーリンク

Prefabを解除する

Prefabを解除する方法です

解除したいPrefabインスタンスを選択し、右クリックでメニューを出します。

Prefab > Unpack or Unpack Completely
でPrefabが解除され、ただのゲームオブジェクトになります。

  • Unpack = 親だけリンク解除
  • Unpack Completely = 親も子もリンク解除

Prefabは別のオブジェクトを持てて親子関係も持てるのですが、後で解説します。

スポンサーリンク

Prefabに変更を加える

Prefab(プレハブ)モード

Prefab Assetに変更を加えてすべてのPrefab Instanceに変更を反映したいときの方法です。

  • ヒエラルキーのPrefabの右側に出てるを押す
    or
    PrefabのInspectorの右上に出てるOpenを押す
  • Prefab モードの画面に移るので、そこでスケールをして形を変えたり、マテリアルをつけたりすることができます。
  • ヒエラルキーのPrefabが表示されてる左上のを押すと通常のモードに戻ります。
  • 戻るとPrefabから複製したインスタンスすべてに変更が反映されており、アセットにあるPrefab Assetも変更されています。この変更がすでにファイルに保存されています。

この方法で、例えば森を作るために木のPrefabインスタンスをたくさん作って配置したあとでも、Prefabモードで変形すると、全ての木の形を変えたりできます。

オリジナル設計図が変更されるイメージです。

Prefabインスタンスを個別に変更する

今度は、Prefab Assetではなく、シーンに出ているPrefab Instance(インスタンス)に個別に変更を加えたい場合です。

3つのCubeのprefabインスタンスを、1つだけスケールで平べったくし、赤いマテリアルをつけます。(つまり複製したインスタンスを個別に編集することは簡単にできます。)

すると、まずinspectorで変更したパラメータに青い線がついて、何を変更したかわかりやすく表示されるようになります。(この場合はScaleとMaterialです)

Override(オーバーライド)

Prefabインスタンスのインスペクター上部のOverridesという項目を開くと、元のprefabからどのような編集をしたかが表示されるようになっています。

ここでは、変更を元に戻すか、全てのPrefabに変更を適用するかを選択することもできます。

  • Revert All…変更を元に戻し、元のPrefab Assetの状態に戻します。
  • Apply All…変更をPrefab Assetにも上書きし、全てのインスタンスに適用します。

(ちなみにパラメータごとに変更をオーバーライドすることもできます)

個別に変更したPrefabの特徴

また、例えばY方向にスケールをかけたPrefabインスタンスがあるとします。

別のPrefabを選択してPrefabモードでX,Y方向にスケールして変更を加えます。

すると、全てのPrefabに変更が適用されるはずですが、最初にY方向スケールをかけていたPrefabには、Y方向スケールの変更だけ適用されてません。(X方向スケールは適用されます)

個別に変更を加えたPrefabには、Prefab Assetを編集しても、同じパラメータの変更は適用されません。

スポンサーリンク

Prefabの親子関係

Prefabは親子関係を持つことができます。ドアとか、アイテムがセットで動くものなどもPrefabにすると便利に使えます

例えば、Cubeが親で、Sphereが子の親子関係があるオブジェクトを作ります。親のCubeをAssetにドラッグ&ドロップすると、子オブジェクトを持ったままPrefabにすることができます。

ただ、親のCubeがPrefabインスタンスになっているだけで子のSphereはゲームオブジェクトのままです。それでもセットでPrefab化されているので、Prefab Assetからインスタンスを作ると、Sphereもセットで出てきます。(Prefabの子のゲームオブジェクトは青文字になっています。)

インスタンスを個別に変更:子を追加

また、シーンに出てるPrefabインスタンスにさらに別のオブジェクトを子として追加することもできます。するとアイコンに+の記号がつきます。元のPrefab Assetからの変更をわかりやすく表示するためです。

ちなみにこの変更もオーバーライドすることができます。

ネストされたPrefab

また、Prefab自体をPrefabの子にすることができます。そこまでワールド作成で使うかなぁ…?ということでその詳細には今のとこ触れません。

スポンサーリンク

Prefab Variant

Prefab Variantとは

例えばたくさん家を作って配置したいとき、屋根の色違いとか、ちょっと種類の違う家を作りたいですよね。赤い屋根の家、緑の屋根、青い屋根…など5種類くらいの家を配置したいとします。こういうときにPrefab Variantの機能を使うと便利です。

Variant は「バリエーション」という意味で、その名の通り Prefabの派生バージョンを作るための機能 です。

prefab Variantの作り方

例えば、CubeというPrefabから2つのPrefab Instanceを作ります。次に、そのうち1つの色を赤に変えて、名前もわかりやすく RedCube に変更します。

このRedCubeをAssetにドラッグ&ドロップします。

すると注意ウィンドウが表示されて、

  • Original Prefab…元の Cube とは関係のない、完全に別の Prefab を作る
  • Prefab Variant…Cube を親とした、Prefabのバリエーションを作る

どちらにするか聞かれます。ここでは Prefab Variant を選びます。

すると RedCube という Prefab Variant の Prefab Asset が作成されます。同時に、ヒエラルキーにある RedCube も、Prefab Variant のインスタンス に切り替わり、アイコンが変わります。

Prefab Variantの使い方

Prefab Variantを作ったので使ってみましょう。

Cubeの Prefab と、その派生Prefabである RedCube をProject(Assets)からヒエラルキーにドラッグ&ドロップして、
それぞれ3つずつ配置しました。

こうすると、同じ構造だけど少し違うPrefab Instanceを、複数種類配置できます。

Prefab Variantにだけ変更を加えたいとき

そして、やっぱりRedCubeだけ少し形を変えたい、ということもできます。

RedCubeのPrefabインスタンスを1つ選択し、Prefabモードに入りますPrefab Assetそのものを編集するためです。編集して戻ると、RedCubeだけ全て変更が反映されています。

元のPrefabからすべてに変更を反映したいとき

やっぱり「元のPrefabを修正して、派生Prefabも含めてまとめて変更したい」ということもあります。

その場合は、元になっている Prefab(Cube)を選択してPrefabモードに入りますPrefab Assetそのものを編集するためです。

Prefabモードで編集してシーンに戻ると、元のPrefabだけでなく、そこから作られたPrefab Variantすべてに変更が反映されます。

※ちなみにVariantで変更したパラメータの変更は適用されません。例:右画像で言うと、すでにPrefab VariantはY方向にスケール変更しているので、元のPrefabをY方向スケールしても、Variantは変わりません。

これは、Prefab Variant が「元のPrefabを継承しつつ、一部を上書きしている」という仕組みになっているためです。

スポンサーリンク

まとめ

とにかく、同じものをたくさん配置したいときは、
まずPrefabにして、Prefab Instanceを複製していくのが基本です。

もし、「1個か2個だけ、ちょっと位置や色を変えたい」くらいなら、
Prefab Instanceをシーン上で直接いじるだけでOKです。
この場合は、シーンを保存すればその変更が保持されます。

一方で、「色違いの家を5種類作って、それぞれを大量に配置したい」みたいなケースでは、
PrefabからPrefab Variantを作って、それを複製するのが向いています。
こうしておくと、元のPrefabを直したいときはまとめて変更できますし、Variantごとの違いはそのまま保てます。

Prefab、Prefab Variant、Prefab Instanceをうまく使い分けると、
「同じものをたくさん配置したい」場面がかなり楽になります。
ぜひ使ってみてください。

スポンサーリンク

参考記事・動画

以下の記事や動画を参考にさせていただきました。

コメント