ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】Unity2018.3からのPrefabワークフロー

Unity2018.3のβ版でPrefabのワークフローが色々と変更されました。今回はその中の Prefab Mode, Nested Prefab, Prefab Variant についてまとめてみました。

Prefab Mode

2018.3より前のバージョンでPrefabを編集する時は以下の流れが一般的でした。

  1. ProjectビューのPrefabをHierarchyビューにドラッグ&ドロップ
  2. Inspector/Sceneビュー上でPrefabを編集
  3. InspectorビューからApplyボタンを押して編集内容を保存
  4. Hierarchyビュー上からPrefabを削除

この流れだと以下の問題が起こりやすかったです。

・Applyボタンを押し忘れてPrefabの保存に失敗
・編集したPrefabの削除を忘れてシーンに残る

Prefab Mode はこういった問題を解決するためのものらしいです。
(Unityの公式ブログに書いてました)

Prefab Mode への移行方法は以下の3パターンがあります。
・Projectビューで対象Prefabをダブルクリック
・ProjectビューでPrefabを選択してInspectorビューの「Open Prefab」をクリック
・Hierarchyビュー上の対象Prefabの右側にある「>」をクリック

上記いずれかを実行すると以下のPrefab編集用の画面に移行します。

f:id:aki517:20181008085606p:plain

保存方法

Sceneビュー上部右端の「Auto Save」のチェックが有効なら編集内容は自動で保存されます。以前のように編集後に「Apply」ボタンを押す手間が無くなりました。

f:id:aki517:20181008083723p:plain

ただし、サイズの大きいPrefabを自動保存が有効な状態で編集すると動作が遅くなる場合があるので、その時は「Auto Save」のチェックを外します。手動で保存する場合は「Auto Save」の隣にある「Save」ボタンを押すか、または 「Ctrl + S」(Mac : Cmd + S) 保存できます。

f:id:aki517:20181008090406p:plain

環境設定

Prefab Modeでは 専用Sceneファイルを設定できます。 Edit > Project Settings > Editor > Prefab Editing Environments で設定できます。

f:id:aki517:20181008093715p:plain

例えば UI Environment にヘッダーとフッターのUIとCanvasを配置した Sceneファイルを設定しておけば、UI関連のPrefabを編集する際にそのSceneが読み込まれた状態で編集できます。これを上手く使えば、UIの編集をする際にヘッダーとフッターUIのPrefabも Hierarchyビューにドラッグ&ドロップして...という手間が省けますね

f:id:aki517:20181008121807g:plain

以下のようにスクリプトからも設定できます。

EditorSettings.prefabRegularEnvironment = customScene;
EditorSettings.prefabUIEnvironment = customSceneUI;

2019/6/23 追記
UI Environment に Scene を設定しなかった場合、PrefabMode時に Canvasコンポーネントだけが接続されたオブジェクトがルートに配置されるため、実際のゲームSceneでCanvas Scaler を接続して解像度に応じたUIオブジェクトのスケール処理を行なっている場合、PrefabModeで編集した結果とゲーム画面とでレイアウトが一致しない現象が発生することがあります。この問題は ゲームSceneと同じ Canvas Scaler を設定した Scene を UI Environment に設定すれば回避できます。
f:id:aki517:20190623012859p:plain

終了方法

Prefab Mode を終了するには Hierarchyビューの「<」をクリックするか、Sceneビュー上部の「Scenes」をクリックします。
f:id:aki517:20181008092025p:plain

Nested Prefab

Prefabの中にPrefabを設定できる仕組みです。これの便利なところは例えば下図のようにある Prefab に Particle System が設定された別Prefab が3個配置されている状態から、Prefab Mode で Particle System のカラーを1つ編集するだけで他の2つにもその設定が適用されます。

f:id:aki517:20181008202446g:plain

今までのように個別で設定を行いたい場合は対象Prefabを右クリックして「Unpack Prefab」か「Unpack Prefab Completely」を選択します。2つの違いは選択したPrefabに対してのみ適用されるか、その子階層にあるPrefabにも適用されるかです。

ちなみにNestは「入れ子」という意味です ^_^

Prefab Variant

あるPrefabをベースにして異なるパラメータや、追加のコンポーネントを設定したPrefabを作成したい場合に使います。

作成方法はベースとなるPrefabを右クリック > Create > Prefab Variant で作成できます。 f:id:aki517:20181008203353p:plain

下図のようにPrefabアイコンに矢印が描かれたPrefabが作成されます。今回はパーティクルサイズが異なる Prefab を作ってみるので「PrefabParticle_Large」としておきます。

f:id:aki517:20181008204111p:plain

PrefabParticle_Large の Prefab Mode に移行して Start Size を変更します。ベースと異なる部分があるとInspectorの左端に青いラインが表示されます。

f:id:aki517:20181008204514p:plain

保存方法

Variant Prefabの保存方法は通常Prefabと同様ですが、ベースのPrefabに設定値を適用したい場合はInspectorビューからOverrides > Apply All to Base をクリックするか
f:id:aki517:20181008210025p:plain

Overrides > 変更したコンポーネントを選択して 下図のようにベースとの変更差分を確認しながら 対象パラメータ上で右クリック > Apply to Prefab XXXXX で適用する方法があります。
f:id:aki517:20181008210022p:plain

所感

Prefab Modeでの編集はとても便利で今まで起こっていた操作ミスが減りそうです。Nested Prefab と Prefab Variant はきちんと仕様を把握しておかないと編集した内容が他のSceneやPrefabに影響を及ぼす可能性があるので注意が必要かなぁと思いました。

参考

Prefabs Manual - Google ドキュメント

Prefab Workflow - Unity