この記事はUnityの基本的な使い方を解説するシリーズの一つで、今回はプレハブについて詳しくご説明します。
Unityでゲームを作っていると
- ゲームオブジェクトを手軽に複製したい
- 複製したゲームオブジェクトを一気に変更したい
という場面が出てきます。このようなときに役立つのがプレハブです。ここではそのプレハブについて
- そもそもプレハブとは何か?
- どうやってプレハブを作ったり編集したりするのか
といった点について丁寧に解説していきますね。
そもそもプレハブ(Prefab)とは?
まずはじめに、そもそもプレハブとは何なのか?という点からご説明します。
Unityのプレハブ(Prefab)とは一言でいえば「ゲームオブジェクトのテンプレート」のようなものです。
例えば、下の図のようなCubeをたくさん作りたい場合があるとしましょう。
ここですぐに思いつく方法はこのCubeを「Ctrl+D」などで複製していく方法だと思います。しかし、そのように単純に複製した場合、例えばすべてのCubeに模様を付けたくなったら一つ一つ手作業で変更しなければなりません。なんだかとても面倒ですよね。
そこでプレハブの出番です。プレハブを作っておくと、プレハブを複製して作ったオブジェクト(※インスタンスと呼びます)には元のプレハブの変更が反映されます。
先ほどの例でいえば、あらかじめ元のCubeをプレハブ化しておけば、そのCubeに模様を付けたときにインスタンスのCubeすべてに模様が出るという感じです。
このようにプレハブは少しややこしい概念ですが、使いこなせると非常に便利なので必ず理解しておきましょう。
プレハブバリアント(Prefab Variant)
それから最近のUnityでは、プレハブバリアント(Prefab Variant)という概念が追加されています。これは簡単に言えば「あるプレハブのインスタンスをさらにプレハブ化できる」というものです。下の図をご覧ください。
図の場合、元のプレハブは白い四角です。例えばそのプレハブのインスタンスを作り、色を赤に変更したとします。このインスタンスをプレハブ化したものがプレハブバリアントです。
プレハブバリアントは元のプレハブの特徴を引き継ぎつつも、独自の特徴を持つことができます。そして元のプレハブが変更された場合、インスタンスと同じようにバリアントにも変更が適用されますが、バリアント独自の特徴は変更されません。
プレハブの作り方・編集方法
ではプレハブについて一通りご理解頂いたところで、プレハブの作り方や編集方法についてご説明します。
プレハブの作り方
まずプレハブの作り方はとても簡単です。ヒエラルキーからプレハブ化したいゲームオブジェクトを選択し、プロジェクトウィンドウの任意のフォルダの中にドラッグ&ドロップするだけです。
たったこれだけでプレハブを作ることができました。
プレハブの編集方法
プレハブを編集するには、通常のゲームオブジェクトと同様にプロジェクトビューでプレハブを選んでインスペクターから編集を行います。
ただしその方法だとプレハブの子オブジェクトまでは編集できないので、子オブジェクトまで編集したい場合はプレハブをダブルクリックして開いて「プレハブ編集モード」にしたうえで編集する必要があります。
プレハブ編集モードでは変更が逐一保存され、プレハブのインスタンスに変更が反映されます。
プレハブのインスタンスの作り方
次にプレハブのインスタンスを作る方法についてです。こちらは主に次の2通りがあります。
- 手動でインスタンスを作る方法
- C#スクリプトから自動的にインスタンスを生成する方法
手動でプレハブのインスタンスを作る方法
まず手動でプレハブのインスタンスを作る方法はとても簡単で、インスタンスを作りたいプレハブをプロジェクトウィンドウで選んで、ヒエラルキーかシーンビューにドラッグ&ドロップするだけです。
インスタンス化したオブジェクトは青い立方体のアイコンで表示されます。
C#スクリプトからプレハブのインスタンスを生成する方法
次にC#スクリプトからインスタンスを自動生成する方法もあります。こちらはC#スクリプトを用意する必要がありますが、手動では生成しきれない数のインスタンスを作れたり、ゲーム中に必要な時にだけ生成する、といったことができたりして便利です。
スクリプトでインスタンスを生成するときは「Instantiate関数」を使います。スクリプトリファレンスから引用すると引数は
Instantiate (Object original, Vector3 position, Quaternion rotation, Transform parent);
となっています。もう少し分かりやすく説明すると、指定できる引数は全部で4つあって
- 生成するプレハブ
- 座標
- 回転
- 親(※指定する場合のみ)
の順になっています。では具体的なC#スクリプトの例を見てみましょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { [SerializeField] int numOfInstance = 10; [SerializeField] float padding = 2; [SerializeField] GameObject prefab; void Start() { CreateInstance(); } void CreateInstance() { Vector3 position = Vector3.zero; for(int i = 0; i < numOfInstance; i++) { Instantiate(prefab, position, Quaternion.identity); position.x += padding; } } }
これは指定したプレハブのインスタンスを等間隔に、指定した数だけ生成するスクリプトです。実行結果の例は下のようになります。
プレハブ関係を解除する方法
さて最後はプレハブ関係を解除する方法です。プレハブのインスタンスを変更していると、たまに「元のプレハブとの関係を解除したい」という場面が出てきます。そのようなときはインスタンスを右クリックし、「プレハブ」→「展開」を選択しましょう。
するとインスタンスの元となっているプレハブとの関係が1段階解除されます。
もしプレハブバリアントのように何重にもプレハブ化されている状態を解除したい場合は、「展開」の一つ下にある「すべてを展開」を選択するとプレハブ関係が完全に解除されます。
おわりに
以上、プレハブの概要や作り方・編集方法等についてご説明しました。
Unityでゲームを作るうえでプレハブは欠かせない概念の一つなので、ぜひ上記の内容を参考にしていただきご理解いただければと思います。