テラシュールブログ

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

prefabの入れ子構造を可能にする、プレハブのネスト化を試作 その1

少し前の話だけど、プレハブのネスト化に挑戦してみた。
UniNestedPrefab

prefab.gif
このアセットはプレハブを配置した際、事前に登録していたプレハブを自動生成するアセット。下の画像のようにシーンへドラッグ&ドロップすることで自動的に構造化したプレハブを再現することが出来る。

また、各プレハブ共にプレハブを維持しているため、プレハブを維持したままプレハブの中のプレハブを更新したり、ユニーク化(シーン内で変更した値は大本のプレハブを更新しても反映されない)事も可能となっている。


使い方
Prefabの親子関係を作る。後はシーンへ配置すると、自動的にプレハブを構造化する。またこの方法でプレハブ化した場合、子は親の子としてプレハブに含まれないため、変更を受け付ける。
  1. 親となるプレハブに「PrefabInPrefabController」をアタッチする
  2. 1でアタッチしたプレハブの下にプレハブを配置する
  3. PrefabInPrefabControllerの「子プレハブを登録して更新」を実行
  4. 子プレハブが登録され、親オブジェクトのインスタンス時にプレハブが生成される
下の例では、「Cube」と「NewText」の親子構造をプレハブとして登録し、インスタンス・プレハブの更新を行っている。既にCubeの子として登録されているNewTextプレハブも色が変化している事が分かる。
prefabinprefab2.gif  
プレハブを更新する場合、 プレハブのApplyではなくPrefabInPrefabControllerの「プレハブを更新」を使う。なお、プレハブではない子オブジェクトは親オブジェクトのプレハブとして登録される。

一応「プレハブのプレハブのプレハブのプレハブ」を生成し、上から2番めのプレハブのみを更新とかも可能。

機能はこんな感じ。

  • 子プレハブを登録してプレハブを更新
    子プレハブ一覧を取得してPrefabInPrefabControllerへ登録、このオブジェクトがインスタンス化されたタイミングで自動的にインスタンス化するように設定する。と同時にプレハブを更新。
  • プレハブを更新
    プレハブを更新する。子がプレハブの場合は一旦Tempへ退避させ、プレハブに組み込まれるのを防ぐ
  • プレハブ生成:
    PrefabInPrefabControllerへ登録されているプレハブを生成する

やってる事

やってる事は単純で、「インスタンス化したタイミングで登録されているプレハブをインスタンス化」するだけ。その際、InstantateではなくPrefabUtility.InstantiatePrefab経由でインスタンス化することで、プレハブの独立性を失うこと無くインスタンス化している。

また、プレハブを更新する際にプレハブの親子関係が維持されてしまうのを避けるため、「プレハブを更新」コマンドでは子プレハブは一旦Tempオブジェクト下へ退避させてから更新し、プレハブが小プレハブにされてしまうのを防いでいる。


問題点

試作しただけなので問題点は放置されている。例えばプレハブをTempへ退避させた後に何らかのエラーが発生しTempが残ってしまったり。

そもそもこのアセットは現在子プレハブの座標やスケール・コンポーネント情報を維持しないので、その辺りも対応する必要がある。

どう作れば良いのか、もし意見があれば大募集。


プレハブの入れ子構造・Nested Prefabへの挑戦その2 - テラシュールブログ