【Unity】プレハブ:ゲームオブジェクトを複製して変更を連動できる

更新日:2023/06/01

ゲームのフィールドにある障害物などで、同じ形状のものが大量に設置されていたりします。
設置した後に形状を変更したいときに、一つ一つ変更していくのは非常に面倒ですね。

UnityのPrefab(プレハブ)という機能を使うと、一つのオブジェクトの変更を他のオブジェクトに反映できます。
とても便利な機能なので、紹介します。

※画像多めなので、表示まで時間がかかるかもしれません。

 

Prefabの作成方法

Prefabを作成するときは、まずは元となるゲームオブジェクトを用意します。
今回は、標準で用意されているSphere( メニュー:GameObject → 3D Object → Sphere )を使用します。

Sphere

次にHierarchyウインドウから、Projectウインドウにゲームオブジェクトをドラッグ・アンド・ドロップします。

今回は、フォルダを作成せずに既存のAssetsフォルダを使用しています。
必要に応じてPrefab用のフォルダを作成しておきましょう。

ドラッグ・アンド・ドロップすると、名前に .prefab が付いたオブジェクトが生成されます。
これが、Prefabです。

元となったゲームオブジェクトは、Hierarchyウインドウから削除しても大丈夫です。

 

Prefabからゲームオブジェクト生成

作成したPrefabを、Hierarchyウインドウにドラッグ・アンド・ドロップします。
すると、複製されたゲームオブジェクト(インスタンス)が生成されます。

Hierarchyウインドウにドラッグ・アンド・ドロップ

元となったゲームオブジェクトも、Prefabから生成したオブジェクトと同じ扱いになります。

インスタンスは、InspectorウインドウにPrefab用のボタンが表示されます。
これを見ることで、Prefabかどうかの確認ができます。

 

ゲームオブジェクトを一括修正

次はPrefabから生成したゲームオブジェクトを一括で修正します。

初期状態のSphereは白色です。
赤色に変更してみます。

Hierarchyウインドウのゲームオブジェクトの横にある > をクリックします。
するとHierarchyウインドウの表示が変わり、Prefabモードに移行します。

Prefabモードに移行

または、InspectorウインドウのOpenボタンを押すと、Prefabモードに移行することができます。

InspectorウインドウのOpenボタンでPrefabモードに移行

3Dオブジェクトの色変更はMaterialでおこないます。

詳しくは、次のページを読んでみてください。
【Unity】CubeやSphereなどの3Dオブジェクトの色を変更する方法

Materialを作成したら、PrefabモードのInspectorウインドウにドラッグ・アンド・ドロップします。

MaterialをPrefabモードのInspectorウインドウにドラッグ・アンド・ドロップ

最後に Hierarchyウインドウの < をクリックして、Prefabモードを終了します。

Prefabモードを終了

これで、Prefabから生成されたオブジェクトの色が一括で変更されます。

 

インスタンスを個別に変更

インスタンスの設定を個別に変更することもできます。
個別に設定した値は、それぞれのオブジェクトに反映されます。

例えば、それぞれの Scale を変更します。

それぞれのScaleを変更

すると、3つのSphereが異なる形状で表示されます。

 

インスタンスの変更をPrefabに適用

インスタンスで変更した設定を、Prefabに適用することもできます。
Prefabの設定を変更していたつもりがインスタンスを変更していた、というときに便利な機能です。

インスタンスのInspectorウインドウにある Overridesボタンを押します。
表示されたパネルの Apply All ボタンを押すと、Prefabに適用されます。

もう一方のボタンの Revert All は、全て元に戻すという意味です。
押すと変更前に戻ります。

Prefabに適用される内容は、Apply All ボタンの上にあるボックスで確認できます。
上の図では、Transform が対象になっています。

Transform をクリックすると、変更前と変更後の内容が表示されます。

変更前と変更後の内容

左側(Prefab Source)が Prefab の設定値です。
右側は、インスタンスの設定値です。

ここでは全ての項目が表示されていますが、変更されるのは青い目印があるものだけです。
Positionが変更されて全て同じ位置に移動する、ということはありません。

 

Prefabを階層化する

次はPrefabを階層化してみます。

現状は赤いMaterialを適用したPrefabから、3つのインスタンスが生成されています。

階層する前

インスタンスの一つに青いマテリアルを適用してPrefab化した後に、インスタンスを生成して次の図のような階層構造を作成します。

階層化のイメージ

これで青Prefabを変更すると青インスタンスが一括変更され、赤Prefabを変更すると赤と青インスタンスの両方が一括変更されるようになります。

手順

