今回は、Unity のプレハブから作成できるプレハブバリアント (Prefab Variant) について紹介します。

※ Unity のバージョンは 2021.3.25f1 Personal <DX11> です。
プレハブバリアントとは
プレハブバリアントは、プレハブを継承したプレハブです。
プレハブインスタンスをシーンに配置した後で、ゲームオブジェクト単位で差分をつけることもできますが、それぞれの差分を管理するのは面倒です。
プレハブバリアントを使えば、継承元と少し異なる差分を持つプレハブとプレハブインスタンスを効率よく編集・管理できます。
プレハブバリアントは、一揃いの事前定義されたプレハブのバリエーションを使用したい場合に便利です。
(略)
プレハブバリアントは、基本と呼ばれる別のプレハブのプロパティを継承します。プレハブバリアントに行われたオーバーライドは、基本プレハブの値よりも優先されます。プレハブバリアントは、モデルプレハブやその他のプレハブバリアントなど、他のどんなプレハブでも基本に持つことができます。
プレハブバリアント – Unity マニュアル 一部省略
スーパーマリオの緑ノコノコと赤ノコノコで例えてみる
私も好きなゲーム「スーパーマリオブラザーズ」には、敵キャラとして緑ノコノコと赤ノコノコが出てきます。
緑ノコノコと赤ノコノコの違いは、移動パターンだけです。
緑ノコノコは端に行っても進み続けますが、赤ノコノコは端に行くとUターンします。

甲羅が赤のものと緑のものの2種類が登場した。赤は気が弱くそわそわしているという設定で進路端で引き返すが、緑は勇猛果敢という設定で進路に穴や段差があってもそのまま直進(落下)する違いがある。また、踏むと甲羅の中に引っ込み、しばらくすると復活する。甲羅の状態に触れると敵味方問わず突進する。飛ばして接触させることでその敵を倒すことができ、その甲羅の後ろについていくことで連続して敵を倒し、高得点を得ることも可能となった。派生種のパタパタもこの作品で登場。
ノコノコ – Wikipedia
例えば、共通のノコノコというプレハブを作成して、緑ノコノコのプレハブバリアントと、赤ノコノコのプレハブバリアントをノコノコのプレハブから作成します。
そして、緑と赤のプレハブバリアントは移動パターンの設定だけをそれぞれ変更します。
そして、それぞれをシーンに複数配置します。

たくさん配置したあと緑・赤ノコノコの速度を変えたくなった場合、プレハブの Overrides を使えば、そのプレハブから作成されたプレハブインスタンスたちの速度は一括変更できます。
しかも、ノコノコから派生した緑ノコノコと赤ノコノコの特徴・差分である移動パターンの設定だけは上書きされません。
また、シーンに配置してある赤ノコノコだけを選択したい場合は、赤ノコノコのプレハブバリアントの右クリックメニューからシーンの赤ノコノコだけをフィルタリングすることもでき、差分のあるゲームオブジェクトを管理する際に便利です。
プレハブバリアントのサンプルとなるゲームオブジェクト
Unity でプレハブバリアントの説明に用いるゲームオブジェクトは、前回の記事で作成した反復移動する 「 PingPongCube (ピンポンキューブ) 」です。
追加したスクリプトのコンポーネントでは
- HP (今回は使いません)
- 移動方向
- 向きを反転する時間
のプロパティを設定できます。
前回の記事:Unity 複製とプレハブインスタンス の違い | Compota-Soft-Press

プレハブバリアントの作成
Project ウィンドウでプレハブアセットを右クリックして、メニュー「 Create 」→「 Prefab Variant 」で、選択したプレハブのプレハブバリアントを作成します。

プレハブで値の一括変更をした際のプレハブバリアントの結果
前述した PingPongCube でプレハブを作成して、そのプレハブからプレハブバリアントを作成して、それぞれのプレハブインスタンスを2個ずつシーンに配置しました。
プレハブインスタンスのうちの1個(下側のキューブ)は反復のインターバルを 1 秒から 0.5 秒に変えて、後で Overrides で一括変更した際にプレハブインスタンスの差分も変わらないことを確認するために使います。

プレハブバリアントの方は、斜め移動ではなく、上下に移動するように Speed プロパティの値を (1, 1, 0) から (0, 1, 0) へ変更します。

Overrides することで、もう一つシーンに配置している PingPongCube プレハブバリアントのインスタンス(ゲームオブジェクト)も、 Project の PingPongCube プレハブバリアントアセットも一括で変更されました。
これで、PingPong プレハブのインスタンスが斜め移動するのに対して、派生の PingPong プレハブバリアントのインスタンスは上下に移動する違いを設定できました。
.gif)
ここで、全体の反復のインターバルを 0.2 秒に変更してより速く反復するように、プレハブインスタンスの Overrides で一括変更します。

結果として、プレハブインスタンス 1 個とプレハブバリアントのインスタンス 2 個の反復のインターバルが 0.2 秒に一括変更されました。
プレハブバリアントはベースのプレハブとの差分を上書きしないので、上下に移動する特徴は変わりません。
また、インターバルを 0.5 秒に変えておいたプレハブインスタンスも差分が保持されています。
差分を作るだけならば、プレハブインスタンスの段階で値を変えることでも実現できました。

しかし、シーンの中にさまざまな差分を持つプレハブインスタンスがたくさんあった場合、それらを管理するのは困難でしょう。
プレハブバリアントで差分を作れば、どのような差分をもつゲームオブジェクトがあるのかを Project ウィンドウでプレハブ単位で確認できます。
また、Project ウィンドウのプレハブ・プレハブバリアントのアセットを右クリックして、メニューから「 Find References in Scene」を選択することで、シーン内のどこにそのプレハブのインスタンスが配置されているかをフィルタリングして確認できます。

まとめ
今回は、Unity のプレハブから作成できるプレハブバリアント (Prefab Variant) について紹介しました。
プレハブバリアントを使えば、差分をアセット単位で管理して、シーンに配置されたゲームオブジェクトの中から指定したプレハブインスタンスだけを表示するなど、差分をつけたプレハブインスタンスを管理する際に便利なことがわかりました。
参照サイト Thank You!
- Unity のリアルタイム開発プラットフォーム | 3D/2D、VR/AR のエンジン
- プレハブバリアント – Unity マニュアル
- スーパーマリオブラザーズ – Wikipedia
- ノコノコ – Wikipedia
- パーティクルシステム – Unity マニュアル
- 【Unity】Prefab/Nested Prefabs/Prefab Variant の違いについてまとめる #Unity – Qiita
記事一覧 → Compota-Soft-Press
コメント