少し前の話だけど、プレハブのネスト化に挑戦してみた。
UniNestedPrefab
また、各プレハブ共にプレハブを維持しているため、プレハブを維持したままプレハブの中のプレハブを更新したり、ユニーク化(シーン内で変更した値は大本のプレハブを更新しても反映されない)事も可能となっている。
使い方
Prefabの親子関係を作る。後はシーンへ配置すると、自動的にプレハブを構造化する。またこの方法でプレハブ化した場合、子は親の子としてプレハブに含まれないため、変更を受け付ける。
- 親となるプレハブに「PrefabInPrefabController」をアタッチする
- 1でアタッチしたプレハブの下にプレハブを配置する
- PrefabInPrefabControllerの「子プレハブを登録して更新」を実行
- 子プレハブが登録され、親オブジェクトのインスタンス時にプレハブが生成される
一応「プレハブのプレハブのプレハブのプレハブ」を生成し、上から2番めのプレハブのみを更新とかも可能。
機能はこんな感じ。
- 子プレハブを登録してプレハブを更新
子プレハブ一覧を取得してPrefabInPrefabControllerへ登録、このオブジェクトがインスタンス化されたタイミングで自動的にインスタンス化するように設定する。と同時にプレハブを更新。
- プレハブを更新
プレハブを更新する。子がプレハブの場合は一旦Tempへ退避させ、プレハブに組み込まれるのを防ぐ
- プレハブ生成:
PrefabInPrefabControllerへ登録されているプレハブを生成する
やってる事
やってる事は単純で、「インスタンス化したタイミングで登録されているプレハブをインスタンス化」するだけ。その際、InstantateではなくPrefabUtility.InstantiatePrefab経由でインスタンス化することで、プレハブの独立性を失うこと無くインスタンス化している。
また、プレハブを更新する際にプレハブの親子関係が維持されてしまうのを避けるため、「プレハブを更新」コマンドでは子プレハブは一旦Tempオブジェクト下へ退避させてから更新し、プレハブが小プレハブにされてしまうのを防いでいる。
問題点
試作しただけなので問題点は放置されている。例えばプレハブをTempへ退避させた後に何らかのエラーが発生しTempが残ってしまったり。
そもそもこのアセットは現在子プレハブの座標やスケール・コンポーネント情報を維持しないので、その辺りも対応する必要がある。
どう作れば良いのか、もし意見があれば大募集。