【Unity】 Prefabを使ったオブジェクト生成・複製・削除等の方法
今回の記事ではPrefab(プレハブ)の生成から編集、削除までを徹底的にご説明します。
同じモンスターを大量に出現させる場合や銃から銃弾を放つ場合など、ゲーム内で同じオブジェクトを大量に使いたいor出現させたい場合に使用します。
Unityでゲームを作成する場合には必須スキルとなるのでこの機会に覚えましょう。
Contents
Prefab(プレハブ)とは
Prefabとはアセットの1つで、再利用可能なゲームオブジェクトとしてプロジェクトビューに格納されるものです。
例えるとクッキーの型抜きのようなもので、型抜きによって同じ型のクッキーを大量に作成することができるイメージです。
したがって、Unityにおいては構成が同じオブジェクトを複数配置したい場合に使用します。
(ちなみにPrefabはPrefabricationの略で、事前に工場生産された部材(床、壁、天井など)を現場に運んで組み立てる工法やその工法で建てられた建築物のことを意味します。)
Prefabから作成されたオブジェクトのことをインスタンスと呼び、Prefabからオブジェクトを作ることをインスタンス化と言います。
Prefabのメリットは、Prefabを編集するとそのPrefabから生成された物体全てに編集内容が反映することができるという点があります。
従って同じ物体を大量に作成したい場合、1つずつ編集する手間が省かれ、編集し忘れるというミスも無くなります。
オブジェクトをPrefabにする(Prefab化)
Prefabの作成方法は非常にシンプルです。
- オブジェクトをProject View(プロジェクトビュー)へドラッグ&ドロップ
以上です。
実際の操作は以下のGIFをご覧ください。
まずHierarchyビューでCubeのオブジェクトを作成します。
その後、作成したCubeをProjectビューへドラッグ&ドロップします。
以上でPrefab化は完了し、Prefabとして利用することが出来るようになります。
凄く細かいところですが、Prefab化したオブジェクトはHierarchビューの名前の横の図形が白から青に変更されます。
Prefabからオブジェクトを複製する(インスタンス化)
Prefabからオブジェクトを複製する方法を説明します。この場合はPrefab化と逆の行動を行うことになります。
Projectビューの「Cube」をHierarchyビューへドラッグ&ドロップします。
すると新しい「Cube1」というオブジェクト(インスタンス)が作成されます。
このように、Prefabを使うことでオブジェクトの複製は簡単に行うことができます。
Prefabを編集・更新する
先述の通り、Prefabの長所はPrefabから複製したオブジェクトを一斉に編集・更新できる点です。
今回は色を変更するという例で説明していきます。
事前にCubeを3つに複製しました。
これまた手順は大変シンプルです。
1.Projectビューの「Cube」Prefabをダブルクリックします。するとHierarchyビューに「Cube」Prefabが表示されます。
2.ProjectビューのCreateボタンを押してMaterialを作成します。
3.Materialの名前を「Cube」に変更し、色を白から赤に変更します。Inspectorビューで「Cube」マテリアルの「Albedo」で色を変更します。
4.赤色の「Cube」MaterialをHierarchyビューに存在するCubeへドラッグ&ドロップします。すると、Cube全てが赤色に変更されるのが確認できます。
以上でPrefabの設定を変更できました。
直前のGIFで分かるように、Prefabから複製した全てのオブジェクト(インスタンス)を変更できるため手間を大幅に削減することができます。
もちろん、オブジェクト1つずつに対して異なる編集・修正することもできるので、同じ様なオブジェクトを複数使用する場合は上手くPrefabを利用してみてください。
スクリプトでPrefabを動的に呼び出す・削除する方法
この章ではスクリプトを使ってPrefabをゲーム内で動的に呼び出したり、削除する方法を説明します。
スクリプトはゲームの中だと、銃から銃弾を放つ、特定の行動をした時にモンスターが複数出現するなど、事前に弾や敵を配置できない場合に、弾を銃口の先から登場させる、敵を決められた場所に登場させるといったときに使います。
ゲームで非常に使用率が高いので、しっかりと使えるようになりましょう。
スクリプトからPrefabを呼び出す場合に一般的に使うのが
- Resourcesクラス
- Instantiateクラス
です。
Resourcesクラスとは簡単に言えば「Resourcesフォルダに存在するPrefabなどを取得するためのクラス」です。
Instantiateクラスは「指定したPrefabなどのオブジェクトを生成するためのクラス」です。
では、具体的な呼び出し方を説明していきます。
1.対象のPrefabをResoucesフォルダの配下に置く
まずResoucesフォルダを作成します。
Projectビューで「Assets」フォルダを右クリックし、メニューから「Create」>「Folder」を選択します。
Resouceクラスを使うには「Resouces」フォルダにファイルが存在する必要があるので、フォルダ名を「Resouces」に変更します。
更に「Cube」Prefabを「Resouces」フォルダにドラッグ&ドロップして移動させます。
2.Resoucesを使用したスクリプトを作成する
ここでは「TestManager」という名前のスクリプトをAssetsの配下に作成します。
1と同様にAssetsを右クリックし、「Create」>「C# Script」を選択します。
名前を「TestManager」に変更します。
TestManagerのスクリプトを書き換えます。
今回は以下のスクリプトを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestManager : MonoBehaviour { // 初期化 void Start() { GameObject obj = (GameObject)Resources.Load("Cube"); // プレハブを元にオブジェクトを生成する GameObject instance = (GameObject)Instantiate(obj, new Vector3(5.0f, 0.0f, 0.0f), Quaternion.identity); } } |
このスクリプトはPrefabをゲーム内に出現させる最も簡単な例になります。
具体的には、ゲームを開始した時に(5,0,0)という座標にPrefabと同じオブジェクトを出現させるというものです。
以下スクリプトの詳細な説明です。読み飛ばしてもらっても問題ありません。
1 |
GameObject obj = (GameObject)Resources.Load("Cube"); |
この1行がResoucesクラスを使用しているスクリプトです。
Resouces.Load()で括弧内の名前のPrefab、今回はCubeをGameObjectとして抽出するというものです。
1 2 3 |
GameObject instance = (GameObject)Instantiate(obj, new Vector3(5.0f, 0.0f, 0.0f), Quaternion.identity); |
この行でInstantiateクラスを使用しています。
使い方ですが、Instantiate(A,B,C)とした時、
A:第1引数(original)・・・ コピー対象の既存オブジェクト
B:第2引数(position)・・・新規オブジェクトの位置
C:第3引数(rotation)・・・新規オブジェクトの向き
となります。
従って、直前で設定した「obj」というGameObjectをAにし、Bでは(5,0,0)、Cでは「回転しない」を意味する「Quaternion.identity」を設定しています。
3.スクリプトをアタッチするためのオブジェクトを作成し、アタッチする
2で作成したスクリプトをゲームに反映させるために空のオブジェクトを作成します。
Hierarchビューで「Create」をクリックし、開かれたメニューから「Create Empty」を選択します。名前は「TestManager」にします。
ではスクリプトをアタッチします。
先ほど作成したC#スクリプト「TestManager」を空のオブジェクト「TestManager」にドラッグ&ドロップします。
以上で完了です。
では最後に実際にPrefabがゲーム内で呼び出されるかを確認してみます。
再生ボタンを押すと確かにもう一つのCubeができたのが確認できました。
このように、スクリプトを使ってPrefabが増やすことができるので、ぜひゲームで活用していきましょう。
Prefab・インスタンスの2つの削除方法
1.Assetsの中のPrefab本体の削除
Projectビューで削除したいPrefabを右クリックします。
その後開かれたメニューからDeleteを選ぶと、Prefabを削除することができます。
複製したインスタンスの削除
Hierarchyビューで削除したいインスタンスを右クリックします。
その後開かれたメニューからDeleteを選ぶと、そのインスタンスを削除することができます。
2.Prefab化したオブジェクトを元に戻す方法 – Prefabの解除
先を見越してPrefab化してみたけど、実際にはそのPrefabを使用することがなく、普通のオブジェクトに戻したい場合があります。
また、Prefabを削除した影響でMissing Prefabsというエラーが出てしまう場合もあります。
このような場合にPrefabを解除することで問題を解決することができます。
解除の方法ですが、解除したいオブジェクトを右クリックしてメニューを開きます。
そして「Unpack Prefab」もしくは「Unpack Prefab Completely」を選びます。
この2つはNested Prefabsのあるなしで挙動が変わるのですが、少し難しい話になるのでここでは割愛します。
迷った場合は「Unpack Prefab Completely」を選んでください。
Nested Prefabsについて詳しく知りたい方は公式サイト(英語ですが)をご参照ください。
→)Unity – Manual: Nested Prefabs
まとめ
今回はPrefabについて解説しました。
Unityでゲームを作る際には確実に必要になるスキルなので、しっかりと身に着けていきましょう。
他にもゲーム開発に必要な基礎知識をまとめているので、ぜひ参考にしてみてください。
参考記事→)【Unity入門】ゲーム開発ができるようになる基礎知識まとめ
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!