ikoan unity 開発メモ

Unityに関するアレコレを日々つづっていこうと思います

Nested Prefab触ってみた

環境

Unity2018.3.0f2

概要

少し時間が経ってしまいましたが、ついにUnity2018.3が本リリースされましたね。
既存機能の更新もありますが、新機能の追加もたくさんあります!
今日はその中で昔から要望が多かったと言われる「Nested Prefab」を触っていこうと思います。
※2018.3の更新では「Nested Prefab」の機能追加もそうですが、それに関しては一部のことで大きくいうとPrefab機能の更新、PrefabEditorの追加となっています。

Prefabとは

そもそもPrefabとは何かと言うと、同じ形状や見え方をするGameObjectの金型みたいなイメージでしょうか。
例えば、森を表現したいときに、木のPrefabを用意して、それをシーンに複数配置することで実現できます。
その時、木の高さを高くしたい場合、シーンに配置したGameObjectを一つ一つ修正するのではなく、金型であるPrefabを修正することで全ての木にその修正を反映させることができる便利な機能です。

Nested Prefabとは

ざっくりいうとPrefabの入れ子のことです。
先ほど挙げましたPrefabの修正でシーン上に配置されている全GameObjectを修正できるというのは制限がありました。
それは「子にPrefabBを元にしたGameObjectBを配置したGameObjectA」をPrefab化した場合、PrefabBのリンクが切れてしまい、PrefabBを修正してもGameObjectBには反映されなくなる、ということです。
逆にそれを利用するという考え方もあるとは思いますが、Prefabという思想上、それが実現できないというのは、やはり少しやりづらい場面が多かったです。
今回リリースされた2018.3では、そのNested Prefabが実現できるということで、同時に実装されたPrefab Editorと一緒に触ってみました。

実際の操作・挙動

まずはSphereCapsuleを子に持ったPrefabAを作成し、適当に配置します。
f:id:ikoans:20181226175101p:plain

次にCubeとPrefabAを子に持ったPrefabBを作成し、適当に配置します。
f:id:ikoans:20181226175220p:plain

この時、ProjectView内のPrefabを選択すると、Inspector内にOpen Prefabというボタンが表示されます。それを押すか、もしくはProjectView内のPrefabをダブルクリックすることで、PrefabEditorが表示されます。ここで、Prefab内の情報を操作することができるわけですね。
試しにPrefabAをPrefabEditor上で編集してみます。
PrefabA内のCapsuleを少し上に移動させると、、、割とすぐにScene上のObjectにも反映されますね!
f:id:ikoans:20181226175413p:plain

次はシーン上のObjectを直接操作して、それをPrefabに反映してみましょう。
今度はシーン上でPrefabAオブジェクトのSphereを少し大きくしてみます。Sphereを選択してTransformのScaleを2倍にしてみます。
この状態ではPrefab自体には更新がかかっていないので、PrefabBオブジェクトの子に配置されているPrefabAオブジェクトのSphereは更新されていません。
f:id:ikoans:20181226175848p:plain

Prefabの変更を反映させるために、Hierarchy VIewで更新を加えたPrefabの一番親であるGameObjectを選択します。そうするとInspector上にPrefabという項目が表示されています。(通常のGameObject上にはこの表示はありません)
f:id:ikoans:20181226180431p:plain

項目内の右端にあるOverridesをクリックします。そうすると、対象Prefab内に含まれるGameObjectの一覧が表示されます。表示された一覧内のアイテムをクリックすると、変更があるGameObjectだった場合、その変更箇所も表示されます。
f:id:ikoans:20181226180820p:plain

変更を全て更新する場合は「Apply All」を、すべて元に戻したい場合は「Revert All」を選択します。
変更の一部を反映させたい場合は、Overridesをクリックした時に表示される一覧から、反映させたいGameObjectの変更箇所を選択し、それぞれApplyしていきます。
今回は「Apply All」を選択します。そうするとPrefab Bに含まれるPrefabAのGameObjectにも変更がかかりました!
f:id:ikoans:20181226181345p:plain

注意点

「Nested Prefab」便利ですが、一つ注意点があります。
例えば上記のPrefabBの子であるPrefabA ObjectのパラメータCを変更してしまった場合、PrefabAのパラメータCをいくら変更しても、PrefabBの子のPrefabA ObjectのパラメータCは変更が反映されません。
というか、これはNested Prefabだけに限らず、通常のPrefabでも同様ですね。
シーン上に配置したPrefabから作成したGameObjectのパラメータを変更した後、PrefabEditor上で同じパラメータを変更しても、シーン上のGameObjectには変化がありませんでした。
シーン上で変更があるパラメータに関して、元のPrefabに変更がかかっても、その変更は反映されません!!
オリジナルから変更が入っている時点で、そのパラメータまで上書きされるというのはやりにくいところなので、いいことだとは思いますけどね。

まとめ

「Nested Prefab」、ベータ版で揉まれたのでしょうか、とても使いやすいですね。
唯一、シーン上からの変更をApplyする箇所、あそこは画面小さいですし、操作がしにくそうではありますが。。。
別Windowで変更があるシーン上のオブジェクトを一覧で表示して、どれを反映させるかのチェックがあるEditorWindowとか作成すると、少し需要があるような気はします。
そのGameObjectがPrefabが存在して、どこのパラメータがどのように変更されたかを手軽に検知・表示できるとサクッと作れるのですが。

戯言

副鼻腔炎というのにかかってました。
微熱ではありますが、熱は出るし、頭や頬、歯が痛くなったり、喉の痛み、鼻水・痰など症状が多く、とても辛いわけではないのですが、10日間ぐらい寝込み、地味に辛かったです。
かからないための予防はこれといってないとは思いますが、日頃からの免疫力強化や不摂生をしないっていうことは大事だなぁと思った年末でした。
皆さんも、体調には十分お気をつけください。