プレハブの種類を知ろう【Nested PrefabsとPrefab Variants】

Unity Basis Thumbnail

前回プレハブの基本について解説しました。

今回はプレハブのちょっと発展した使い方を解説したいと思います。

この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<Nested Prefabsとは>

プレハブには「入れ子」と呼ばれる状態があります。

どういう状態かと言うと、プレハブの中に別のプレハブが存在すると言う場合です。

これをネステッドプレハブと言います。

Nested Prefabsの使い方

Unity2018.3より前かそれ以降かで扱いが違うので注意してください。↓からご自身が使っているUnityのバージョン方のボタンを選んでクリックしてください。Nested Prefabsの使い方の解説が展開します。

クリックすると展開します

Unity2018.3以降のバージョンの場合、プレハブの中にプレハブを入れることができます。この機能の事をNested Prefabsと言います。

とりあえずやってみましょう。前回用意した適当に作ったプレハブをとりあえずシーン上に置いてみます。

prefab

とりあえず、これを3つくらい並べてみましょうか

any prefab

とりあえず、並べました。それではこれらとは別のプレハブを作ってみましょう。

other prefab

とりあえず、Sphereを作ってプレハブにしてみました。

add prefab in prefab

ここで、真ん中の棒をSphereの子オブジェクトにします。前回、パラメータをいじった時は変更箇所が太字になって横に青線ができていましたが、子オブジェクトを増やすとプレハブに+マークがつきます。

ちょっと、これではわかりづらいので、もう一個適当にオブジェクトを作って、今度はプレハブにはせずにSphereの子オブジェクトにしてみましょう。

prefab add children

Capsuleというオブジェクトを作成して、Sphereの子オブジェクトにしてみました。すると、Cubeのアイコンは青色なのに、Capsuleは白色です。

プレハブを元にして作られたゲームオブジェクトは青色の箱で見分けがつくようになっています。Cubeはプレハブですが、Capsuleはプレハブではないということですね。

このように、「プレハブを元にして作られたゲームオブジェクト」の中に「プレハブを元にして作られたゲームオブジェクト」を入れても、プレハブとの関係が維持されているのがわかります。

これがプレハブの入れ子状態です。

この状態で、Apply Allを押してみましょう。

apply all nested prefab

これで、プレハブの中にプレハブが入っている状態になりました。

ヒエラルキーを見ても、ちゃんと子オブジェクトが青字になっているのがわかります。

prefab in prefab

青字になってSphereのプレハブに含まれている事がわかるし、横の箱の色で、その子オブジェクト自体にもプレハブがあるのかどうかがわかります。

この状態でCubeのプレハブをいじるとどうなるのでしょうか。ちょっとやってみましょう。

change prefab in prefab

さて、元のCubeのプレハブに対して変更を行ったところ、Sphereの中のプレハブには変更が反映されていない事がわかります。

プレハブの中にプレハブを入れた場合、そのプレハブは独自のパラメータを持っている物として扱われます

独自のパラメータを持っているとして扱われている場合、プレハブの元ファイルを変更してもそのパラメータは適用されません。これは前回解説しています。

ちょっとややこしいですが、ヒエラルキー上でSphereの中のCubeを選択しても太字の場所はどこにもなく、独自のパラメータを持っているようには見えません。

sphere prefab change cube prefab

ここでSphereの「>」をクリックして、Sphereのプレハブの画面に飛ぶと、↓のようにプレハブ用の画面ではパラメータに変更がされている事がわかります。

prefab mode blue line prefab

これは、ヒエラルキーにいるSphereの中のCubeはShpereのプレハブとパラメータが一致しているので変更はないものとして扱われます。

プレハブ画面のSphereの中のCubeは元のCubeのプレハブとパラメータが違うため、独自のパラメータを持っているものとして扱われるわけです。

元のプレハブと同じ状態にしたい場合は、プレハブ画面で

revert all prefab in prefab

Cubeを選択した状態でRevert Allを押せば、Cubeの独自変更がなかったことになるので、

revert all nested prefab

他のゲームオブジェクトと同じになります。

なんか大きさが違うのは親オブジェクトであるShpereのScaleが大きいからです。

逆にApply Allを押すことによって、入れ子にしたプレハブの変更を元のプレハブに適用することもできます。

Nested Prefabsの注意点

・Cyclic nesting detected

プレハブの中にプレハブを入れられることはわかりましたが、プレハブAの中にプレハブBを入れてApplyし、その後、プレハブBの中にプレハブAを入れてApplyするとどうなるでしょう。

要はお互いをループさせるようにプレハブを作るということです。

cyclic nesting detected

Cubeの中にSphereを入れてその中にCubeが入っている状態にしてみました。

Cubeの中にCubeが入っているので、上のCubeを更新すると下のCubeにも反映されて無限ループ状態になってしまいますね。

この状態でApply Allを押してみましょう。

error cyclic nesting detected

コンソールにエラーが表示されました。このようにプレハブがループする形にはできないということですね。プレハブ画面で同じようなことをすると

dialog cyclic prefab nesting

このようなダイアログが出てきてできないようになっています。

・Cannot restructure Prefab instance

