Prefab(プレハブ)はUnityにおけるゲームオブジェクトをカプセル化、アセット化するためのもの。カプセル化とは、必然性のある一個体として存在を定義する、ということです。プレハブ化により制作を効率的に行い、かつ多数のオブジェクトを一元管理することが可能になります。
そして、Unity 2018.3以降では更なるPrefabシステムの強化が行われたので、その確認や復習の意味も込めて、Prefab周りについて簡単なまとめをしていこうと思います。
(2019/05/30 その他の細かい機能について追記と修正)
Prefabとゲーム制作
ゲーム上の多くの同質なオブジェクトは、実際には1つのデータから生み出されたコピーであり、そう考えるとゲームの構造は反復的です。(あまりに反復的だと、機械的で違和感を感じてしまうので、昨今では誤魔化すテクニックが求められます)この傾向は、古いゲームほど強くなります。データ容量や処理能力の問題もあり、ゲーム性も構造も特に反復的でした。
Prefabとは、シーン内のゲーム・オブジェクトの原型となるアセットであり、ゲーム上に同種のゲームオブジェクトが複数あるとして、それらは全てひとつのPrefabから作られています。(プログラミングによっては、実体ごとの差異をつけることも可能ですが)
Prefabを使えば、そこから作られたコピー全てに反映される変更を行うことが出来ますし、そのゲームの起動中の好きなタイミングで、好きな分だけオブジェクトを生成(Instantiate)することが出来ます。
Prefabを活用することでゲーム制作を効率化できるし、ゲームプレイ中にインタラクティヴな処理が出来るようになる、というシステムです。
Prefabの作り方と使い方
Unityのシーン(Scene)上にあるゲームオブジェクトをプロジェクト・ウィンドウ側にドラッグ&ドロップすると、Prefabが作られます。例えば、Prefabフォルダなんかを作っておくのがいいです。
単純に空のゲームオブジェクトをシーン上に作成し、アセット・フォルダに戻しただけでもPrefab化されます。Prefab化してしまえば、その後はそのPrefabをドラッグ&ドロップすれば、シーン上にPrefabからのオブジェクトを生成できます。
Prefabから作られたオブジェクトには、ヒエラルキー・ウィンドウの右側に矢印が表示されます。これを押すとそのPrefabだけ表示されるウィンドウに移動して、新機能であるPrefab編集モードとなります。
自動セーブがアクティブになっており、変更を行うたびセーブされシーン上のオブジェクトに反映されますが、手動に切り替えることも出来るようです。
原型であるPrefabに行われる変更は、そこからのオブジェクト全てに適用されるので、いちいちシーン上のオブジェクトに個別に変更を加える必要がなくなります。
逆にシーン上のオブジェクトに加えた変更をPrefab側に適用することも出来ますが、これはPrefabを上書きしてしまうので注意が必要な機能でもあります。
また、InstantiateメソッドとPrefabを使うことで、ゲーム起動中のオブジェクト生成をスクリプトから行うことが出来るようになります。プレイヤーの操作に対応した、アイテムや敵のリスポーンが行えるようになるということです。
新機能、"Prefab Variant"
基本機能についてはこんな感じですが、2018.3や2019.1以降ではPrefabに関して、いくつかの新機能が追加されました。前述のPrefab編集モードもそのうちの一つですが、Prefab Variant, Nested Prefabという機能が追加されました。
まず単純にPrefabから作られたゲームオブジェクトに対して行った変更を太字にしたり、インスペクターの項目の左側に青い線を表示することで、UI上で変更を行ったことを分かりやすくしています。(慣れないと困惑しますが)また、Overridesと表示されているメニューを開くと、行われた変更の一覧が表示されもします。
Prefabへの変更の一括取り消しはお馴染みですが、部分的な変更の取り消しも可能です。変更した項目で右クリックして、取り消しを選択すると元の値に戻ります。
Prefab Variant、いわば変異プレハブですが、これは元のPrefabを継承しながらも別バージョンのPrefabを作るという機能です。まさしくC#のClassにおける継承に近い機能で、異なる要素を上乗せしたい時に活用できます。
あるPrefabからシーン上に作ったオブジェクトを更にプロジェクトウィンドウに戻すと、オリジナルのプレハブを作るか?Prefab variantを作るか?というようなダイアログが表示されます。
オリジナルPrefabというのは、その元となるPrefabとは切り離された完全別個体の新たなPrefabを作るということです。元のPrefabとの繋がりは無くなり、その変更の影響を受けません。
Prefab Variantはあくまで別ヴァージョンとしてのPrefabなので、共有部分に関しては元のPrefabの影響を受けるようです。通常のPrefabのアイコンは青い立方体ですが、Variantはそこに矢印が表示されます。注意して使わないと、管理が破綻してしまいそうな機能ではあります。
新機能、"Nested Prefab"
いよいよ!という機能です。Prefabの中にPrefabを含ませることが出来るようになりました。大規模なPrefabは、複数の小中規模の細かいオブジェクトを含むものですが、そうした内部の複数のオブジェクトをプレハブ化すれば、管理や変更、拡張が圧倒的に楽になります。
ある建物のPrefabの中にある設備の一つについて変更を加えたい・・・単純なPrefabならば、古いオブジェクトを削除して、変更を加えた新たなオブジェクトをPrefabに加える・・・ということが必要になります。
しかし、その設備のオブジェクトがPrefabであるならば、その設備のPrefabに対して変更を行えさえすれば、建物のPrefabに対しても自動的に変更が適用されるし、シーン上に設置された、その建物のPrefabからなるオブジェクトにも適用される、ということになります。かなり便利で効率的な機能!!
ただ、これもVariantと同様に使うのに注意が必要な機能ではあるかと思います。Prefabの中にPrefabがあって、そのPrefabの中にもPrefabがあって・・・ということになってしまうので。Nestの名の通り、Nestが深くなり過ぎないように気をつけるべきなのかもしれません。きちんとコントロールさえ出来れば、制作をガンガン進められる機能になってくれるはずです。
上画像は、そのPrefabがネストされているPrefabを含めようとすると出てくる注意で、Prefab同士が無限ループにならないようにはなっているようです。
Unityもドンドン進化している!
という訳で、Unityの中でも特に重要なPrefabシステムについて書いてみました。特にUnity 2019.1以降には大規模な機能追加が行われ、様々な機能において劇的な進化があるようなので、付いて行けるようにしたいですね。