プレハブ(Prefab)の使い方を覚える!Unity初心者でもわかるプレハブ解説

  Unity  




今回はUnityのプレハブ機能についてまとめてみようと思います。最初にUnityを触った時は、はっきり言ってプレファブ?プレハブ?ってなんなの?という感じで理解できませんでした……。未だに理解が曖昧なままなので、今回を機にしっかり勉強し直しました!

Unity 2018.3からプレハブのネスト(階層化)が可能になりました。プレハブの中に他のプレハブのインスタンスを含めることができる機能です。プレハブの入れ子、ネスティングプレハブ、または、プレハブ in プレハブとも言うようです。(どれが正解かわかりません。どなたか教えてください)そのあたりも含めてまとめてみます。

プレハブを全く知らない初心者の方でも、便利な機能があるならちょっと覚えてやろうくらいの気持ちで気楽に読んでみてください。プレハブやインスタンスといった用語を覚えるのは後でも構わないと思います。

では、さっそく見ていきましょう。

(記事内の画像が見にくい場合は、クリックして拡大表示してください)

プレハブとは

ゲームオブジェクトを登録しておくと、同じものを複製できる機能のことです。 トランスフォームの値やコンポーネントなどもすべてそのまま複製することができます。

よく金型やスタンプに例えられますが、同じものをぽんっぽんっと作り出せるイメージです。

登録しておくゲームオブジェクトの事を『プレハブ』、プレハブから複製されたゲームオブジェクトのことを『インスタンス』と呼びます。

プレハブを使えば、ゲームオブジェクトを後から一つ一つ編集する必要はありません。プレハブに行った変更は、プレハブから生成されたインスタンスすべてに適用されます。金型を変えれば、作り出されるものも変わりますよね。

作業環境

  • Unity 2018.3.0f2
  • Windows10

プレハブを生成する

まずは、シーンにキューブを配置して、そのゲームオブジェクトをプレハブにしてみます。

ヒエラルキーウィンドウを右クリックして、3Dオブジェクト → キューブの順でキューブを作成しておきます。

ヒエラルキーウィンドウから右クリック→3Dオブジェクト→キューブの順でキューブを作成します。

次にこのキューブをプレハブに登録する方法ですが、ヒエラルキーウィンドウからプロジェクトウィンドウへドラッグするだけです。

ヒエラルキーウィンドウからプロジェクトウィンドウへゲームオブジェクトをドラッグするとプレハブが生成される。

ヒエラルキーウィンドウのゲームオブジェクトの色が青色に変わっているのがわかるでしょうか? これはプレハブが作られて、このゲームオブジェクトがインスタンス化したことを表しています。

以前は空のプレハブを作ってそこにゲームオブジェクトをドラッグしていたようですが、その作業はもう必要有りません。

インスタンスを生成する

プロジェクトウィンドウからインスペクターウィンドウ(またはシーンビュー)にドラッグすれば、インスタンスを生成することができます。

プロジェクトウィンドウからヒエラルキーウィンドウ、または、シーンにドラッグすることでインスタンスを生成することができます。

さらにいくつもインスタンスを生成したい場合は、ドラッグを続けてもいいですが、「右クリック → 複製」やCtrl+Dでも複製が可能です。ここは他のゲームオブジェクトと同様の操作ですね。

ゲームオブジェクトと同様の操作でインスタンスも複製することができる。右クリックからの複製やCTRL+Dで複製することも可能。

上記のGIFでは、右クリックから複製したあとCTRL + Dで三回複製をしています。

プレハブを編集する

プレハブを編集するためのプレハブモードにする方法は三つあります。

  • ヒエラルキーウィンドウのインスタンス右側の「>」をクリック
  • プロジェクトウィンドウのプレハブをダブルクリック
  • プロジェクトウィンドウでプレハブを選択しインスペクターウィンドウの「プレハブを開く」をクリック

プレハブモードにするためのやり方は三つあります。どの操作でプレハブモードに移行しても結果は同じなのでやりやすい操作を見つけるといいでしょう。

プレハブモードとは、Unity2018.3から追加されたプレハブを編集するための画面です。インスペクターウィンドウで値の編集やコンポーネントの追加をすることができます。

