【Unity入門】プレハブについて【使い方】

この記事は本のように順を追って解説しています。この記事は途中のページになります。この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<プレハブとは>

Unityでゲームを作る際、ゲームオブジェクトを複製して使い回すということはよくあることです。例えば銃の弾を複数複製して発射するなどいろいろあります。

しかし、ただコピーして複製しているだけでは、複製したものも含めて全部変更したい時、全部に変更を適応しなければなりません。これは大変です。その為、Unityではプレハブという機能を使用します。

プレハブを例えていうと、「元ファイル」と思ってもらってもいいかなーと思います。複製する元のファイルですね。コピペとの違いは、この元ファイルに変更を加えると、複製された物にも変更が適用されるという点です。

<プレハブを作ってみよう>

あーだこーだ言っててもわからないと思うのでとりあえずやってみましょう。

とりあえず、Cubeを作りましょう。

Object Cube

これを複製の元にしても右クリックしてCubeを作るのと一緒なのでちょっとパラメータをぐちゃぐちゃにいじってみましょうか。

change cube

さて、適当にいじってみました。縦長にして、マテリアルも変更し、当たり判定が変な位置にあります。皆さんも適当でいいのでいじくってみてください。

そうしたら、これをヒエラルキーからプロジェクトウィンドウにドラッグ&ドロップします。

cube drag and drop project window

はい、これでプレハブが完成しました。

さて、この時ヒエラルキーのCubeを見てみましょう。

hierarchy prefab

青色になっているのがわかりますね。この状態になっていると、プレハブが存在する=元になっているファイルが存在するという状態になります。

では、今度はプロジェクトウィンドウからヒエラルキーにドラッグ&ドロップしてみましょう。シーンビューに直接ドラッグ&ドロップしてもOKです。

Increase prefabrication

このようにプレハブを使って、複数のゲームオブジェクトを複製することができます。今回はゲームオブジェクト単体のパラメータをいじってプレハブにしましたが、子オブジェクトもプレハブの中に入れることができるので覚えておくといいと思いますよ。

<プレハブを変更してみよう>

実はUnity2018.3でプレハブに関する大きなアップデートがあり、使用感が違ったものになっています。その為、別々に解説していきます。

クリックすると展開します

プロジェクトウィンドウでプレハブにしたCubeを選択してください。

inspector prefab

インスペクターにOpen Prefabというボタンがあると思うのでクリックしてください。プロジェクトウィンドウのCubeをダブルクリックしても同じ挙動になります。

ちなみにこれはヒエラルキーのプレハブの「>」となっているところを押しても同じです。

go prefab mode

するとヒエラルキーとシーンビューが変更されます。

prefab mode

2つのウィンドウの上の方にプレハブの青い箱とCubeと書いてあるので、今、この状態はプレハブのCubeを編集している画面だということがわかります。

ヒエラルキーとシーンビューを使用していますが、現在はシーンの編集ではなくプレハブを編集する画面になっていますので、お間違いのないようにお願いします。

では、この画面でプレハブを編集してみましょうか。また適当でいいのでごちゃごちゃにいじって、今の状態とは違う状態にしてみてください。

change cube in prefab mode

とりあえず自分はペシャンコにしてみました。

そうしたら、ヒエラルキー上の「<」となっているボタンか、シーンビュー上の「Scenes」となっているボタンをクリックしてください。どっちも一緒の機能です。

back prefab mode

するとさっきまで縦長だったCubeが全部ぺちゃんこになっていました。

The change is applied

このようにプレハブを触ることによって、複製したゲームオブジェクト全てに変更がかかることがわかりました。

プロジェクトウィンドウでプレハブにしたCubeを選択してください。

prefab inspector before 2018.3

すると、インスペクターに「プレハブ」のCubeの情報が出てきます。ここで注意しなければならない点はシーンに存在するゲームオブジェクトのCubeの情報ではなく、プレハブのCubeの情報が出ています。

今、シーンは次の状態になっています。

many cube

それではプレハブのインスペクターの値を適当にぐちゃぐちゃに変更してみましょう。

change prefab before 2018.3

このように、プレハブの値を変更すると、複製した全部のゲームオブジェクトに変更が反映されているのが見て取れます。

<プレハブを解除しよう>

さて、プレハブで複製してみたわいいものの、このオブジェクトは他のオブジェクトと同じように変更したくない場面というのも出てくると思います。

そういった場合は、プレハブとの繋がりを解除しましょう。

クリックすると展開します

ヒエラルキーでプレハブとの関係を解除したいゲームオブジェクトを選択して右クリックして、Unpack Prefabを選択してください。

unpack prefab

↓のように解除されたゲームオブジェクトが青色から白色になっているのがわかると思います。

white cube

解除されれば、プレハブに変更がされてもこのゲームオブジェクトは変更されません。

ヒエラルキーでプレハブとの関係を解除したいゲームオブジェクトを選択した状態で上部メニューのGameObject>Break Prefab Instanceを選んでください。

break prefab instance

↓のように解除されたゲームオブジェクトが青色から黒色になっているのがわかると思います。

black cube

解除されれば、プレハブに変更がされてもこのゲームオブジェクトは変更されません。

