Unity2018.3から新しいPrefabワークフローが導入されました。
それに伴いFBXをPrefab化して取り扱う方法が変わったのでまとめます。
- はじめに
- FBXはPrefab Variantにして使う
- Variantでフィールドなどをオーバーライドする
- FBXのGameObjectをリネームしてみる
- FBXの階層構造を変更してみる
- 追加したGameObjectの親をリネームしてみる
- まとめ
- 関連
Unity2018.3.4
はじめに
新PrefabワークフローにおけるPrefabの基本的な知識は下記にまとめています。
本記事はこの内容を前提としていますのでご了承ください。
FBXはPrefab Variantにして使う
Unity2018.3からは、FBXをPrefabと捉えて、それを元にしたPrefab Variantを作れます。
インスタンスをオーバーライドしたり、逆にFBX側を更新することなどを考えるとVariantにしておくのが便利そうです。
Variantを作るにはFBXを右クリック > Create > Prefab Variantを選択します。
また、FBXをHierarchyにドラッグしてインスタンス化してから
インスタンスをProjectビューにドラッグしてPrefab Variantを選択してもOKです。
スクリプトからも作れます。
GameObject fbx;
string savePath;
var instance = PrefabUtility.InstantiatePrefab(fbx);
PrefabUtility.SaveAsPrefabAsset(instance, savePath);
GameObject.DestroyImmediate(instance);
Variantでフィールドなどをオーバーライドする
通常のPrefabやPrefab Variantのように、FBXから作ったPrefab Variantも
フィールドやコンポーネント、GameObjectをオーバーライドできます。
フィールドはこんな感じです。
コンポーネントの追加はこんな感じです。
GameObjectの追加はこんな感じです。
ちなみに当然ではありますが、元のFBXへのApplyはできません。
そしてこのようにオーバーライドしたものは元のPrefabを更新しても基本的には保持されます。
いちいちコンポーネントを貼りなおしたりしなくていいので非常に便利になりました。
「基本的には」と書いたのは次節から説明するように保持されないケースもあるためです。
FBXのGameObjectをリネームしてみる
ここからはFBXを更新(上書き)した時にPrefab Variantに変更が反映されるかを見ていきます。
まずはリネームです。下図は現状の階層構造を示しています。
この中のSphereをSphare_RenamedにリネームしてFBXを更新します。
ちゃんとリネームされました。
ただしこの場合、リネームしたGameObjectのコンポーネントに対するオーバーライドは引き継がれないようです。
Light ProbesとReflection Probesをオーバーライドしていましたが、消えました。
FBXの階層構造を変更してみる
次に階層構造を変更してみます。
前節の状態からSphare_RenamedとIcosphereを入れ替えます。
ちゃんと入れ替わりました。
コンポーネントをオーバーライドした内容も引き継がれています。
ただし、オーバーライドで追加したGameObject、CubeがIcoSphereの移動に紐づいて移動しました。
- 名前を変えなければ同一のGameObjectとしてみなされる(オーバーライドの内容は引き継がれる)
- オーバーライドで追加したGameObjectは親に紐づく
ということが言えそうです。
追加したGameObjectの親をリネームしてみる
ではこの状態でIcosphereをリネームするとCubeはどうなるのでしょうか?
IcosphereをIcosphere_Renamedにリネームします。
オーバーライドで追加したGameObjectであるCubeが消えてしまいました。
- リネームすると別のGameObjectとしてみなされる
- オーバーライドされたコンポーネントは引き継がれない
- 子として追加したGameObjectは引き継がれない
ということが言えそうです。
まとめ
このように、Unity2018.3以降のFBXはPrefab Variantにして使うのがよさそうです。
また、VariantにすることでFBXの更新はしやすくなるものの、
GameObjectの同一性を名前で担保しているためリネームには注意が必要そうです。