はじめまして。TAの宮川です。
最近買ってよかったものは雪印ビーンスタークさんの「ハキラ」です。
出先で歯磨きができないときに大変便利なのでとてもオススメです。
さて今回はPrefabを用いたFBX管理について解説していきます。
本記事では、Prefabの前提知識として、
を紹介します。
そのあとに本題である、
を解説します。
環境
Unity2022.3.7f1
Built-in
Prefab
そもそもPrefabとは何なのかですが、
公式ドキュメントでは下記のように説明しています。
Unity の Prefab (プレハブ) システムでは、1 つのゲームオブジェクトをそのすべてのコンポーネント、プロパティ値、子ゲームオブジェクトとまとめて、再利用可能なアセットとして作成、設定、保存することができます。
簡単に言うとゲームオブジェクトやコンポーネントを1つにまとめる事ができるものです。
PrefabはゲームオブジェクトをProjectウィンドウへD&Dすると作成できます
PrefabをHierarchyウィンドウへD&Dするとインスタンス化できます。
NestedPrefab
公式ドキュメントでは下記のように説明しています。
プレハブインスタンスは他のプレハブに含めることができます。これは ネスト 状のプレハブと呼ばれます。ネストされたプレハブは別のプレハブアセットの一部となる一方で、自体のプレハブアセットへのリンクも維持します。
ネストというのは簡単に言うと親子関係を作ることができるということです。
(ネストしたあとはOverridesして保存してください)
NestedPrefabは通常のPrefabと同様にインスタンス化できます
NestedPrefabの使い所
ネストは参照関係なので、ネストしたものをあとで変更することができます。
例としてCubeとCylinderの上にそれぞれ赤いSphereをネストしているパターンで考えてみます。
開発途中で赤いSphereにスケールをかけたくなった場合、
NestedPrefabで作っていない場合は、CubeとCylinderの両方に変更が必要ですが、
NestedPrefabで作っている場合は、Sphereのみを変更すればCubeとCylinderにも変更が反映されます。
(ShpereをダブルクリックしプレハブモードでXスケールをかけています)
PrefabVariant
公式ドキュメントでは下記のように説明しています。
プレハブバリアントは、一揃いの事前定義されたプレハブのバリエーションを使用したい場合に便利です。
プレハブバリアントは、基本と呼ばれる別のプレハブのプロパティを継承します。プレハブバリアントに行われたオーバーライドは、基本プレハブの値よりも優先されます。プレハブバリアントは、モデルプレハブやその他のプレハブバリアントなど、他のどんなプレハブでも基本として持つことができます。
少し説明が難しいのですが、Prefabにバリエーションを持たせるための仕組みです。
ベースPrefab1に一部変更を加えてPrefabVariantを作ることで、
ベースPrefabを継承したPrefabVariantを作成することができます。
PrefabVariantの使い所
小さいCubeが3つ合わさったCubesというPrefabを例に考えてみます。
(今回の例だとベースPrefabはCubesになります)
Cubesのバリエーションとして、
- Blueを小さくしたCubesA
- Yellowを追加したCubesB
- Red, Green, Blueをそれぞれ回転させたCubesC
の3つをPrefabVariantで作成してみます。
▼Blueを小さくしたCubesA
▼Yellowを追加したCubesB
▼Red, Green, Blueをそれぞれ回転させたCubesC
ここでもし急にRedを削除したくなった場合、
バリエーションをすべてPrefabVariantで作っていれば、
ベースPrefab(Cubes)のRedを削除するだけで、それを派生元とするPrefabVariantにすべて変更が反映されます。
Prefabを用いたFBX管理
Unity上ではFBXはモデルプレハブと云いPrefabのように扱います。
しかしモデルプレハブは編集することできないためコンポーネント等を付けたりすることができません。
編集できるようにするにはPrefab化する必要があります。
なおかつモデルプレハブの参照を生かしたままPrefab化しないと、モデルプレハブ(FBX)を更新した際にPrefab内のFBXデータが更新されません。
モデルプレハブ(FBX)を更新するたびに、
- Prefabの作り直し
- コンポーネントの付け直し
を行うのはワークフロー上の大きなロスとなるため、できれば避けたいです。
というわけで、モデルプレハブの参照を残したままPrefab化する方法があります。大きく分けて下記の2つです。
- NestedPrefab
- PrefabVariant
モデルプレハブをNestedPrefabでPrefab化
空のゲームオブジェクトを親にしてPrefab化するとPrefab化できます。
Prefabにモデルプレハブがネストされているということですね。
注意事項として、空のゲームオブジェクトを介さずにモデルプレハブを直接Prefab化してしまうと、モデルプレハブがアンパックされてしまいます。
アンパックするとモデルプレハブ(FBX)の参照が切れてしまうので、FBXを更新した際にPrefab内のFBXデータが更新されません。
(なおアンパックはUnity2019以前でのみ起こります。Unity2020以降では強制的にPrefabVariantになるようです(後述しますがPrefabVariantなら直接Prefab化しても問題ありません))
モデルプレハブをPrefabVariantでPrefab化
モデルプレハブを直接Prefab化するとPrefabVariantになります。
この場合ベースPrefabはモデルプレハブということになります。
なおUnity2019以前の場合はPrefab作成時にダイアログが出るので「Prefab Variant」を選択してください。
NestedPrefabかPrefabVariantのどちらがいいのか
Unity公式はPrefabVariantを推奨しているようです。
モデルプレハブとFBXプレハブバリアントの操作
しかしNestedPrefabはHierarchyでモデルプレハブ(FBX)をアイコンで目視できるので便利です。
(PrefabVariantのベースPrefabはHierarchyでは確認がし辛い)
またPrefabVariantは仕様がやや複雑でArtistが操作するには煩雑な傾向があります。
1度決めると変更することが難しくなりますので、
プロジェクトに合わせて慎重に選択してみてください。
おわりに
PrefabはUnityワークフローにおいて非常に重要な機能ですので、拡張性やメンテナンスコストを考えて決めることが大切です。
また現在Prefabの機能自体にもアップデートが入り続けているので、今後のアップデート情報にもアンテナを張っておくことをおすすめします!
ではまた!よいUnityライフを!
脚注
- Unity公式の日本語訳は基本プレハブとなっていますが、本記事では便宜上ベースPrefabとさせてください↩