<ゲームオブジェクトに変更を加える>

さて、プレハブと複製したゲームオブジェクトは繋がっているので、複製したゲームオブジェクトの方を変更したら、プレハブも変更されてしまいそうな気がしますが、そうではありません。

複製したゲームオブジェクトは各自で変更を持ちます。↓はとりあえず、複製したゲームオブジェクト1つのパラメータを変更したものです。

Duplicated game object

このように複製されたゲームオブジェクト1個変更しても全体に反映される訳ではありません。

ちなみに、この状態でプレハブをいじっても

change parameter prefab

このように独自にパラメータをいじったオブジェクトは「いじったパラメータ部分だけ」プレハブの変更を受け付けなくなります。いじってない部分はプレハブの変更の影響を受けます。

ちなみに、TransformのPositionとRotationに関してはローカル座標は保存されますが、ワールド座標は保存されません

プレハブの中の子オブジェクトを動かすと、その位置と回転はパラメータをいじったとみなされますが、一番親のオブジェクトの位置と回転を動かしてもパラメータをいじったとはみなされません。

ちなみに、元のプレハブからパラメータがいじってあると、いじったパラメータは太字になります。

Displayed in bold in the Inspector

ビミョーに太くなっているのがわかるでしょうか。このビミョーな違いでパラメータが変更されたかどうかを見分ける必要があります。

Unity2018.3以降のみの機能

Unity2018.3以降からの機能として、元のプレハブと違うパラメータが存在した時、インスペクターの左端に青線で表現されるようになりました。

Displayed as a blue line in the inspector

わかりやすく便利になったと思います。

注意点

マテリアルを変更して赤色にしていましたが、このマテリアルの色をヒエラルキーのゲームオブジェクトから変えるとどうなるでしょう。

material not prefab

全部色が変わってしまいました。

あれ?複製されたゲームオブジェクトの変更は元のプレハブには影響しないんじゃないの?ついでに言うと、プレハブとの関係を切ったオブジェクトも青色になっているけど、どーして?って話なんですが、実はマテリアルはマテリアルで元のファイルがいます。

↓こいつですね。

material

みなさん、マテリアルを作成した時、プロジェクトウィンドウにできたファイルがあると思います。これが元のマテリアルファイルですね。

プレハブは、「何のマテリアルがついているか」という情報は保存していますが、「マテリアルの中身がどうなっているか」は保存していません。

それでもって、マテリアルはプレハブのようにたくさん複製されたわけではなく、複製されたたくさんのゲームオブジェクトたちは、1つのマテリアルを見ています。

その為、プレハブの変更うんぬんに関係なく、マテリアルを変更すると同じマテリアルを参照している全てのオブジェクトが変更されます。

<逆にゲームオブジェクトの変更をプレハブに適用する>

シーン上でゲームオブジェクトをいろいろいじくって、それを元のプレハブに適用したい時があったりします。その場合のやり方を説明します。

クリックすると展開します

インスペクターの上の方にPrefabと言う項目があるので、その中のOverridesをクリックします。その後、Apply Allをクリックすれば、ゲームオブジェクトの変更がプレハブに適用されます。Revert Allで全ての変更を破棄して元のプレハブと同じにします。

overrides prefab parameter

↓変更された各項目をクリックすると
・Prefab Sourceが変更前
・Overrideが変更後
で比較する事ができます。

show changed prefab parameters

↓のような状態から縦長に変更した奴をApply Allでプレハブに適用すると

apply all prefab

↓プレハブとの関係を切ったゲームオブジェクト以外がみんな縦長になって変更が適用されているのがわかります。

apply nested prefab

ゲームオブジェクトのインスペクターの上の方を見てみると、Prefabと言う項目があり、Select,Revert,Applyとあります。

change prefab parameters

Selectは元のプレハブのファイルを開くボタンで、Revertが全ての変更を破棄して元のプレハブと同じにします。Applyがゲームオブジェクトの変更がプレハブに適用されるボタンです。


↓のような状態から縦長に変更した奴をApplyでプレハブに適用すると

change nested prefab

↓プレハブとの関係を切ったゲームオブジェクト以外がみんな縦長になって変更が適用されているのがわかります。

cube box collider

<まとめ>

Point

プレハブを用意すると複製する時に便利だよ!
プレハブには子オブジェクトも含めることができるよ!
プレハブに変更を加えると複製されたオブジェクトにも反映されるよ!
複製されたオブジェクトは独自に変更を持つこともできるよ!

Topic

マテリアルの中身はプレハブとは関係ないよ!

<わからない事があったら>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば、また別の勉強方法があるので違った切り口を使ってみるのもいいと思います。

<オススメの本>

本で詳しい解説がされているので書籍を買ってみるというのも手の一つです。最近はKindle版があるので届くまで待つ事もなく場所も取らないのでとても良いです。

<オンラインスクール>

オンラインスクールでは人に質問する事ができるので、行き詰まってしまった方にオススメです。 無料体験もあるので試しに見てみるのも手ですよ




と、言うわけで、プレハブの基本的な使い方でした。まだちょっと、プレハブについては解説が必要なので次回もプレハブについて解説していきたいと思います。




タイトルとURLをコピーしました