見出し画像

Unityでオブジェクトを生成する方法|Instantiateの基本を初心者向けに解説

Unityでゲームを作っていると、

  • 弾を発射する

  • 敵を出現させる

  • コインを生成する

  • 爆発エフェクトを出す

  • UIの項目を増やす

といった処理がよく出てきます。

このように、ゲーム中にオブジェクトを新しく作る ときに使うのが Instantiate です。

この記事では、Unity初心者向けに、Instantiateの基本をやさしく整理していきます。

特に今回は、Scratchの「クローン」との違いも交えながら、

  • Instantiateとは何か

  • Prefabとは何か

  • 位置や向きを指定して生成する方法

  • 親オブジェクトを指定する方法

  • Destroyとの組み合わせ

までまとめていきます。



1.Scratchの「クローンを作る」

Scratchを使ったことがある人なら、Instantiateは 「クローンを作る」 に近い処理だと考えるとわかりやすいです。

Scratchでは、たとえば弾をたくさん出したいときに、

  • 自分自身のクローンを作る

  • クローンされたとき

  • このクローンを削除する

といったブロックを使います。

Unityでは、これに近いことを Instantiate() で行います。

ScratchとUnityの対応イメージ

ただし、UnityではScratchよりも、どこに出すか、どの向きで出すか、どの親の下に置くか まで細かく指定できます。


2.Prefabとは?

Instantiateを理解するうえで、まず知っておきたいのが Prefab(プレハブ) です。

Prefabは、簡単に言うと オブジェクトの設計図 です。

たとえば、

  • 弾のPrefab

  • 敵のPrefab

  • コインのPrefab

  • 爆発エフェクトのPrefab

  • UI項目のPrefab

などをあらかじめ作っておき、それを Instantiate() で複製して使います。

Scratchでいうと、クローン元のスプライト に近い存在です。


3.Instantiateの基本形

一番よく使う形はこれです。

Instantiate(prefab, transform.position, Quaternion.identity);

意味は、

  • 第一引数:prefab  何をを生成するか?

  • 第二引数:transform.position  どこに生成するか?

  • 第三引数:Quaternion.identity(回転なし) どの向きに生成するか?

最初はこの形を覚えておくとわかりやすいです。


4.一番基本の使い方

まずはゲーム開始時にPrefabを1つ生成するシンプルな例です。

using UnityEngine;

public class SpawnSample : MonoBehaviour
{
    public GameObject prefab;

    void Start()
    {
        Instantiate(prefab, transform.position, Quaternion.identity);
    }
}

このコードのポイント

  • public GameObject prefab;
    → InspectorからPrefabをセットできるようにしています。

  • Start()
    → ゲーム開始時に1回だけ実行されます。

  • Instantiate(prefab, transform.position, Quaternion.identity);
    → このスクリプトが付いているオブジェクトの位置にPrefabを生成します。


InspectorでPrefabをセットする

最初によくハマるのがここです。

public GameObject prefab;

と書いただけでは、まだPrefabは入っていません。
このままだと中身が空のままです。

そのため、以下手順でプレハブをセットします。

  1. ProjectビューにあるPrefabを用意する

  2. このスクリプトをGameObjectに付ける

  3. Inspectorの Prefab 欄にPrefabをドラッグ&ドロップする


5.位置を指定して生成する

5-1.自分の位置に生成する

Instantiate(prefab, transform.position, Quaternion.identity);

これは、自分自身の位置に生成する書き方です。


5-2.少しずらして生成する

たとえば弾をプレイヤーの少し前に出したいなら、位置をずらします。

Vector3 spawnPosition = transform.position + new Vector3(1f, 0f, 0f);

Instantiate(prefab, spawnPosition, Quaternion.identity);

これで、今いる位置よりX方向に1だけずらした場所に生成されます。


5-3.発射位置専用のオブジェクトから生成する