プレハブの編集をするための画面をプレハブモードと呼びます。ここではインスペクターウィンドウから値を変更したりコンポーネントを追加したりできます。

ここでは例として、プレハブのZ方向の大きさを変えてみました。

ここでは例としてプレハブの大きさを変更してみます。Z軸方向に大きさを変えてインスタンスがどのように変化するのか見てみましょう。

プレハブモードを終了するには、ヒエラルキーウィンドウの「<」をクリックしてください。

プレハブモードを終了するにはヒエラルキーウィンドウの左上の「<」をクリックします。

すべてのインスタンスにプレハブの変更内容が反映されていることがわかります。

プレハブに変更を加えたのでインスタンスが全てプレハブと同様に変わりました。このように一度に多くの修正が発生する場面ではプレハブは真価を発揮します。

複数あるゲームオブジェクトに変更を加えたい場合、一つずつ編集することなく大元のプレハブを編集するだけで済みました。これがプレハブを使うメリットです

インスタンスの変更をプレハブに反映させる

プレハブの修正ですが、インスタンスに加えた変更をプレハブに反映することもできます。これをオーバーライドといいます。 実際にやってみましょう。

インスタンスの大きさを一つだけ変更してみました。この変更をプレハブに反映させてみます。

インスタンスへの変更をプレハブに適用させるために、インスタンスの一つに変更を加えてみます。これをプレハブに適用させるためにオーバーライドという機能を使います。

変更したインスタンスを選択した状態で、インスペクターウィンドウのオーバーライドという箇所をクリックします。

インスペクターウィンドウのオーバーライドをクリックしましょう。

変更を加えた項目が表示されていますので、問題がなければ「すべてを適用する」というボタンをクリックしましょう。「すべてを元に戻す」は後述します。

ここでは変更した箇所が一つなのでひとつ分の修正項目しか表示されていませんが、複数修正していた場合は、複数の項目が表示されます。

プレハブの値が変わったので、他のインスタンスもすべて大きさが変わりました。

インスタンスへの変更がプレハブに適用され、さらに他のすべてのインスタンスへと適用されました。

作業は簡単ですが、それゆえに慎重さも求められると思います。余計な変更が全体に反映されないよう注意しましょう。

ちなみに修正箇所が複数ある場合は、このように複数の変更内容が表示されます。

修正を加えた数だけ変更箇所が表示されています。どこを修正したか仮に忘れてしまっても一目瞭然です。

先ほどと同じように「すべてを適用する」をクリックすれば、すべての変更がプレハブに反映されます。

個別に変更を加えたい場合は、各項目をクリックしてみてください。

例えば、トランスフォームをクリックしてみると、変更内容の詳細が表示されます。

変更箇所を差分で表示してくれます。大変便利な機能なので是非覚えるようにしましょう。

この内容をプレハブに適用したい場合は、右上の「適用する」をクリックしてください。「元に戻す」は後述します。

この操作は、個別の反映だけでなく変更内容の確認にも使えますので、覚えておいて損はないかと思います。

修正箇所の差分を出す手順を表示しています。

なお、各項目ごとの反映方法はもう一つあります。

インスペクターウィンドウの変更した項目のところで「右クリック」 → 「プレハブに適用」をクリックすると、個別に反映させることができます。

もう一つの個別反映のやり方です。インスペクターウィンドウでは変更を加えた箇所が太字になって表示されるので、そこで右クリックからプレハブに適用をクリックすればプレハブに反映することが可能です。

注意点

インスタンスとプレハブへの変更は、インスタンスの変更が優先されます。プレハブに変更を加えてもインスタンスに反映されないということが起こりうるので、インスタンスへの変更は最小限に留めましょう。

どうしてもインスタンスにだけ個別に修正を加えたいという場合は、別のプレハブにしたほうが無難です。プレハブとインスタンスの値に乖離がある状況は好ましくありません。

インスタンスの設定を元に戻す

インスタンスへ加えた変更をなかった事にして、プレハブの値に戻す方法は三種類あります。

  • インスペクターウィンドウのオーバーライド → すべてを元に戻す

