今回はUnity2018.3以降のプレハブの扱い方の変更点について見ていきたいと思います。
プレハブの基本的な概念は
の記事で書いたUnity2018.3以前と同じです。
プレハブの扱い方の変更点
プレハブの扱い方でいくつか変わった点があります。
Assetsメニュー等で空のプレハブ作成項目が消えた
今まではUnityメニューのAssetsからCreate→PrefabやAssetsフォルダ内で右クリックしてCreate→Prefabで空のプレハブ項目を作成する事が出来ましたが、Unity2018.3からはなくなったようです。
大体の人はゲームオブジェクトをAssetsフォルダ内にドラッグ&ドロップしてプレハブにしていると思うので、そもそも空のプレハブを作成出来ること自体を知らない人も多いかもしれませんね・・・(^_^;)
インスタンスからプレハブの編集方法が変わった
以前はプレハブをヒエラルキー上に配置すると他のゲームオブジェクトと同じ取り扱いをしてTransform等のコンポーネントを変更し、インスペクタでプレハブに反映したり戻したりが出来ました。
Unity2018.3からはゲームオブジェクトのコンテキストメニューからOpen Prefab Assetを選択するか、インスタンスの横の矢印をクリックしてプレハブの編集をする事が出来ます。
例えばヒエラルキー上で空のゲームオブジェクトを入れ子にして親のゲームオブジェクトをAssetsフォルダ内にドラッグ&ドロップしてプレハブにした場合、
上のように親の空のゲームオブジェクトのアイコンが通常のゲームオブジェクトと変わり、ピンク色の四角部分の矢印をクリックするか、
コンテキストメニューのOpen Prefab Assetを選択するか、
Assetsフォルダのプレハブを選択し、インスペクタのOpen Prefabボタンを押すとプレハブを編集する事が出来ます(Assetsフォルダのプレハブをダブルクリックしても出来ます)。
ヒエラルキーがプレハブの階層に変わるので直接プレハブの値を編集できます。
ピンク色の四角の部分をクリックするとシーンのヒエラルキーに戻り、黄色の四角部分でAssetsフォルダのプレハブを選択状態にすることが出来ます。
プレハブの編集
ヒエラルキーで直接プレハブを編集する場合にシーンビューにAuto Saveチェックボックスがありここにチェックを入れているとプレハブに加えた変更がすぐに保存されます。
Auto Saveにチェックを入れていない場合はSaveボタンを押すと保存されます。
保存していない状態で通常のヒエラルキーに戻る時は保存するかどうかを聞かれます。
Saveボタンを押せば保存し通常のヒエラルキーに移動します。
Discard Changesボタンを押すと編集した内容を破棄して通常のヒエラルキーに戻ります。
Cancelボタンを押すと保存せずそのままプレハブの編集を続けます。
プレハブをネスト(入れ子)にすることが出来るようになった
Unity2018.3からはプレハブの子要素にプレハブを配置するようなネストを作成する事が出来るようになりました。
例えばヒエラルキー上にCubeを作成しAssetsフォルダにドラッグ&ドロップしてプレハブにした後、プレハブをプレハブから作成したGameObjectの子要素にドラッグ&ドロップします。
上のようにプレハブから作成したインスタンスGameObjectの子要素にCubeのプレハブのインスタンスをネストする事が出来ます。
ここまではインスタンスの子要素にインスタンスを配置しているだけなので以前から出来ていますが、Unity2018.3からはプレハブの子要素にプレハブを配置する事が出来るようになります。
追加したCubeのアイコンに+が表示されていますが、これはGameObjectのインスタンスにCubeのインスタンスが追加されたが、GameObjectのプレハブには反映されていない事を現しています。
そこら辺は『プレハブのインスタンスの操作について』の項目で紹介します。
プレハブへの反映がされていない状態でOpen Prefab Asset等で親のGameObjectのプレハブの編集画面を開くとCubeは表示されません。
Unity2018.3以前はプレハブのインスタンスの子要素にプレハブのインスタンスを配置し、親のインスタンスをAssetsフォルダ内にドラッグ&ドロップをして一見プレハブのネストが出来ているような気がしますが、子要素のプレハブは普通のゲームオブジェクトに分解されてしまいます。
Unity2018.3では+アイコンのついた状態のCubeを持つGameObjectがその状態であり、子要素のプレハブのインスタンスをGameObjectプレハブに反映しないとプレハブのネストとはなっていないので注意が必要です。
実際にCubeをGameObjectプレハブに反映させると、
上のようにシーンのヒエラルキーのCubeの+アイコンが消えてGameObjectプレハブにCubeが反映され、GameObjectプレハブ内にCubeが登場します。
プレハブのインスタンスの操作について
インスタンスの操作について見ていきます。
追加したゲームオブジェクトをプレハブに反映する
ヒエラルキー上に配置したプレハブのインスタンスの子要素にゲームオブジェクトを追加すると、アイコンに+が付いています。
これはプレハブに反映されていない状態ですが、追加したゲームオブジェクトをプレハブに含めたい事もあります。
そんな時は+アイコンの付いたゲームオブジェクトを選択し、右クリック→Added GameObject→Apply to Prefab ‘プレハブ名’を選択するとそのゲームオブジェクトがプレハブに反映されます。
Revertを選択すると追加したゲームオブジェクトが削除されてしまいます。
ゲームオブジェクトをプレハブに反映すると+アイコンが消えます。
プレハブのインスタンスを普通のゲームオブジェクトに変換する
プレハブから作成し、ヒエラルキー上にドラッグ&ドロップするとインスタンスとなりますが、通常のゲームオブジェクトとして取り扱いたい時もあります。
そんな時はインスタンスを選択した状態で右クリック→Unpack Prefabを選択します。
上のようにGameObjectが普通のゲームオブジェクトとなりました。
子要素のCubeも普通のゲームオブジェクトとして取り扱いたい場合はCubeをGameObjectのプレハブに反映させた後、GameObjectインスタンスを選択し右クリック→Unpack Prefab Completelyを選択します。
するとプレハブから作成したインスタンスの子階層も含めて普通のゲームオブジェクトに変換されました。
プレハブのインスタンスのインスペクタ
プレハブのインスタンスを選択した時のインスペクタは通常のゲームオブジェクトと表示が少し異なります。
下のような階層のGameObjectプレハブのインスタンスを選択します。
すると下のようなOverridesメニューが表示されます。
GameObjectプレハブのインスタンスにはCubeプレハブから作成したインスタンスと空のゲームオブジェクトを子要素として追加しました。
なのでGameObjectに上書きしてCubeと空のゲームオブジェクトが存在する事になります(プログラミングのオブジェクト指向と似た感じのようです)。
ここからもGameObjectプレハブに反映させるためのApplyボタンと追加した内容を元に戻すRevertボタンがあるのでそこから操作する事が出来ます。
Revert AllとApply Allボタンを使うと一括で実行出来ます。
インスタンスに追加したものの表記について
GameObjectの子要素のCubeのインスペクタでTransformのScaleの変更やAdd ComponentボタンからRigidbody等のコンポーネントを追加するとインスタンスのオーバーライドが行われた部分の表記が変わります。
上のようにTransformのScaleの変更とRigidbodyコンポーネントを追加すると、Scaleの横に水色の縦線が表示されたりScaleの文字が太字になり、Rigidbodyの横に水色の縦線が表示されます。
ただし、プレハブのインスタンスの配置に関するパラメータは固有の値を使うのでオーバーライドしないようです。
プレハブインスタンスの配置は特別な場合であり、他のプロパティとは異なる方法で処理されます。
引用元:https://docs.unity3d.com/ja/2018.3/Manual/PrefabInstanceOverrides.html
プレハブのバリアント(変種)の作成
作成したプレハブの値を少し変えたバリアントを作成する事も出来るようになりました。
プレハブを選択して右クリック→Create→Prefab Variantを選択します。
するとCubeを元にした新しいプレハブが作成されます。
出来たプレハブを選択しインスペクタを見ると
上のようにBaseとしてCubeを持つプレハブが作成されました。
作成したプレハブのバリアントをヒエラルキー上にドラッグ&ドロップすると、
上のように矢印が付いたアイコンで表示されます。
プレハブのバリアントの使い道ですが、Unityのマニュアルにある通りキャラクター等のプレハブを作成しておき、そのバリアントを作成して移動スピードを変更したり小物を持たせたりといった事に使うようです。
例えば以下のようなスクリプトをプレハブのCubeのインスペクタでOpen Prefabボタンを押してCubeのインスペクタに取り付けたとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class PrefabTestScript : MonoBehaviour { [SerializeField] private int hp; [SerializeField] private int mp; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
その後Cubeプレハブを選択した状態で右クリック→Create→Prefab Variantを選択しCubeプレハブのバリアントを作成します。
CubeプレハブのバリアントであるCube Variantをダブルクリックしてプレハブの編集画面を開きインスペクタでScaleとPrefabTestScriptのhpとmpを変更します。
このCube Variantをシーンのヒエラルキー上にドラッグ&ドロップすると値を変更したプレハブのバリアントのインスタンスが配置されるのがわかります。
今回の例では有用な例ではありませんが、Unityのマニュアルにある通りキャラクターの移動機能等を取り付けたプレハブのバリアントを作成し、移動速度やキャラクターに小物を持たせたりをプレハブ単位で出来るようになりますね。
参考サイト
Unityマニュアル―プレハブ―からプレハブに関する内容を見ることが出来ます。