実際のゲームでは、弾やエフェクトは「プレイヤーの中心」ではなく、発射位置専用の空オブジェクト から出したいことが多いです。

using UnityEngine;

public class PlayerShot : MonoBehaviour
{
    public GameObject bulletPrefab;
    public Transform firePoint;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        }
    }
}

この firePoint に空のGameObjectをセットしておけば、そこから弾が出るようになります。


6.回転を指定して生成する

6-1.回転なしで生成する

Instantiate(prefab, transform.position, Quaternion.identity);

Quaternion.identity は、回転なし (元のPrefabのまま)という意味です。

最初のうちは、
「とりあえず回転なしで出したいときは Quaternion.identity」
と覚えておけば大丈夫です。


6-2.自分と同じ向きで生成する

Instantiate(prefab, transform.position, transform.rotation);

これなら、このスクリプトが付いているオブジェクトと同じ向きで生成されます。

たとえば、キャラクターの向きに合わせて弾を飛ばしたい場合に便利です。


7.生成したオブジェクトを変数に入れる

Instantiateは、生成したオブジェクトを返してくれます。

GameObject obj = Instantiate(prefab, transform.position, Quaternion.identity);

こうしておくと、生成したあとにそのオブジェクトへ処理を追加できます。

たとえば、名前を変えるならこうです。

GameObject obj = Instantiate(prefab, transform.position, Quaternion.identity);
obj.name = "生成したオブジェクト";

大きさを変えるならこうです。

GameObject obj = Instantiate(prefab, transform.position, Quaternion.identity);
obj.transform.localScale = new Vector3(2f, 2f, 2f);

このように、生成して終わり ではなく、生成したあとに操作する こともよくあります。


8.Destroyとセットで覚える

生成したオブジェクトをそのまま増やし続けると、シーンにどんどん残ってしまいます。

そのため、弾やエフェクトのように一時的なものは、Destroy() とセットで覚えるのがおすすめです。

GameObject obj = Instantiate(prefab, transform.position, Quaternion.identity);
Destroy(obj, 3f);

これは、生成したオブジェクトを 3秒後に削除する という意味です。

たとえば、

  • 爆発エフェクト

  • ダメージ表示

  • 一時的なエフェクト

などでよく使います。

Scratchでいうと、「このクローンを削除する」に近い考え方です。


9.親オブジェクトを指定して生成する

ここが今回のポイントの1つです。

Unityでは、生成したオブジェクトを どの親の下に置くか も指定できます。

9-1.親を指定して生成する基本形

Instantiate(prefab, parentTransform);

これで、parentTransform を親としてオブジェクトを生成できます。

たとえば、空のGameObjectを「EnemyParent」として用意しておき、その下に敵をまとめたいときに便利です。


9-2.位置・回転・親をまとめて指定する

Instantiate(prefab, transform.position, Quaternion.identity, parentTransform);

これは、

  • prefab を

  • 指定した位置に

  • 指定した回転で

  • parentTransform の子として

生成する書き方です。


9-3.親を指定する意味

親を指定すると、Hierarchyが整理しやすくなります。

たとえば、

  • 生成した敵を Enemies の子にまとめる

  • 生成した弾を Bullets の子にまとめる

  • UI項目を Content の子にまとめる

  • エフェクトを Effects の子にまとめる

といった使い方ができます。

ゲームを作っていくと、Hierarchyがぐちゃぐちゃになりやすいので、親を使って整理するのはとても大切です。

また、親の子として生成されることで、親オブジェクトの移動に合わせて生成されたオブジェクトも移動します。
例えば、Bossの周りについてくる敵などを作るときに便利です。


9-4.親を指定する実例

using UnityEngine;

public class EnemySpawner : MonoBehaviour
{
    public GameObject enemyPrefab;
    public Transform enemyParent;

    void Start()
    {
        Vector3 spawnPosition = new Vector3(0f, 0f, 0f);

        Instantiate(enemyPrefab, spawnPosition, Quaternion.identity, enemyParent);
    }
}