インスタンスに加えた変更をすべてリセットする方法です。一箇所だけ残すと言ったことはできません。

「すべてを元に戻す」をクリックすれば、インスタンスに加えた変更はすべてなかったことになり、プレハブと同じ状態に戻ります。 複数の修正項目があっても、すべてがリセットされます。

  • インスペクターウィンドウのオーバーライド → 各項目の選択 → 元に戻す

この方法だと個別反映の逆で、一つずつ選んで設定をリセットすることができます。

各項目の変更内容を確認しながら作業したい時におすすめです。

  • インスペクターウィンドウのの各項目の設定 → リセット

修正箇所の差分を確認する必要がないときはこちらの方法が早いです。インスペクターウィンドウから2クリックで反映をリセットすることができます。

変更内容がわかっている場合は、こちらの方が早いと思います。

三つと言いましたが、インスタンスを削除して再度作り直す方法もありますね。

プレハブを解除する

インスタンスをゲームオブジェクトに戻す方法です。

ヒエラルキーウィンドウで変更したいインスタンスに対し、「右クリック」 → 「プレハブを展開」でゲームオブジェクトに変更することができます。

プレハブを展開だと少しわかりにくいですよね。解除という日本語を当てて欲しかった気がします。unpackの訳なので仕方ないですが。

その下にある「プレハブを完全に展開」は、階層化されたプレハブもすべて対象になります。

この操作を行うとインスタンスではなくなるので、オーバーライドなどの操作も当然行えなくなります。

プレハブを階層化する

プレハブを階層化するには、プレハブモードにしてから、プロジェクトウィンドウのプレハブをヒエラルキーウィンドウ(またはシーンビュー)にドラッグします。 これで、ドラッグしたプレハブのインスタンスが子に設定されます

プロジェクトウィンドウからヒエラルキーウィンドウにプレハブをドラッグするだけで親子関係を作ることができます。

プロジェクトウィンドウのプレハブにも変更が反映されて、見た目が変わっているのがわかると思います。つまり、プレハブ自体が変更されたことになります。(プレハブモードなので当たり前ですが…)

これに対して、プレハブモードに入らず階層化することもできます。 階層化したいインスタンスの上にプレハブをドラッグしてください。

プレハブモードにしないで階層化した場合は、プレハブに階層化は適用されません。インスタンスにオーバーライドされているという一見ややこしい状態ですが、アイコンにわかりやすく違いが現れるので親切設計だと思います。

ヒエラルキーウィンドウを見ると階層化はされていますが、親のインスタンスにオーバーライドとして追加されている状態です。 アイコンにプラスマークが表示されているので違いがわかると思います。

インスタンスにオーバーライドされている状態がひと目でわかるようにプラスマークが表示されています。

他のオーバーライドと同様に、インスペクターウィンドウの「オーバーライド 」→ 「すべてを適用する」をクリックすることでプレハブに適用することが可能です。

インスタンスにオーバーライドが追加されていても他のオーバーライドと考え方は同じです。インスペクターウィンドウから適用するを選べばプレハブに内容を反映させることができます。

プレハブを削除する

これは簡単ですね。プロジェクトウィンドウから削除すればOKです。

ただし注意点としては、インスタンスがある状態でプレハブを削除してしまうと、画像のように文字が茶色の状態になります。(Missing Prefabと表示されることもありますが表示される条件がわかりませんでした……)

インスタンスがあるのにプレハブを削除してしまった場合です。参照元のプレハブがないのでエラーになってしまいます。

この状態で再度プレハブ化しようとすると、Cyclic nesting detected.(巡回ネスティングが検出されました)というエラーが出てしまいプレハブ化できません。

こうなってしまったら、「プレハブの展開」をしてからプレハブ化してください。

あとがき

プレハブ奥が深い!(階層化できるだけに)  個人的にプレハブのことをより知れたので満足しているのですが、わかりにくかったらすみません。説明って難しいですね。

あと勘違いしてないといいなとか不安な気持ちも少々あります。間違えていたら教えてくださると嬉しいです。

一応、プレハブ、インスタンス、オーバーライドあたりはなんとなく覚えられた(気がする)ので、あとは使いこなすだけですね……! ではっ!