Unity2018.3のPrefabワークフローの実用について考える

こんにちは。新規ゲーム開発のプロジェクトでクライアントエンジニアをしている粟村です。

Unity2018.3からPrefabワークフローに大幅な変更が入りました。便利になった反面、複雑化して使いにくくなってる部分もあるので注意が必要です。運用していくうちにPrefabの依存関係が複雑になり、運用し難くならないよう考えていく必要があります。

本稿では、Prefabワークフローについてのおさらいと、プロジェクトでPrefabワークフローを導入する際の運用方針や、注意点について紹介します。

変更の詳細についてはこちらをご参照ください。
https://blogs.unity3d.com/jp/2018/12/13/introducing-unity-2018-3/

Prefabワークフローの主な変更点

Prefabモード

Prefabを編集する際にPrefabモードを使用できるようになりました。PrefabモードではHierarchyやSceneビューの表示が変わり、そのPrefab単体を編集するモードに入ります。
image
今まで階層構造などはHierarchyに置いてからでないと変更できなかったのが、Projectビューから選んで編集できるようになりました。

Prefabモードの追加に伴い、ProjectビューでPrefabを選んだ際にInspectorビューに表示されるのが’Open Prefab’と書かれたボタンのみになってしまったので、コンポーネントの値を変更することはできなくなっています。

Nested Prefab

Prefabの中にPrefabを持つことができるようになりました。AというPrefabとBというPrefabにCというPrefabを入れ、Cに変更を加えた場合、Aの中のCとBの中のCの両方に変更が反映されます。

Aの中のCにだけScaleZに変更を加えた状態

その変更をCのPrefabに反映させた状態

また、親のPrefabを開いて子のPrefabに対して変更を行った場合、親に対して変更を反映させるか子に対して変更を反映させるかを選ぶこともできます。

Prefab Variant

PrefabのVariantを作ることができるようになりました。Variantは元のPrefabの設定を引き継ぎつつ、Variantで独自の変更を上書きすることもできます。プログラムで言うところの継承にあたる機能で、同じような機能を持ったPrefabを複数作ろうと思った際などに使うことができます。


元のPrefab

それを元に作られSphareのオブジェクトが追加されたPrefabVariant

Prefabワークフローの変更によるプロジェクト内の運用方針の変更

3DモデルのFBXはPrefab Variantに変換

これまで3DモデルのFBXはPrefabに変換して使用していましたが、Unity2018.3からはPrefab Variantに変換することもできるようになりました。PrefabではなくPrefab Variantに変換することのメリットとして、元のFBXで階層構造を変えた際にPrefab Variantの方にもその変更が引き継がれるというものが上げられます。

私のプロジェクトでは現在モデルの検証を行っていて、頻繁に構造が変わるので、Prefabだったときにはその度にPrefabを一旦削除して新しく生成し直すということをしていました。新しく生成し直してしまうと今までやっていたコンポーネントの設定などもリセットされてしまいます。Prefab Variantを用いることでその手間が改善されました。

デメリットとして、今までのPrefabを破棄してPrefab Variantとして作り直さなければいけない点が上げられます。モデルの量が多すぎてとても全部はPrefab Variantに置き換えられないということもあるかと思いますので、プロジェクトの状況に応じて判断が必要になります。今後作られるプロジェクトに関しては、Prefab Variantにする方向が良いのではないでしょうか。

Prefab Variantを使う際には細心の注意を払う

上でも記述したようにPrefab Variantを使用すると継承のようなことが実現できます。ですが、今現在、継承元のPrefabを変更した際にどのVariantに影響があるかを判断する術が無く、複数人数で開発する際などには注意が必要です。知らない間にVariantが増えていて、元のPrefabをいじった際に予期せぬ不具合が生じていた、などのようなことが起こりかねません。

一旦の対策として、Variantは全て元のPrefabと同じディレクトリに配置し、影響範囲がわかりやすくなるようにしました。今後、PrefabからそのPrefabを元に作られたPrefab Variantの一覧を表示するスクリプトを作るなどして根本的な対策をしようと考えています。

Prefabモード時に使用するシーン

Prefabモード時のSceneビューにどのシーン上の表示にするかを指定することができます。
指定の仕方についてはこちらをご参照ください。

UI用のシーンや3Dのライトを設置したシーンなどを用意しておいて、その時々で使い分けることで確認や調整をしやすくしました。

PrefabモードのAuto Saveはオフにする

デフォルトではAuto Saveがオンになっていて、Prefabモードで操作を行った後Prefabモードを抜けると勝手に変更が反映されてしまいます。プロジェクトの状況によってはこの動きで問題ないと思いますが、Variantを使う場合や複数の人がPrefabに触る場合などではオフしておくと意図せず変更してしまうなどの事故を未然に防ぐことができます。

Prefabワークフローの変更によりハマったこと

スクリプトでPrefabを生成しようとした際にPrefab Variantが生成されてしまう

結果から言うと、今までprefabのインスタンス生成時に書いていた処理が以下のようになっていまして、

PrefabUtility.InstantiatePrefab(fbx) as GameObject;

以下のように書き換えることでPrefabの生成ができました。

GameObject.Instantiate(fbx);

今まではどちらもPrefabのインスタンスを生成する処理だったのですが、Unity2018.3からはそれぞれでどちらが生成されるかが変わったので、前者の記述になっていてPrefabを生成したい場合などには書き換えが必要です。

Prefab内のオブジェクトの削除はPrefabモードでしかできない

インスタンス化されたPrefabに対して構造の変更ができなくなったようで、インスタンス化されたPrefab内のオブジェクトを削除しようとすると以下のようなポップアップが表示され、削除できません。

削除を行いたい場合はPrefabモードにするしかないようです。

実行中に生成したPrefabのインスタンスに対して変更を行った際のApply方法が変わった

今までは実行中に生成したPrefabのインスタンスに対して行った変更をApplyしようとした場合に、Hierarchy上でインスタンス化されたPrefabのオブジェクトを選び、Inspectorの右上にあるApplyボタンを押していたかと思います。Unity2018.3ではそれができなくなっていて、変更した箇所に対してApply to Prefabを行うしかありません。色々なコンポーネントに対して変更を行った場合、その全てに対してApply to Prefabを行う必要があります。

最後に

PrefabモードやPrefab Variant、Nested Prefabなど、便利な機能が入ったPrefabワークフローは拡張性が増し、運用の可能性が広がったと言えます。操作方法が変わり、使いにくくなってしまった部分もあるので、必要な場合にはエディタ拡張などして対応しましょう。また、新しいバージョンで対応が入る可能性もあるので、リリースノートの確認をしていきましょう。