このコードでは、生成した敵が enemyParent の子として作られます。

Hierarchy上でも見やすくなるのでおすすめです。


9-5.UIでは親指定が特に大事

UIのオブジェクトを生成する場合、親をきちんと指定しないと、思った場所に表示されなかったり、Canvasの外に出てしまったりします。

たとえば、UI一覧の項目を増やすときは、Content の子として生成することが多いです。

using UnityEngine;

public class UIItemSpawner : MonoBehaviour
{
    public GameObject itemPrefab;
    public Transform contentParent;

    void Start()
    {
        Instantiate(itemPrefab, contentParent);
    }
}

このようにすると、生成したUI項目が contentParent の子になります。


9-6.SetParentを使う方法

一度生成してから、あとで親を設定する方法もあります。

GameObject obj = Instantiate(prefab, transform.position, Quaternion.identity);
obj.transform.SetParent(parentTransform);

ただし、UIでは位置や拡大率が思った通りにならないことがあるため、UIの場合は次のように false を付けることもよくあります。

GameObject obj = Instantiate(prefab);
obj.transform.SetParent(parentTransform, false);

これで、ローカル座標やスケールの扱いが安定しやすくなります。

初心者のうちは、

  • 普通のオブジェクトなら Instantiate(prefab, position, rotation, parent)

  • UIなら Instantiate(prefab, parent) や SetParent(parent, false)

あたりを覚えておくと使いやすいです。


10.弾を発射する実例

Instantiateの実感がつかみやすいのは、やはり弾の生成です。

発射する側のスクリプト

using UnityEngine;

public class PlayerShot : MonoBehaviour
{
    public GameObject bulletPrefab;
    public Transform firePoint;
    public Transform bulletParent;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation, bulletParent);
            Destroy(bullet, 3f);
        }
    }
}

このコードでは、

  • スペースキーを押したときに

  • firePoint の位置から

  • bulletParent の子として弾を生成し

  • 3秒後に削除しています。


弾側のスクリプト

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        transform.Translate(Vector3.right * speed * Time.deltaTime);
    }
}

これを弾Prefabに付けておけば、生成された弾が前に進みます。


11.敵をランダムな位置に生成する実例

次は敵生成の例です。

using UnityEngine;

public class RandomEnemySpawner : MonoBehaviour
{
    public GameObject enemyPrefab;
    public Transform enemyParent;

    void Start()
    {
        Vector3 spawnPosition = new Vector3(Random.Range(-5f, 5f), 0f, 0f);

        Instantiate(enemyPrefab, spawnPosition, Quaternion.identity, enemyParent);
    }
}

これで、X座標をランダムにした位置に敵が1体生成されます。

さらに発展させれば、一定時間ごとに何体も出す処理にもつなげられます。


12.まとめ

Instantiateは、ゲーム中にオブジェクトを生成するための命令 です。

Scratchの経験がある方なら、
「クローンを作る」に近いもの と考えると理解しやすいでしょう。

初心者のうちは、まず次の形を覚えておくのがおすすめです。

Instantiate(prefab, transform.position, Quaternion.identity);

そして、少し慣れてきたら、

  • 発射位置から生成する

  • 向きを指定する

  • 生成したオブジェクトを変数に入れる

  • Destroy() で消す

  • 親オブジェクトを指定してHierarchyを整理する

という流れで使えるようになると、一気にゲームらしい処理が作れるようになります。

特に親オブジェクトの指定は、Hierarchyを見やすく保つためにとても重要 です。

たとえば、

  • 弾は Bullets の子

  • 敵は Enemies の子

  • エフェクトは Effects の子

  • UI項目は Content の子

のように整理しておくと、あとから見直しやすくなります。

Instantiateは、Unityのゲーム制作で本当によく使う命令です。
ぜひ、弾・敵・アイテム・UIなど、いろいろな場面で試してみてください。


▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!