Version: 2017.1
静的ゲームオブジェクト
ランタイムのプレハブのインスタンス化

プレハブ

適切な値のコンポーネントを追加した個々のゲームオブジェクトでシーンを構築するのは簡便ですが、シーン内に繰り返し使用されるNPCや小道具、背景パーツなどのオブジェクトが有る場合には、問題点もあります。単純にオブジェクトをコピーして複製すると、それらのプロパティ全てが独立したものになってしまいます。一般的には、ある特定オブジェクトのインスタンス全てのプロパティを揃えたい事が多いので、シーン内でオブジェクトを編集したら、その編集をコピー全てに適用したい、と考えるでしょう。

幸いなことに、Unity は、GameObject オブジェクトのコンポーネントとプロパティーすべてを格納する Prefab アセットタイプを持っています。プレハブはテンプレートとして使われ、シーン内に新しいオブジェクトインスタンスを作成することができます。プレハブアセットに加えられたすべての編集内容はすぐに生成されたすべてのインスタンスに反映されますが、各インスタンス別にコンポーネントを オーバーライド したり、設定したりできます。

注意: シーンにアセットファイル(例えば、メッシュ)をドラッグすると、新しいオブジェクトインスタンスを作成し、元のアセットが変更されたときにそのすべてのインスタンスが変更されます。その動作は表面的に似ていますが、アセットはプレハブではないので、それにコンポーネントを追加したり、後述する他のプレハブの特徴を利用することができなくなります。

プレハブを使う

Asset > Create Prefab を選択して、現れた “空” のプレハブ上にシーンのオブジェクトをドラッグすることで、プレハブを作成することができます。それで、他のゲームオブジェクトをそのプレハブの上にドラッグすると、現在のゲームオブジェクトを新しいものに置き換えたいかきかれます。単に、プレハブアセットをプロジェクトビューからシーンビューにドラッグするだけで、プレハブのインスタンスを作成します。プレハブのインスタンスとして作成されたオブジェクトは、ヒエラルキービューで青色の文字として表示されます(通常のオブジェクトは黒の文字で表示されます)。

上記で述べたプレハブアセット自身への変更はすべてのインスタンスに反映されますが、別々に個々のインスタンスを変更することができます。いくつか似たような NPC を作成する際、より現実的にみえるようにするためのバリエーションを導入したいときに便利です。プロパティーがオーバーライドされたときにそれを明確にするために、その名前のラベルが太字でインスペクターに示されます。(完全に新しいコンポーネントがプレハブインスタンスに追加されると、すべて のプロパティーが太字で表示されます。)

「シャドウの投影」をオーバーライドしてプレハブインスタンスでレンダラーメッシュ
「シャドウの投影」をオーバーライドしてプレハブインスタンスでレンダラーメッシュ

スクリプトからプレハブをインスタンス化する方法については 実行時のプレハブのインスタンス化 を参照してください。

インスタンスからのプレハブの編集

プレハブインスタンスのインスペクター上には、通常のオブジェクトには存在しないボタンがあります。 SelectRevertApply の 3 つです。

Select ボタンを使うと、インスタンスから生成元のプレハブアセットを選択できます。これによりメインのプレハブを編集し、その変更をインスタンス全てに適用する事が可能になります。 Apply ボタンを使えば、インスタンス側で変更した値を元のプレハブに上書きして保存することもできます(位置と回転の変更は除外します)。これは、どれか一つのインスタンスに加えた変更を、インスタンス全体に適用したい場合に効果的です(変更した値の上書きを除く)。また、全体的な変更を手早く簡単に行う事ができます。 Revert ボタンを使うと、試しにプロパティを上書き変更してみたものの、デフォルトの値の方が良かったような場合に、インスタンスを元のプレハブの値に戻すことができます。

静的ゲームオブジェクト
ランタイムのプレハブのインスタンス化