また、プレハブの中に子オブジェクトを入れて適用すると、プレハブ画面でしかいじれないようになります。

プレハブモードではない状態でヒエラルキーから子オブジェクトを削除したり、親子関係を解除しようとしたりすると、

cannot restructure prefab instance

このようなダイアログが表示されて、子オブジェクトを動かせないようになります。Unity2018.3以降のバージョンではプレハブ内の親子関係をいじる際は、新しい子オブジェクトを追加する以外の行動は取れないので、プレハブモードで修正する必要があります

プレハブモードの細かい使い方については↓の記事にまとめてみたので、興味のある方はのぞいてみて下さい。

コンポーネントの適用について

プレハブを複製したゲームオブジェクトのコンポーネントをつけたり外したりすると

add and remove component in prefab

↑のように➖と+で表されます。

変更が存在する状態でコンポーネントの右側の歯車のようなマークをクリックすると↓のようになります。

apply as overrides in prefab

このAdded Componentの項目で、どのプレハブに適用するのか選ぶことができます。変更を破棄することもできます。

この項目で選んだ場合、歯車マークを押したコンポーネント単体の変更だけが適用されます。

入れ子の状態のオブジェクトに子オブジェクトを追加した場合

コンポーネントの時のようにどのプレハブに適用するのかというのは子オブジェクトも選ぶ事ができます。追加した子オブジェクトで右クリックして、Added GameObject

added game object apply to prefab

すると、このようにどのプレハブに適用するのかを選ぶ事ができます。これは現在選択している子オブジェクトのみに適用されます。

Unity2018.3より前のバージョンの場合、このプレハブの中にプレハブを入れてしまうと、れた方のプレハブは入れられたプレハブの物になってしまうという習性があります。

cube prefab

とりあえず、前回適当に作ったプレハブをシーン上に置いてみました。
同じものを3つ並べてみましょうか。

three prefab

とりあえず、並べました。それではこれらとは別のプレハブを作ってみましょう。

make another prefab

とりあえず、Sphereを作ってプレハブにしてみました。

sphere children

ここで、真ん中の棒をSphereの子オブジェクトにします。

sphere apply

そして、SphereのApplyを押せば、SphereのプレハブはCubeのプレハブを含むことになるのですが、Unity2018.3より前の場合は、CubeはSphereに吸収されてしまいます。

cannot nested prefab

↑のようにSphereの中にCubeがいるプレハブができます。

↓のように新しいプレハブに吸収されてしまった場合、元のプレハブを操作しても変更が反映されません。

scale change prefab

Sphereの中のCubeの変更をRevertしても状態は変わりません。

スポンサーリンク

<Prefab Variantsとは>

プレハブを用意したものの、そこからたくさん派生したい時というものもあると思います。

例えば、色違いの敵など、1つのものを基準としてそれとはちょっと違うプレハブを何種類も用意したい時はよくあります。

このように、1つのプレハブを基準に様々な派生として作られたプレハブをプレハブバリアントと言います。

これはUnity2018.3以降の機能なのでご注意ください。

Prefab Variantsの作り方

プロジェクトウィンドウでプレハブを選択した状態で右クリック>Create>Prefab Variant

prefab variant

すると↓のような派生系のプレハブを作成する事ができます。作成されたプレハブは初期の状態だと元のプレハブと同じ状態になっています。

variant icon

この操作はヒエラルキーにあるプレハブからプロジェクトウィンドウにドラッグ&ドロップしても同じ事ができます。

create prefab variant

↑のようにドラッグ&ドロップした際に

・Prefab Variant・・・派生系のプレハブにするのか
・Cancel・・・キャンセルするか
・Original Prefab・・・全く別のただのプレハブを作成するのか

というダイアログが表示されます。ここでPrefab Variantを選択すれば同じ事ができます。

Prefab Variantの変更について

このプレハブヴァリアントの機能を使用すると、派生元のプレハブを弄ると派生先のプレハブにも変更が適用されますが、派生先のプレハブをいじっても派生元には変更が反映されません

この機能のおかげで、元々のプレハブを変更さえすれば、派生先にいちいち変更を適用する作業をしなくても大丈夫です。便利なので覚えておくといいと思いますよ。

ちなみに、派生先のプレハブの変更を元のプレハブに適用したいときは、プレハブ画面で一番上の親オブジェクトを選択し、Overrides>Apply All to BaseとすればOKです。

apply all to base

<まとめ>

Point (Unity2018.3以降)

・プレハブの中にプレハブを入れる事ができるよ!
・プレハブの中のプレハブは独自パラメータを持つよ!
・独自パラメータを持っていると元のプレハブのパラメータを上書きするよ!
・Revert Allで独自パラメータを打ち消せるよ!
・プレハブは派生系を作る事ができるよ!

Point (Unity2018.3より前)

・プレハブの中にプレハブを入れる事ができるよ!
・プレハブの中にプレハブを入れると上のプレハブに吸収されてしまうよ!
・吸収されてしまったプレハブは元のプレハブの影響を受けないよ!

さて、Unityについて色々学んで来ましたが、次回はUnityを使用する際の注意点について解説したいと思いますので、よろしくお願い致します。



タイトルとURLをコピーしました