適切な値のコンポーネントを追加した個々のゲームオブジェクトでシーンを構築するのは簡便ですが、シーン内に繰り返し使用されるNPCや小道具、背景パーツなどのオブジェクトが有る場合には、問題点もあります。単純にオブジェクトをコピーして複製すると、それらのプロパティ全てが独立したものになってしまいます。一般的には、ある特定オブジェクトのインスタンス全てのプロパティを揃えたい事が多いので、シーン内でオブジェクトを編集したら、その編集をコピー全てに適用したい、と考えるでしょう。
幸いなことに、Unity は、GameObject オブジェクトのコンポーネントとプロパティーすべてを格納する Prefab アセットタイプを持っています。プレハブはテンプレートとして使われ、シーン内に新しいオブジェクトインスタンスを作成することができます。プレハブアセットに加えられたすべての編集内容はすぐに生成されたすべてのインスタンスに反映されますが、各インスタンス別にコンポーネントを オーバーライド したり、設定したりできます。
注意: シーンにアセットファイル(例えば、メッシュ)をドラッグすると、新しいオブジェクトインスタンスを作成し、元のアセットが変更されたときにそのすべてのインスタンスが変更されます。その動作は表面的に似ていますが、アセットはプレハブではないので、それにコンポーネントを追加したり、後述する他のプレハブの特徴を利用することができなくなります。
Asset > Create Prefab を選択して、現れた “空” のプレハブ上にシーンのオブジェクトをドラッグすることで、プレハブを作成することができます。それで、他のゲームオブジェクトをそのプレハブの上にドラッグすると、現在のゲームオブジェクトを新しいものに置き換えたいかきかれます。単に、プレハブアセットをプロジェクトビューからシーンビューにドラッグするだけで、プレハブのインスタンスを作成します。プレハブのインスタンスとして作成されたオブジェクトは、ヒエラルキービューで青色の文字として表示されます(通常のオブジェクトは黒の文字で表示されます)。
上記で述べたプレハブアセット自身への変更はすべてのインスタンスに反映されますが、別々に個々のインスタンスを変更することができます。いくつか似たような NPC を作成する際、より現実的にみえるようにするためのバリエーションを導入したいときに便利です。プロパティーがオーバーライドされたときにそれを明確にするために、その名前のラベルが太字でインスペクターに示されます。(完全に新しいコンポーネントがプレハブインスタンスに追加されると、すべて のプロパティーが太字で表示されます。)
スクリプトからプレハブをインスタンス化する方法については 実行時のプレハブのインスタンス化 を参照してください。
インスタンスからのプレハブの編集
プレハブインスタンスのインスペクター上には、通常のオブジェクトには存在しないボタンがあります。 Select 、 Revert 、 Apply の 3 つです。
Select ボタンを使うと、インスタンスから生成元のプレハブアセットを選択できます。これによりメインのプレハブを編集し、その変更をインスタンス全てに適用する事が可能になります。 Apply ボタンを使えば、インスタンス側で変更した値を元のプレハブに上書きして保存することもできます(位置と回転の変更は除外します)。これは、どれか一つのインスタンスに加えた変更を、インスタンス全体に適用したい場合に効果的です(変更した値の上書きを除く)。また、全体的な変更を手早く簡単に行う事ができます。 Revert ボタンを使うと、試しにプロパティを上書き変更してみたものの、デフォルトの値の方が良かったような場合に、インスタンスを元のプレハブの値に戻すことができます。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.