【Unity】Unity2018.3以降でFBXをPrefab化して正しく取り扱う

Unity2018.3から新しいPrefabワークフローが導入されました。
それに伴いFBXをPrefab化して取り扱う方法が変わったのでまとめます。

Unity2018.3.4

はじめに

新PrefabワークフローにおけるPrefabの基本的な知識は下記にまとめています。
本記事はこの内容を前提としていますのでご了承ください。

light11.hatenadiary.com

FBXはPrefab Variantにして使う

Unity2018.3からは、FBXをPrefabと捉えて、それを元にしたPrefab Variantを作れます。
インスタンスをオーバーライドしたり、逆にFBX側を更新することなどを考えるとVariantにしておくのが便利そうです。

Variantを作るにはFBXを右クリック > Create > Prefab Variantを選択します。

f:id:halya_11:20190118124018p:plain

また、FBXをHierarchyにドラッグしてインスタンス化してから
インスタンスをProjectビューにドラッグしてPrefab Variantを選択してもOKです。

f:id:halya_11:20190118125030p:plain

スクリプトからも作れます。

GameObject fbx;
string savePath;
var instance = PrefabUtility.InstantiatePrefab(fbx);
PrefabUtility.SaveAsPrefabAsset(instance, savePath);
GameObject.DestroyImmediate(instance);

Variantでフィールドなどをオーバーライドする

通常のPrefabやPrefab Variantのように、FBXから作ったPrefab Variantも
フィールドやコンポーネント、GameObjectをオーバーライドできます。

フィールドはこんな感じです。

f:id:halya_11:20190118155051p:plain

コンポーネントの追加はこんな感じです。

f:id:halya_11:20190118155403p:plain

GameObjectの追加はこんな感じです。

f:id:halya_11:20190118155430p:plain

ちなみに当然ではありますが、元のFBXへのApplyはできません。

f:id:halya_11:20190118155903p:plain

そしてこのようにオーバーライドしたものは元のPrefabを更新しても基本的には保持されます。
いちいちコンポーネントを貼りなおしたりしなくていいので非常に便利になりました。

「基本的には」と書いたのは次節から説明するように保持されないケースもあるためです。

FBXのGameObjectをリネームしてみる

ここからはFBXを更新(上書き)した時にPrefab Variantに変更が反映されるかを見ていきます。

まずはリネームです。下図は現状の階層構造を示しています。

f:id:halya_11:20190118160226p:plain

この中のSphereをSphare_RenamedにリネームしてFBXを更新します。

f:id:halya_11:20190118160416p:plain

ちゃんとリネームされました。
ただしこの場合、リネームしたGameObjectのコンポーネントに対するオーバーライドは引き継がれないようです。

f:id:halya_11:20190118160621p:plain
Light ProbesとReflection Probesをオーバーライドしていましたが、消えました。

FBXの階層構造を変更してみる

次に階層構造を変更してみます。
前節の状態からSphare_RenamedとIcosphereを入れ替えます。

f:id:halya_11:20190118162424p:plain

ちゃんと入れ替わりました。
コンポーネントをオーバーライドした内容も引き継がれています。

ただし、オーバーライドで追加したGameObject、CubeがIcoSphereの移動に紐づいて移動しました。

  • 名前を変えなければ同一のGameObjectとしてみなされる(オーバーライドの内容は引き継がれる)
  • オーバーライドで追加したGameObjectは親に紐づく

ということが言えそうです。

追加したGameObjectの親をリネームしてみる

ではこの状態でIcosphereをリネームするとCubeはどうなるのでしょうか?
IcosphereをIcosphere_Renamedにリネームします。

f:id:halya_11:20190118162822p:plain

オーバーライドで追加したGameObjectであるCubeが消えてしまいました。

  • リネームすると別のGameObjectとしてみなされる
  • オーバーライドされたコンポーネントは引き継がれない
  • 子として追加したGameObjectは引き継がれない

ということが言えそうです。

まとめ

このように、Unity2018.3以降のFBXはPrefab Variantにして使うのがよさそうです。

また、VariantにすることでFBXの更新はしやすくなるものの、
GameObjectの同一性を名前で担保しているためリネームには注意が必要そうです。

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com