読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

プレハブの入れ子構造・Nested Prefabへの挑戦その2

前回のPrefab In Prefabとは方式が異なる、新しい方法を試してみた。

前回:[Unity]prefabの入れ子構造を可能にする、プレハブのネスト化を試作 その1
有力候補:prefab_in_prefab


■Nested Prefab 2

今回はプレハブ化に辺り特殊な事は行わず、ただ単純に元のプレハブの値を参照してオブジェクトのパラメータを戻す事を可能にしてみた。

Nested Prefab 2

要するにプレハブをまとめてプレハブ化した場合でもプレハブ元への参照を破棄せず、元々のプレハブの情報を巻き戻せるようにした。本来であればプレハブ化により元々のプレハブへの参照が切れてしまうのだが、これを残すことでプレハブ化した際にも値を巻き戻せる。

スクリーンショット 2014-06-01 17.28.02

前回のコンセプトは「プレハブのネスト化をエディタ・ランタイムで行う」「プレハブ情報はシーンに保存」がコンセプトだったので、今回は逆の方法を試した感じ。


■使い方


使い方は簡単、ProjectビューのプレハブにAttatchedPrefabをアタッチするだけ。
これで、以降プレハブをアタッチしたプレハブはネスト化しようと何しようとプレハブの参照元の値と同じコンポーネント・同じ値を持つ事になる。

スクリーンショット 2014-06-01 17.38.24
このAttatchedPrefabコンポーネントは、インスタンス化した際にPIPコンポーネントへ変化する。PIPコンポーネント参照元のプレハブ情報を保持しており、有効化している限りプレハブの元の値を元に自身と座標以外のコンポーネントを自動的に変化させる。

pip3.gif   
プレハブと違う値を設定したい場合、PIPコンポーネントのチェックを外す。こうする事で、プレハブが自動更新されなくなる。この際、Apply Prefabプレハブの値を現在のコンポーネント情報で上書きする。


■問題点

残念ながら、これも正解ではなかった。
この方法ではプレハブの構造を維持する事は出来ず、構造を持つプレハブのネスト化を行うことは出来ない(※)。この辺りは構造化の再現を得意とする前回とは逆だ。

(※):全てのオブジェクトを別オブジェクトとして持ち、各々が構造を持つならば一応は可能

スクリーンショット 2014-06-01 18.13.29

まあネスト化の目的が特定のコンポーネント・パラメータを持つ事であれば、この方法で十分かもしれない。複雑なPrefab in prefabを複数持っても一つの値を参照しているし。

それと、この方法は「シーンを見ないとプレハブがアップデートされない」ので注意(もしくは、PIPがアタッチされてる全てのプレハブを見つけ出してPIPのReset Prefabする等)

もし良いアイディアがあれば、コメント欄か@tsubaki_t1まで