【Unity】Instantiate関数で親を指定してオブジェクトを生成する方法

Instantiate関数で親を指定する Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityでInstantiateで生成するオブジェクトの親を指定したい!」

「親オブジェクトの中で生成したオブジェクトを管理できないの?」

というお悩みの方に向けた内容となっています。

Prefabの生成などで使われるInstantiate関数は、新たにオブジェクトを生成することができるメソッドです。

ただ、そのまま使うと、シーン配下の最上位の階層でオブジェクトが生成されることになります。

例えば、手に持たせるアイテムや、動いているステージの上に表示させる敵など、特定の親オブジェクトの中で生成したいという場合があると思います。

そこでこのページでは、Instantiate関数で生成したオブジェクトに特定の親を指定して生成する方法を紹介していきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

また、Instantiate関数については、以下の記事でもまとめていますので、参考にしてみてください。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Instantiate関数で親を指定する方法

Instantiate関数で生成するオブジェクトの親を指定する方法として、

という2つの方法があります。

Instantiateの引数に親を設定する

Instantiate関数は、引数に生成したいオブジェクトを指定しますが、第二引数に親を指定することで、特定の親の中にオブジェクトを生成することができます。

Instantiate(生成したいオブジェクト, 親オブジェクトの指定);

この親オブジェクトの指定は、Transform型で指定していく必要があります。

using UnityEngine;

public class InstantiateManager : MonoBehaviour
{
    public GameObject player;   // 元のオブジェクトを参照する変数
    public Transform parent;    // 指定する親オブジェクトを参照する変数

    void Start()
    {
        Instantiate(player, parent);   // 第二引数に親オブジェクトを指定する
    }
}

6行目でTransform型の変数をpublicで宣言して、10行目でInstantiate関数の第二引数に親オブジェクトとして指定します。

そして、スクリプトをアタッチしたオブジェクトのインスペクターウィンドウ上で、宣言した変数を探して、

その変数の右側に親にしたいオブジェクトをドラッグ&ドロップしてきます。

これで、指定した親オブジェクトの中で新たに生成することができました。

なお、Instantiate関数は、さらに第三引数にbool値を付けることで、trueであればそのオブジェクトのワールド座標を維持させるということができます。

Instantiate(生成したいオブジェクト, 親オブジェクトの指定, ワールド座標を維持させるかどうか);

生成された後に親を指定する(transform.parent)

Instantiate関数でオブジェクトが生成された後に、transform.parentで親を指定することで同じことができます。

transform.parent = 指定したい親オブジェクト;

transform.parentも、指定したい親のオブジェクトをTransform型で設定します。

using UnityEngine;

public class InstantiateManager : MonoBehaviour
{
    public GameObject player;   // 元のオブジェクトを参照する変数
    public Transform parent;    // 指定する親オブジェクトを参照する変数

    void Start()
    {
        GameObject clonePlayer = Instantiate(player);   // 生成したオブジェクトを変数に代入する
        clonePlayer.transform.parent = parent;      // 親オブジェクトを指定する
    }
}

先ほどと同じく、6行目でTransform型の変数をpublicで宣言し、Instantiate関数の実行後の11行目でtransform.parentで親の指定を行っています。

スクリプトがアタッチされているオブジェクトのインスペクターウィンドウで、Transform型の変数に親オブジェクトをドラッグ&ドロップします。

この方法でも、指定した親オブジェクトの中で生成することができました。

まとめ

このページでは、UnityのInstantiate関数で生成するオブジェクトの親を指定する方法について紹介していきましたが、いかがでしたでしょうか?

Instantiate関数で生成したオブジェクトに親を指定する場合は、

の2つの方法があります。

特定の親の中で生成して、親の移動に合わせたオブジェクトにしたい場合におすすめです。

なお、親子関係は以下のページでもまとめていますので、参考にしてみてください。

最後までお読みいただきまして、ありがとうございました!

コメント