【Unity】プレハブ:ゲームオブジェクトを複製して変更を連動できる
更新日:2023/06/01
ゲームのフィールドにある障害物などで、同じ形状のものが大量に設置されていたりします。
設置した後に形状を変更したいときに、一つ一つ変更していくのは非常に面倒ですね。
UnityのPrefab(プレハブ)という機能を使うと、一つのオブジェクトの変更を他のオブジェクトに反映できます。
とても便利な機能なので、紹介します。
※画像多めなので、表示まで時間がかかるかもしれません。
Prefabの作成方法
Prefabを作成するときは、まずは元となるゲームオブジェクトを用意します。
今回は、標準で用意されているSphere( メニュー:GameObject → 3D Object → Sphere )を使用します。
次にHierarchyウインドウから、Projectウインドウにゲームオブジェクトをドラッグ・アンド・ドロップします。
今回は、フォルダを作成せずに既存のAssetsフォルダを使用しています。
必要に応じてPrefab用のフォルダを作成しておきましょう。
ドラッグ・アンド・ドロップすると、名前に .prefab が付いたオブジェクトが生成されます。
これが、Prefabです。
元となったゲームオブジェクトは、Hierarchyウインドウから削除しても大丈夫です。
Prefabからゲームオブジェクト生成
作成したPrefabを、Hierarchyウインドウにドラッグ・アンド・ドロップします。
すると、複製されたゲームオブジェクト(インスタンス)が生成されます。
元となったゲームオブジェクトも、Prefabから生成したオブジェクトと同じ扱いになります。
インスタンスは、InspectorウインドウにPrefab用のボタンが表示されます。
これを見ることで、Prefabかどうかの確認ができます。
ゲームオブジェクトを一括修正
次はPrefabから生成したゲームオブジェクトを一括で修正します。
初期状態のSphereは白色です。
赤色に変更してみます。
Hierarchyウインドウのゲームオブジェクトの横にある > をクリックします。
するとHierarchyウインドウの表示が変わり、Prefabモードに移行します。
または、InspectorウインドウのOpenボタンを押すと、Prefabモードに移行することができます。
3Dオブジェクトの色変更はMaterialでおこないます。
■【Unity】CubeやSphereなどの3Dオブジェクトの色を変更する方法
Materialを作成したら、PrefabモードのInspectorウインドウにドラッグ・アンド・ドロップします。
最後に Hierarchyウインドウの < をクリックして、Prefabモードを終了します。
これで、Prefabから生成されたオブジェクトの色が一括で変更されます。
インスタンスを個別に変更
インスタンスの設定を個別に変更することもできます。
個別に設定した値は、それぞれのオブジェクトに反映されます。
例えば、それぞれの 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を変更すると赤と青インスタンスの両方が一括変更されるようになります。
手順
実際に作業してみます。
- 赤インスタンスの一つに青いマテリアルを適用します。
分かりやすように、名前を変更しておきます。
次に、変更したインスタンスを Hierarchyウインドウから Projectウインドウへドラッグ・アンド・ドロップします。 - 次の画面が表示されます。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」を押します。
- 作成されたPrefabを、Hierarchyウインドウにドラッグ・アンド・ドロップします。
Prefab Variantは、名前にVariantが追加されます。
またアイコンの形状が少し異なります。
分かりやすいですね。
確認してみる
作成した Prefabに変更を加えてみます。
まずはベースとなった赤PrefabをPrefabモードで開き、Scaleを x:5 y:5 z:5 に変更してみます。
すると、赤と青の両方のインスタンスの大きさが変化しました。
次に青PrefabをPrefabモードで開き、Scaleを x:2 y:5 z:5 変更してみます。
すると青の大きさのみが変化しました。
想定通りですね。
次にベースとなった赤PrefabをPrefabモードで開き、Scaleを x:2 y:2 z:2 に変更してみます。
赤のみ変化しました。
青も変化を期待したのですが、変化しませんでした。
これは、インスタンスを個別に変更と同じように、個別の設定が青いPrefabに適用されているからです。
Prefab Variantからベースへの反映
Prefab VariantをPrefabモードで開くと、Overridesボタンが表示されます。
ベースとなったPrefabには存在しないので、これはPrefab Variantの特徴ですね。
Overridesボタンを押すと、次のようなパネルが表示されます。
Apply Allボタンが、Apply All to Baseボタン に変更されていますね。
Apply All to Baseボタンを押すと、ベースのPrefabを変更します。
変更内容に Mesh Renderがありますが、これはマテリアルが含まれています。
そのため、赤と青の全てのインスタンスが青くなります。
十分な注意が必要なボタンです。
またRevert Allは、ベースの設定をPrefab Variantに適用します。
その結果、青マテリアルが赤に変更されます。
これも、十分な注意が必要なボタンです。
複数のPrefabをまとめる
次は複数のPrefabを一つにまとめてみます。
まとめた状態は、Unityではネストと呼んでいるようです。
前準備として複数のゲームオブジェクトを配置し、Prefab化しておきます。
次にProjectウインドウで、Prefabを作成します。
コンテキストメニュー:Create → Prfabで作成できます。
作成したPrefabを、Hierarchyウインドウにドロップします。
その後、Prefabモードを開きます。
Prefabモードを開いたら、部品となるPrefabをHierarchyウインドウにドロップします。
これで、複数のPrefabを一つにまとめることができました。
なお、今回は空のPrefabを作成しましたが、実体のあるゲームオブジェクトのPrefab内に、他のPrefabをネストすることもできます。
さらに、ゲームオブジェクト内にPrefabを設置することもできます。
状況に応じて使い分ける必要がありますが、まずはいろいろ操作してPrefabに慣れましょう。
インスタンスからPrefabを削除する
PrefabのインスタンスからPrefabを切り離して、独立したゲームオブジェクトに変更してみます。
Hierarchyウインドウで切り離したいPrefab上でコンテキストメニューを表示します。
※Prefabモードではありません。
Prefab → Unpackを選択します。
これで、インスタンスからPrefabが削除されます。
なお、ネストされたPrefabはそのまま維持されます。
更新日:2023/06/01
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。