実際に作業してみます。

  1. 赤インスタンスの一つに青いマテリアルを適用します。
    分かりやすように、名前を変更しておきます。
    次に、変更したインスタンスを Hierarchyウインドウから Projectウインドウへドラッグ・アンド・ドロップします。

    変更したインスタンスを Hierarchyウインドウから Projectウインドウへドラッグ・アンド・ドロップ

  2. 次の画面が表示されます。

    create prefab or variant

    would you like to create a new original Prefab or a variant from the existing Prefab 'SphereBlue'?
    新しいオリジナルのプレハブを作成しますか、それとも既存のプレハブ「SphereBlue」からのバリアントを作成しますか?

    オリジナルのプレハブは、元のPrefabと関連性が無いPrefabです。

    バリアントは関連性を保ったPrefabです。
    Prefabから派生したPrefabという認識の方がわかりやすい方もいるかもしれませんね。

    ということで、「Prefab Variant」を押します。

  3. 作成されたPrefabを、Hierarchyウインドウにドラッグ・アンド・ドロップします。

    Prefab階層化後のUnityエディタ

    Prefab Variantは、名前にVariantが追加されます。
    またアイコンの形状が少し異なります。
    分かりやすいですね。

確認してみる

作成した Prefabに変更を加えてみます。

まずはベースとなった赤PrefabをPrefabモードで開き、Scaleを x:5 y:5 z:5 に変更してみます。

x:5 y:5 z:5

すると、赤と青の両方のインスタンスの大きさが変化しました。

ベースPrefabを変更

次に青PrefabをPrefabモードで開き、Scaleを x:2 y:5 z:5 変更してみます。

x:2 y:5 z:5

すると青の大きさのみが変化しました。

Prefab Variantを変更

想定通りですね。

次にベースとなった赤PrefabをPrefabモードで開き、Scaleを x:2 y:2 z:2 に変更してみます。

x:2 y:2 z:2

赤のみ変化しました。

ベースPrefabを変更2回目

青も変化を期待したのですが、変化しませんでした。
これは、インスタンスを個別に変更と同じように、個別の設定が青いPrefabに適用されているからです。

Prefab Variantからベースへの反映

Prefab VariantをPrefabモードで開くと、Overridesボタンが表示されます。
ベースとなったPrefabには存在しないので、これはPrefab Variantの特徴ですね。

Overridesボタンを押すと、次のようなパネルが表示されます。

Overridesパネル

Apply Allボタンが、Apply All to Baseボタン に変更されていますね。

Apply All to Baseボタンを押すと、ベースのPrefabを変更します。
変更内容に Mesh Renderがありますが、これはマテリアルが含まれています。
そのため、赤と青の全てのインスタンスが青くなります。
十分な注意が必要なボタンです。

またRevert Allは、ベースの設定をPrefab Variantに適用します。
その結果、青マテリアルが赤に変更されます。
これも、十分な注意が必要なボタンです。

 

複数のPrefabをまとめる

次は複数のPrefabを一つにまとめてみます。
まとめた状態は、Unityではネストと呼んでいるようです。

前準備として複数のゲームオブジェクトを配置し、Prefab化しておきます。

前準備として複数のゲームオブジェクトを配置し、Prefab化

次にProjectウインドウで、Prefabを作成します。
コンテキストメニュー:Create → Prfabで作成できます。

コンテキストメニュー:Create → Prfab

作成したPrefabを、Hierarchyウインドウにドロップします。
その後、Prefabモードを開きます。

Prefabモードを開いたら、部品となるPrefabをHierarchyウインドウにドロップします。

Prefabモードを開いたら、部品となるPrefabをHierarchyウインドウにドロップ

これで、複数のPrefabを一つにまとめることができました。

なお、今回は空のPrefabを作成しましたが、実体のあるゲームオブジェクトのPrefab内に、他のPrefabをネストすることもできます。

実体のあるゲームオブジェクトのPrefab内に、他のPrefabをネスト

さらに、ゲームオブジェクト内にPrefabを設置することもできます。

ゲームオブジェクト内にPrefabを設置

状況に応じて使い分ける必要がありますが、まずはいろいろ操作してPrefabに慣れましょう。

 

インスタンスからPrefabを削除する

PrefabのインスタンスからPrefabを切り離して、独立したゲームオブジェクトに変更してみます。

Hierarchyウインドウで切り離したいPrefab上でコンテキストメニューを表示します。
※Prefabモードではありません。
Prefab → Unpackを選択します。

Prefab → Unpack

これで、インスタンスからPrefabが削除されます。

なお、ネストされたPrefabはそのまま維持されます。

更新日:2023/06/01

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。