プレハブに変化を加えられるプレハブバリアントを使ってみました。
プレハブバリアントを作る
プレハブバリアントを作るには2つの方法があります。一つは、既存のプレハブを右クリックして、Create > Prefab Variant を選択する方法です。
もう一つは、ヒエラルキーウィンドウにあるプレハブのインスタンスをProjectウィンドウにドラッグアンドドロップする方法です。
ドロップするとダイアログが出るので、「Prefab Variant」をクリックします。
これでプレハブバリアントが作られます。プレハブバリアントのアイコンは、プレハブのものと少し違います。
オーバーライドする
プレハブやプレハブバリアントに子ゲームオブジェクトを付けたり、コンポーネントを着脱、プロパティの値の変更などの操作をするとオーバーライドが作られます。
試しに、ヒエラルキーウィンドウにあるプレハブバリアントの、BoxコライダーのIs Triggerのチェックを入れてみました。
すると、「Is Trigger」の文字が太字になって、左枠に青い線が現れました。これでオーバーライドを識別できます。
これはシーンにあるインスタンスへ加えられた変更であり、プレハブバリアントではまだチェックが切れています。
このオーバーライドを適用するには、プロパティを右クリックします。すると、適用のための項目が2つあり、元に戻すための「Revert」もあります。
「Apply to Prefab ‘Cube’」をクリックすると、インスタンスのプロパティの青い線が消えて、オーバーライドが適用されたことがわかります。
プレハブバリアントでもチェックが入っています。
また、元のプレハブでもチェックが入りました。プレハブとプレハブバリアントで値が同じです。
もう片方の「Apply as Override in Prefab ‘Cube Variant’」を選択しても、インスタンスの青い線が消えて値が適用されます。また、プレハブバリアントでもチェックが入りますが、その横にオーバーライドの印があらわれます。
そして、元のプレハブではチェックが入っていません。
プレハブバリアントのオーバーライド
このプレハブバリアントのプロパティを右クリックすると、適用先は元のプレハブだけになっています。
インスペクタの右上の「Overrides」をクリックして、「Apply All to Base」選択しても、オーバーライドを適用できます。
このドロップダウンでは、個々のオーバーライドと元の値を比較して個別に適用できます。
プレハブバリアントのオーバーライドを適用すると、プレハブバリアントのオーバーライドの印が消えて、元のプレハブも同じ値になります。
なので、プレハブバリアントと元のプレハブで違いを保ちたいときは、プレハブバリアントのオーバーライドを適用しないままにします。
プレハブバリアントをインスタンス化
インスタンスのオーバーライドをプレハブバリアントのオーバーライドとして適用することで、インスタンス化によって、そのオーバーライドを再利用できます。
上のプレハブバリアントのオーバーライドを適用せずに、プレハブとプレハブバリアントをインスタンス化してみます。
using UnityEngine;
public class PrefabTest : MonoBehaviour
{
[SerializeField] GameObject cube;
[SerializeField] GameObject cube_variant;
// Start is called before the first frame update
void Start()
{
Instantiate(cube, new Vector3(1f, 0.5f, 0f), Quaternion.identity);
Instantiate(cube_variant, new Vector3(-1f, 0.5f, 0f), Quaternion.identity);
}
}
すると、作られた2つのインスタンスで値が違います。