今回は、ゲームエンジン Unity のシーンに複数の同じ敵キャラなどのゲームオブジェクトを配置する際の、複製とプレハブインスタンスの違いについて紹介します。

※ Unity のバージョンは 2021.3.25f1 Personal <DX11> です。
サンプルのゲームオブジェクト
最初に、複製とプレハブインスタンスの違いのサンプルに用いるゲームオブジェクト「 PingPongCube(ピンポンキューブ) 」を説明します。

Hierarchy ウィンドウで右クリックして「3D オブジェクト」→「 Cube 」を選択します。
※プロジェクトのテンプレートは 3D です。 2D の場合は Sprite の Square などを選択しても構いません。

作成した Cube に、一定間隔で指定された方向と逆方向を往復するスクリプトをコンポーネントとして追加します。
※ Hierarchy ウィンドウでわかりやすいように名前を PingPongCube に変更しました。

追加するスクリプトは以下です。処理についてはコメントを参照してください。
※自己責任でご利用ください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StudyPrefabVariantCube : MonoBehaviour
{
/// <summary>
/// HP です。
/// </summary>
public int Hp = 5;
/// <summary>
/// 1 秒あたりの移動量です。
/// </summary>
public Vector3 Speed = Vector3.one;
/// <summary>
/// TurnInterval の初期値です。
/// </summary>
public float TurnIntervalInit = 1f;
/// <summary>
/// 向きを反転する時間間隔の計測値です。
/// </summary>
private float TurnInterval = 0f;
/// <summary>
/// 現在の向きです。TurnInterval ごとに反転します。
/// </summary>
float Direction = 1f;
// Start is called before the first frame update
void Start()
{
TurnInterval = TurnIntervalInit;
}
// Update is called once per frame
void Update()
{
// 指定した時間が経過したら、移動方向を逆方向に変更します。
TurnInterval -= Time.deltaTime;
if (TurnInterval < 0f)
{
Direction *= -1f;
TurnInterval = TurnIntervalInit;
}
// 移動します。
this.transform.position += Speed * Direction * Time.deltaTime;
}
}
これにより Cube ゲームオブジェクトに
- HP
- 移動方向
- 向きを反転する時間
のプロパティを持った反復移動するスクリプトがコンポーネントとして追加されました。
#Transform の角度や拡大率で説明しようとしたのですが、プレハブでも上書きされないので独自のスクリプトを用意しました。
ここからは、スクリプトのプロパティを少しずつ変更しながら、複製とプレハブインスタンスの違いを説明します。
複製したゲームオブジェクト同士の関係
複製したゲームオブジェクトは、それぞれお複製元と複製先で同じ設定を持ちますが、互いに関係性はありません。
複製の手順
シーンに配置してあるゲームオブジェクトを複製するには、 Hierarchy ウィンドウで対象のゲームオブジェクトを右クリックして、メニューから複製を選択します。
※ Ctrl + C, Ctrl + V などのコピー&ペーストでも同様に複製できます。

複製されたゲームオブジェクトは位置も含めて全て同じ設定です。

複製したゲームオブジェクト群は無関係
複製したゲームオブジェクトは、同じ設定を持ちますが、プレハブインスタンスとは異なり、 Inspector ウィンドウに Overrides はありません。
そのため、複製して増やしたゲームオブジェクトの値を修正したい場合は、1つずつ変更する必要があります。
※ Overrides については後述します。

複製したゲームオブジェクトの反復する時間を変更しても、もう一方のゲームオブジェクトに反映できないので、異なる間隔で反復するようになります。

プレハブインスタンス同士の関係
プレハブは、ゲームオブジェクトの設定をアセットとして保持し、プレハブインスタンスを作るために必要です。
Unity の Prefab (プレハブ) システムでは、1 つのゲームオブジェクトをそのすべてのコンポーネント、プロパティ値、子ゲームオブジェクトとまとめて、再利用可能なアセットとして作成、設定、保存することができます。
プレハブ – Unity マニュアル
プレハブインスタンスは、共通するプレハブを持っています。
共通するプレハブの変更が一括で反映されるので、パラメータの調整などを行う場合に手間が減ります。
プレハブとプレハブインスタンスの作成の手順
プレハブは、ゲームオブジェクトから作れます。
Hierarchy シーンのゲームオブジェクトを Project ウィンドウの任意のフォルダにドラッグ&ドロップすると、そのゲームオブジェクトの設定を持つプレハブが作成されます。
この時点で、ドラッグ&ドロップしたゲームオブジェクトも青色になりプレハブインスタンスになります。
Project ウィンドウのプレハブアセットをシーンにドラッグ&ドロップすると、同じ設定を持つプレハブインスタンスが新たに作成・配置されます。

プレハブインスタンスはプレハブを介して一括で変更できる
プレハブインスタンスの一つの値を変更しても、複製と同様に別のプレハブインスタンスには影響しません。


しかし、プレハブインスタンスの Overrides を使用することで、同じプレハブを持つプレハブインスタンスを一括で変更することができます。

Inspector ウィンドウの右上の Overrides ドロップダウンを表示して「 Apply All 」ボタンを押すと、変更がプレハブに反映され、他の同じプレハブから作成されたプレハブインスタンスの値も一括で変更されます。

同じ設定の敵キャラなどをいくつも配置して、少し HP を調整したいときなどには、プレハブを使うと複製よりも簡単に変更が行えます。
まとめ
今回は、ゲームエンジン Unity のシーンに複数の同じ敵キャラなどのゲームオブジェクトを配置する際の、複製とプレハブインスタンスの違いについて紹介しました。
プレハブインスタンスは、複数の同じプレハブを持つプレハブインスタンスの値を一括して変えられる Overrides の機能があり、多く配置する敵キャラなどのパラメータの微調整などに便利です。
参照サイト Thank You!
記事一覧 → Compota-Soft-Press
コメント