Unity

【Unity】InstantiateでPrefab生成 | 位置・回転・親オブジェクト指定

この記事について

この記事では、UnityのInstantiate()関数を使ってPrefabを生成する方法をわかりやすく解説します。
Prefabをスクリプトから動的に配置できるようになれば、弾丸発射、敵の出現、エフェクト表示などが自在に扱えるようになります。

この記事でわかること

  • Prefabの作り方と仕組み
  • Instantiate()の基本的な使い方
  • 引数による3つの生成パターン(位置・回転・親指定)

Prefabとは?

Prefab(プレハブ)は、再利用可能なオブジェクトのテンプレートです。
たとえば、同じ敵キャラやアイテムを何度も出したいとき、Prefabを使えば一度設定した状態をそのまま複製できます。

Instantiateとは?

InstantiateはPrefab(プレハブ)をシーン上にコピー(インスタンス化)する関数です。
ゲーム中に新しいオブジェクトを生成したい場合に使用します。

Instantiateの基本構文

最もシンプルな書き方は以下の通りです。

Instantiate(生成したいPrefab);

ただし、位置や回転、親オブジェクトを指定することで、より正確な制御が可能です。
Unityでは次の4パターンがよく使われます。

InstantiateでPrefabを生成

Prefab、スクリプトの準備

今回はサンプルとして以下のように準備します。

  1. 空のGameObject「Parent」を1つ作成し、Positionをすべて3に設定
  2. Cubeを作成して「Prefab(Cube)」を1つ作成し、Scaleを3に設定

これでPrefabの準備が完了です。

ここまで出来たら、ヒエラルキーの「Prefab(Cube)」をProjectビューにドラッグします。ドラッグするとオブジェクトができますね、それが「Prefab」です。

※ヒエラルキーのPrefabは不要なので削除します。

Prefabをそのまま生成

まず最も単純なケースとして、Prefabをそのまま生成する方法があります。
この場合は次のように書きます。

using UnityEngine;

public class Prefab_Instantiate : MonoBehaviour
{
    // Inspectorで指定するPrefab
    public GameObject prefab;
    // 生成されたPrefab
    public GameObject createPrefab;

    void Start()
    {
        // Prefabを生成してGameObject型変数に格納
        createPrefab = Instantiate(prefab);

        // 生成位置と回転を指定することもできる
        createPrefab.transform.position = new Vector3(0, 0, 0);
        createPrefab.transform.rotation = Quaternion.identity;
    }
}

特別な指定を行わないため、オブジェクトは原点に生成されます。
主にUI要素の一時生成や、シンプルなオブジェクトのテスト時に使われることが多い形式です。

位置と回転を指定して生成

次に、位置と回転を指定して生成する方法です。
たとえば弾丸を発射する場合や、敵キャラを決まった座標に出現させたい場合には、次のように書きます。

using UnityEngine;
using static UnityEditor.PlayerSettings;

public class Prefab_Instantiate : MonoBehaviour
{
    // Inspectorで指定するPrefab
    public GameObject prefab;
    // 生成されたPrefab
    public GameObject createPrefab;
    // 位置と回転
    private Vector3 pos;
    private Quaternion rot;

    void Start()
    {
        pos = new Vector3(-1, -1, -1);
        rot = Quaternion.Euler(45f, 0f, 0f);   // X軸を45度回転

        // Prefabを生成してGameObject型変数に格納
        createPrefab = Instantiate(prefab, pos, rot);
    }
}

実行してみると、指定した通りの位置、回転になりましたね。

親オブジェクトを指定して生成

3つ目のパターンとして、親オブジェクトを指定して生成する方法があります。
これは、UIのように階層構造が重要なオブジェクトを扱う場合や、生成したオブジェクトを特定の管理オブジェクトの子要素として整理したい場合に使われます。

Instantiate(Prefab, parentTransform);

この書き方で生成されたオブジェクトは、指定した「parentTransform」の子として配置されます。
また、位置と回転も同時に指定したい場合は次のように書きます。

using UnityEngine;
using static UnityEditor.PlayerSettings;

public class Prefab_Instantiate : MonoBehaviour
{
    // Inspectorで指定するPrefab
    public GameObject prefab;
    // 生成されたPrefab
    public GameObject createPrefab;
    // 位置と回転
    private Vector3 pos;
    private Quaternion rot;

    // 空のGameObject[Parent]
    public GameObject Obj_Parent;

    void Start()
    {
        pos = new Vector3(-1, -1, -1);
        rot = Quaternion.Euler(45f, 0f, 0f);   // X軸を45度回転

        // Prefabを生成してGameObject型変数に格納
        createPrefab = Instantiate(prefab, pos, rot, Obj_Parent.transform);
    }
}

たとえば、Canvas内にメッセージウィンドウを動的に生成する場合や、敵を特定のグループオブジェクトの配下にまとめたい場合に使用されます。

まとめ

InstantiateはPrefabをシーン上に動的に生成するための基本関数です。

  • 何も指定しない場合は原点を基準に生成される
  • 位置や回転を指定すれば思い通りの場所・角度に配置できる
  • 親オブジェクトを指定すれば、階層構造の管理も簡単

これらを理解しておくと、ゲーム中でのオブジェクト生成を柔軟に制御できるようになります。