スポンサーリンク
Unity入門・基礎

【Unityの使い方⑲】Instantiate完全ガイド|Prefab生成・位置指定・ランダム生成まで初心者向け解説

Unity入門・基礎

Unityでゲームを作り始めると、かなり早い段階で登場するのが「Instantiate」です。

たとえば、

  • 弾を発射する
  • 敵を出現させる
  • 爆発エフェクトを表示する
  • アイテムをランダム配置する

こういった“ゲームっぽい動き”を作る時に、ほぼ必ず使います。

ただ、最初はここで混乱しやすいんですよね。

「Prefabって何?」
「Instantiateの引数が多くて分からない…」
「Quaternionって急に難しそう…」
「生成した位置がズレるのはなぜ?」

私も最初は、生成したオブジェクトが画面外に飛んでいったり、Hierarchyが大量のCloneだらけになったりして、「えっ、何が起きてるの…?」となっていました🙂

Instantiateは“とりあえずコピペで動かす”ことはできても、仕組みを理解しないまま使うと、あとからかなり混乱しやすい機能です。

特に、

  • Prefabと生成物の違い
  • positionとrotationの意味
  • 親子関係による座標の変化
  • 大量生成による負荷

このあたりは、多くの人が一度はつまずきます。

逆に言うと、ここを整理できると、Unityのゲーム制作が一気に楽しくなります。

敵スポーン、弾発射、ランダム生成、エフェクト演出など、実際のゲーム開発でよく使う形をイメージしながら、Instantiateの使い方を順番に見ていきましょう。


  1. UnityのInstantiateとは?Prefab生成の基本
    1. Instantiateは「Prefabのコピーを作る機能」
    2. Prefabとは?Instantiate前に必要な準備
    3. Instantiateの最小コード例
    4. 初心者が最初につまずくポイント
  2. Unity Instantiateの位置指定と回転方法
    1. positionとrotationを指定する基本形
    2. Quaternion.identityとは?
    3. transform.positionを使った生成例
    4. 生成位置がズレる原因
    5. まずはpositionだけ理解すればOK
  3. Unity Instantiateで親子関係を設定する方法
    1. 生成時に親を指定する書き方
    2. 親子関係を付けるメリット
    3. 親を付けると位置が変わる理由
    4. 親子設定を使うべきケース・不要なケース
  4. UnityでPrefabをランダム生成する方法
    1. Random.Rangeで位置をランダム化する
    2. Prefab配列からランダム生成する
    3. 配列とListはどう違う?
    4. 実践例|敵をランダム出現させる
    5. ランダム生成でよくあるミス
  5. Instantiate後のオブジェクトを操作する方法
    1. Instantiateの戻り値を使う理由
    2. 生成したオブジェクトの色や速度を変更する
    3. Prefab本体を変更してしまう誤解
    4. GetComponentを毎回呼ぶ問題
  6. InstantiateとDestroyは重い?最適化の考え方
    1. なぜ大量生成で重くなるのか
    2. どのくらいから危険?
    3. Object Poolingとは?
    4. 初心者がまず意識すべき最適化
  7. Unity Instantiateでよくある誤解と注意点
    1. Scene上オブジェクトとPrefabを混同する
    2. Quaternion.identityを「無効化」だと思ってしまう
    3. 親子化でTransformが崩れる
    4. Instantiateしただけで自動削除されると思っている
    5. 毎フレームInstantiateしてしまう
  8. まとめ|InstantiateはUnity開発の超重要基礎
    1. 参考情報
  9. よくある質問(FAQ)
    1. 関連記事:

UnityのInstantiateとは?Prefab生成の基本

Instantiateは、Unityで「オブジェクトを実行中に複製する」ための機能です。

ゲームを遊んでいる途中で敵が出現したり、弾が飛んだり、爆発エフェクトが表示されたりしますよね。

あれらは多くの場合、Instantiateを使ってその場で生成されています。

Instantiateは「Prefabのコピーを作る機能」

まず大事なのは、Instantiateは「新しくゼロから作る」のではなく、元になるオブジェクトをコピーするという点です。

Unityでは、この“コピー元”としてPrefabを使うのが基本になります。

イメージとしてはこんな感じです。

  • Prefab = 設計図
  • Instantiate = 設計図から実体を作る

たとえば「Enemy」というPrefabがある場合、Instantiateを実行すると、そのEnemyがゲーム中に複製されます。

だから敵を100体出したい場合でも、Prefabは1つだけ作っておけばOKなんです。

Prefabとは?Instantiate前に必要な準備

Prefabは、Unityで再利用できるオブジェクトデータです。

Hierarchy上に作成したオブジェクトを、Projectウィンドウへドラッグ&ドロップするとPrefab化できます。

初心者のうちは、この2つを混同しやすいです。

種類役割
Hierarchy上のオブジェクト今シーン内に存在している実体
Prefabコピー元になる保存データ

特に注意したいのが、「Scene上のオブジェクトを直接参照していた」というケースです。

これをやると、シーン切り替え時に参照が切れたり、「複製したいのに元オブジェクトを動かしていた」という混乱が起きやすくなります。

基本的には、InstantiateにはPrefabを使うと覚えておくと安全です。

Instantiateの最小コード例

まずは一番シンプルな形を見てみましょう。

using UnityEngine;

public class Sample : MonoBehaviour
{
    [SerializeField] GameObject prefab;

    void Start()
    {
        Instantiate(prefab);
    }
}

流れとしてはかなりシンプルです。

  1. Prefabを入れる変数を用意する
  2. InspectorでPrefabをセットする
  3. Instantiateで生成する

[SerializeField]を付けることで、InspectorからPrefabをドラッグ&ドロップできるようになります。

この設定を忘れると、NullReferenceExceptionが発生しやすいです。

Unity初心者の頃は、私も「コードは合ってるはずなのに動かない…」とかなり悩みました。
でも実際は、PrefabをInspectorに入れ忘れていただけ、ということが本当に多いんですよね。

初心者が最初につまずくポイント

Instantiateで最初にハマりやすいのは、コードの文法ミスより「参照設定ミス」です。

特によくあるのがこちらです。

  • PrefabをInspectorに設定していない
  • Scene上オブジェクトを参照している
  • 生成位置がCamera外になっている
  • Prefabが非アクティブ状態になっている

「Instantiateしたのに何も表示されない」という時は、まずInspectorとHierarchyを確認すると原因が見つかりやすいです。

Unityはコードだけではなく、Inspector設定も含めて動作するエンジンです。

なので、

  • Hierarchy
  • Inspector
  • Project

この3つをセットで確認するクセを付けると、かなりトラブルを減らせます。




Unity Instantiateの位置指定と回転方法

Instantiateは、ただ生成するだけならInstantiate(prefab)で動きます。

でも実際のゲーム開発では、「どこに生成するか」がかなり重要です。

たとえば、

  • プレイヤーの前に弾を出す
  • 敵をランダム位置にスポーンする
  • 爆発エフェクトを敵の位置に出す

こういった処理では、位置や向きを指定して生成します。

positionとrotationを指定する基本形

Instantiateには、位置と回転を指定する書き方があります。

Instantiate(prefab, position, rotation);

たとえば、プレイヤーの位置に生成する場合はこんな感じです。

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

この3つには、それぞれ役割があります。

引数役割
prefab生成するPrefab
position生成位置
rotation生成時の向き

初心者のうちは、まず「positionで場所を決める」と覚えればOKです。

Quaternion.identityとは?

Unity初心者がかなり高い確率で止まるのが、このQuaternionです。

急に数学っぽく見えるので、ちょっと身構えますよね。

ただ、最初は深く考えなくても大丈夫です。

Quaternion.identity

これは、「回転なし」を意味します。

つまり、Prefabが元々持っている向きのまま生成する、ということです。

たとえば弾を真上に向けたい場合などは、あとからrotationを指定して調整します。

逆に、まだ回転を理解していない段階なら、まずはQuaternion.identityを使っておくと混乱しにくいです。

transform.positionを使った生成例

一番よく使うのが、現在位置を使った生成です。

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

この場合、スクリプトが付いているオブジェクトの位置にPrefabが生成されます。

実際のゲームでは、こんな使い方が多いです。

  • プレイヤー位置にエフェクト生成
  • 敵の位置にダメージ表示
  • 銃口位置に弾を生成

特に弾発射では、生成位置が少しズレるだけでかなり違和感が出ます。

なので実務では、

  • 発射口専用のTransformを作る
  • 空オブジェクトを生成位置にする

という形がよく使われます。

生成位置がズレる原因

Instantiateでありがちなのが、「なぜか変な位置に出る問題」です。

特に多いのはこの3つです。

  • localPositionとpositionを混同している
  • 親子関係の影響を受けている
  • Prefab自体の座標がズレている

positionはワールド座標です。

つまり、「シーン全体での位置」を意味します。

一方、localPositionは親オブジェクト基準になります。

この違いを知らないと、親子化した瞬間に位置が飛ぶことがあります。

「コードは合ってるのに場所がおかしい」という時は、Transformの値を確認すると原因が見つかりやすいです。

まずはpositionだけ理解すればOK

Instantiateは覚えることが多そうに見えますが、最初から全部理解する必要はありません。

まずは、

  • Prefabを用意する
  • positionを指定する
  • Quaternion.identityを使う

ここまでできれば、かなり多くのゲーム要素を作れます。

rotationやQuaternionを本格的に使うのは、FPSや3Dアクションを作り始めてからでも十分間に合います。

Unityは、一気に全部理解しようとすると頭がパンクしやすいので、実際に動かしながら少しずつ覚えるのがかなりおすすめです。

Unityの教科書 Unity 6完全対応版
✅ Amazonでチェックする✅ 楽天でチェックする




Unity Instantiateで親子関係を設定する方法

Instantiateでは、生成と同時に「どのオブジェクトの子にするか」も指定できます。

これを使うと、Hierarchyを整理しやすくなったり、UIやエフェクト管理がかなり楽になります。

ゲーム規模が大きくなるほど重要になる考え方なので、早めに慣れておくと後から助かります。

生成時に親を指定する書き方

親を指定する基本形はこちらです。

Instantiate(prefab, parentTransform);

たとえば、Effectsという空オブジェクトの子として生成する場合はこんな感じです。

Instantiate(effectPrefab, effectsParent);

これを使うと、Hierarchy内で生成物が整理されます。

特にエフェクトやUIは、Hierarchyが散らかりやすいのでかなり便利です。

親子関係を付けるメリット

親子化には、単なる整理以上のメリットがあります。

  • 親移動に合わせて子も動く
  • 一括で削除・非表示にできる
  • Hierarchyが見やすくなる

たとえば、敵の頭上にHPバーを表示する場合。

HPバーを敵オブジェクトの子にしておけば、敵が移動しても自然に追従します。

逆に親子化していないと、毎フレーム座標同期が必要になることもあります。

Unityでは「Transformの親子関係」を活用すると、コード量をかなり減らせるんです。

親を付けると位置が変わる理由

初心者がかなり混乱しやすいのがここです。

「生成した瞬間に位置がズレた…」という現象ですね。

これは多くの場合、positionlocalPositionの違いが原因です。

  • position = シーン全体での位置
  • localPosition = 親基準での位置

親を持つと、Transformは親基準で扱われる部分が増えます。

そのため、親オブジェクトに移動・回転・Scaleが入っていると、見た目の位置が変わることがあります。

特にUIでは、この問題がかなり起きやすいです。

「思った場所に出ない」と感じたら、まず親オブジェクトのTransformを確認してみてください。

親子設定を使うべきケース・不要なケース

親子化は便利ですが、何でも親に入れればいいわけではありません。

よく使われるケースはこちらです。

ケース親子化
UIかなり使う
エフェクトよく使う
敵の頭上表示便利
不要なことが多い

特に弾は、発射後に独立して動くことが多いので、親子化しないケースが一般的です。

逆に、親に追従してほしいものは親子化との相性がかなり良いです。

「そのオブジェクトは親と一緒に動くべきか?」

これを基準に考えると、判断しやすくなります。




UnityでPrefabをランダム生成する方法

ゲームを作っていると、「毎回同じ場所・同じ敵」だと単調に感じる場面が出てきます。

そんな時によく使うのが、ランダム生成です。

Instantiateとランダム処理を組み合わせることで、

  • 敵をランダム出現させる
  • アイテムをランダム配置する
  • 毎回違うPrefabを生成する

といった“ゲームらしい動き”を作れるようになります。

Random.Rangeで位置をランダム化する

Unityでは、Random.Rangeを使うことでランダム値を取得できます。

たとえば、X座標をランダム化してPrefabを生成するならこんな感じです。

float randomX = Random.Range(-5f, 5f);

Vector3 spawnPosition = new Vector3(randomX, 0f, 0f);

Instantiate(prefab, spawnPosition, Quaternion.identity);

この場合、X座標が-5〜5の範囲でランダムになります。

敵スポーンやアイテム配置ではかなり定番の形です。

ちなみに、

  • float版 → 小数あり
  • int版 → 整数のみ

という違いがあります。

最初は「どっち使うんだっけ…」となりやすいので、位置ならfloatを使うことが多い、と覚えると整理しやすいです。

Prefab配列からランダム生成する

「敵Aだけ」ではなく、複数のPrefabからランダム生成したい場面もかなり多いです。

そんな時は配列を使います。

[SerializeField] GameObject[] prefabs;

void Start()
{
    int randomIndex = Random.Range(0, prefabs.Length);

    Instantiate(prefabs[randomIndex],
                Vector3.zero,
                Quaternion.identity);
}

このコードでは、配列に入っているPrefabの中から1つをランダム選択しています。

実際のゲームでは、

  • 敵種類をランダム化
  • ランダムアイテム出現
  • エフェクト切り替え

などでかなりよく使われます。

特にローグライク系やシューティングでは、頻出テクニックですね。

配列とListはどう違う?

ここで少し混乱しやすいのが、配列とListです。

最初は「どっち使えばいいの?」となりますよね。

ざっくり整理するとこんな感じです。

種類特徴
配列要素数固定
List後から追加・削除しやすい

ただ、Instantiateの基礎を学ぶ段階なら、まずは配列だけ理解すれば十分です。

特にInspectorからPrefabを登録する用途では、配列はかなり扱いやすいです。

実践例|敵をランダム出現させる

実際によくあるのが、「一定範囲に敵をスポーンする処理」です。

[SerializeField] GameObject enemyPrefab;

void SpawnEnemy()
{
    float x = Random.Range(-8f, 8f);
    float z = Random.Range(-8f, 8f);

    Vector3 spawnPos = new Vector3(x, 0f, z);

    Instantiate(enemyPrefab,
                spawnPos,
                Quaternion.identity);
}

この形をベースにすると、かなり多くのゲームへ応用できます。

たとえば、

  • スポーン間隔を追加する
  • 敵種類を増やす
  • 出現数を制限する

などを足していくと、実際のゲームシステムに近づいていきます。

ランダム生成でよくあるミス

ランダム生成では、いくつか初心者がハマりやすいポイントがあります。

  • 配列Indexが範囲外になる
  • Prefab未設定でNullになる
  • 床の外に生成される
  • 敵同士が重なる

特に多いのが、Random.Rangeの範囲ミスです。

配列では、

Random.Range(0, prefabs.Length)

という形をかなりよく使います。

Length - 1を書くべきか迷う人も多いですが、int版のRandom.Rangeは「最大値を含まない」仕様です。

つまり、prefabs.LengthのままでOKなんです。

この仕様はかなり混乱しやすいので、私も最初は何度もIndexエラーを出していました🙂




Instantiate後のオブジェクトを操作する方法

Instantiateは「生成して終わり」ではありません。

実際のゲームでは、生成した直後に、

  • 色を変える
  • 速度を設定する
  • ダメージ値を渡す
  • 向きを変更する

といった処理を行うことがかなり多いです。

その時に重要になるのが、「生成されたオブジェクトの参照」を持つことです。

Instantiateの戻り値を使う理由

Instantiateは、生成したオブジェクトを戻り値として返します。

つまり、こんな書き方ができます。

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

このcloneには、「生成された新しいオブジェクト」が入っています。

ここがかなり重要です。

初心者の頃は、「Prefabを操作している」のか「生成物を操作している」のか混乱しやすいんですよね。

でも実際に変更したいのは、ほとんどの場合「生成された側」です。

生成したオブジェクトの色や速度を変更する

たとえば、生成後に色を変更するならこんな形になります。

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

Renderer renderer =
    clone.GetComponent<Renderer>();

renderer.material.color = Color.red;

これで、生成されたオブジェクトだけ赤色になります。

また、Rigidbodyを使えば速度も設定できます。

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

Rigidbody rb =
    clone.GetComponent<Rigidbody>();

rb.linearVelocity = transform.forward * 10f;

弾発射ではかなりよく使う形ですね。

「生成 → Rigidbody取得 → velocity設定」は、Unityで何度も見る定番パターンです。

Prefab本体を変更してしまう誤解

Instantiate初心者でかなり多いのが、この勘違いです。

たとえば、こんなコード。

prefab.transform.position = Vector3.zero;

これを見ると、「生成したオブジェクトを動かしている」と思いやすいです。

でも実際には、prefab変数が指している“元データ”側を触っています。

そのため、

  • 意図しない位置変更
  • 参照混乱
  • Prefab管理の崩壊

が起きやすくなります。

基本的には、Instantiate後の戻り値を操作するクセを付けると安全です。

「Prefabを触る」のではなく、「生成されたCloneを触る」。

ここを整理できると、かなり理解が進みます。

GetComponentを毎回呼ぶ問題

少し中級者寄りの話になりますが、Instantiate後に毎回GetComponentを呼びすぎると、処理負荷が増えることがあります。

特に大量生成するゲームでは注意が必要です。

たとえば弾幕ゲームなどで、

  • 毎秒大量Instantiate
  • 毎回GetComponent
  • 毎回Destroy

を繰り返すと、GC(ガベージコレクション)負荷が増えやすくなります。

ただ、最初の段階では必要以上に怖がらなくて大丈夫です。

まずは「ちゃんと動く」ことが大切ですし、Unity初心者のうちは可読性を優先した方が学習しやすいです。

そのうえで、

  • 同じComponentを何度も取得している
  • 毎秒大量生成している
  • モバイルで重くなってきた

こういったタイミングで最適化を考えると、かなり自然にステップアップできます。




InstantiateとDestroyは重い?最適化の考え方

Instantiateを使い始めると、どこかでよく聞くのがこの話です。

「Instantiateは重い」

Unity初心者だと、「えっ、じゃあ使わない方がいいの?」と不安になりますよね。

でも実際は、“使い方次第”というのがかなり大事です。

普通のゲーム規模なら問題ないケースも多いので、必要以上に怖がらなくて大丈夫です。

なぜ大量生成で重くなるのか

Instantiateでは、オブジェクトを新しくメモリ上に作成します。

さらにDestroyすると、不要になったデータを後からGC(ガベージコレクション)が掃除します。

つまり、

  • 生成
  • 削除
  • メモリ整理

が大量発生すると、CPU負荷やメモリ負荷が増えやすくなります。

特に問題になりやすいのは、毎秒大量生成するケースです。

  • 弾幕シューティング
  • 大量パーティクル
  • 敵ラッシュ
  • 高速連射武器

このあたりは、Instantiate/Destroyの回数がかなり増えます。

逆に、数秒に1回敵を出す程度なら、大きな問題にならないことも多いです。

どのくらいから危険?

「何個から危険ですか?」という疑問はかなり多いです。

ただ、これはゲーム内容や端末性能によってかなり変わります。

たとえば、

  • PC向けゲーム
  • モバイルゲーム
  • 2D
  • 3D
  • 軽量モデル
  • 高負荷VFX

これだけでも条件がかなり変わります。

なので実務では、“数”より「症状」で判断することが多いです。

たとえば、こんな状態は注意サインです。

  • 急にカクつく
  • 一定間隔で止まる
  • Hierarchyが大量Cloneだらけ
  • GC.Allocが増えている

特にモバイルでは、PCより早めに負荷が表面化しやすいです。

Object Poolingとは?

そこでよく使われるのが、Object Pooling(オブジェクトプーリング)です。

これは簡単に言うと、

「Destroyせず再利用する仕組み」

です。

通常の流れはこんな感じですよね。

Instantiate → 使用 → Destroy

でもPoolingでは、Destroyせず非アクティブ化して再利用します。

生成 → 使用 → 非表示 → 再利用

これによって、Instantiate/Destroy回数を大きく減らせます。

弾幕ゲームや大量エフェクトでは、かなり定番の最適化です。

初心者がまず意識すべき最適化

ここはかなり大事なのですが、Unity初心者の段階では、最初から最適化だけを気にしすぎなくてOKです。

私も最初の頃は、「Instantiateは重いらしい」と聞いて、逆に何も作れなくなっていました。

でも実際は、まず動くものを作る方が圧倒的に重要です。

そのうえで、

  • 大量生成するようになった
  • フレーム落ちし始めた
  • Profilerで負荷が見えた

この段階でPoolingや最適化を考えると、かなり理解しやすいです。

Unityは「まず作る → 問題が出たら改善する」の順で学ぶと、知識がかなり定着しやすいですよ。




Unity Instantiateでよくある誤解と注意点

Instantiateは便利ですが、初心者がかなり同じ場所でつまずきやすい機能でもあります。

しかも、エラーが出ないまま挙動だけおかしくなるケースも多いんですよね。

ここでは、特に混乱しやすいポイントを整理しておきます。

Scene上オブジェクトとPrefabを混同する

かなり多いのが、「Scene上のオブジェクト」と「Prefab」を同じ感覚で扱ってしまうケースです。

たとえば、Hierarchy内の敵オブジェクトをそのまま参照していると、

  • シーン切り替えで参照切れ
  • 元オブジェクトを直接移動
  • 意図しない状態共有

などが起きやすくなります。

Instantiateの基本は、Project内のPrefabをコピーする形です。

「Prefabは設計図」「Hierarchyは実体」

この区別ができると、かなり整理しやすくなります。

Quaternion.identityを「無効化」だと思ってしまう

Quaternion.identityを、「rotationを使わない設定」だと思ってしまう人も多いです。

でも実際は、「回転なし」という意味です。

つまり、

Quaternion.identity

は、“初期状態の向き”で生成する指定になります。

「rotationを省略するための魔法」ではないんですね。

このあたりは、Quaternionという単語が急に出てくるので、かなり混乱しやすい部分です。

最初は「向きを指定するための型」と覚えておけば十分です。

親子化でTransformが崩れる

Instantiate後に親子化すると、位置やScaleが崩れることがあります。

特にありがちなのがこちらです。

  • UIサイズが巨大化
  • 位置がズレる
  • 回転がおかしくなる

これは多くの場合、親側のTransformの影響です。

たとえば親のScaleが2倍なら、子にも影響が入ります。

「生成した瞬間に変になった」という時は、Prefab側ではなく親側を確認すると原因が見つかることがかなり多いです。

Instantiateしただけで自動削除されると思っている

Instantiateしたオブジェクトは、基本的に自動削除されません。

つまり、生成したままだとシーン内に残り続けます。

なので、不要になったらDestroyが必要です。

Destroy(gameObject);

これを忘れると、

  • Hierarchyが増殖
  • メモリ使用量増加
  • パフォーマンス低下

につながることがあります。

特にエフェクトや弾は、削除忘れがかなり起きやすいです。

毎フレームInstantiateしてしまう

Unity初心者でかなり多いのが、Update内でInstantiateしてしまうケースです。

void Update()
{
    Instantiate(prefab);
}

これを実行すると、毎フレーム大量生成されます。

PCによっては、一瞬でHierarchyが大惨事になります🙂

もちろん、意図的に大量生成するケースもあります。

ただ、通常は

  • キー入力時
  • 一定時間ごと
  • イベント発生時

など、条件を付けて生成することがほとんどです。

「Instantiateはいつ実行されるのか」ここを意識すると、かなり事故を防ぎやすくなります。




まとめ|InstantiateはUnity開発の超重要基礎

Instantiateは、Unityで「ゲームらしい動き」を作るために欠かせない機能です。

敵出現、弾発射、エフェクト、アイテム生成など、実際のゲーム開発では本当にいろいろな場面で使われます。

最初は、

  • Prefabって何?
  • Quaternionって難しそう…
  • なぜ位置がズレるの?

と混乱しやすいのですが、まずは次の流れを理解できれば十分です。

  1. Prefabを作る
  2. Instantiateで生成する
  3. positionで場所を指定する
  4. 戻り値で生成物を操作する

ここまでできるだけでも、かなり多くのゲーム要素を作れるようになります。

特に大切なのは、「Prefab」と「生成されたオブジェクト」を分けて考えることです。

この感覚が身に付くと、Unityの構造がかなり整理しやすくなります。

また、中級者以降になると、

  • Object Pooling
  • GC負荷
  • 大量生成の最適化
  • 生成管理設計

なども重要になってきます。

ただ、最初から全部を完璧に理解する必要はありません。

私も初心者の頃は、毎フレームInstantiateしてHierarchyを大惨事にしたり、Quaternionを見ただけでブラウザ検索を始めたりしていました🙂

でも、実際に手を動かしているうちに、「あ、このためにpositionを使うのか」「だから戻り値を保存するのか」と少しずつ繋がっていったんです。

Unityは、“動かしながら理解する”のがかなり大事なエンジンです。

ぜひ、

  • 弾を飛ばす
  • 敵をランダム生成する
  • エフェクトを出す

など、小さいゲーム要素を実際に作りながらInstantiateに慣れてみてください。

「ゲームが動いた!」という感覚を味わえる瞬間が、一気に増えていきますよ。

参考情報

  • Unity公式ドキュメント(Object.Instantiate)
  • Unity Learn
  • Unity公式 Object Pooling チュートリアル

よくある質問(FAQ)

Q
InstantiateしたPrefabが表示されません
A

Instantiate初心者でかなり多い悩みです。

コード自体は正しくても、表示されない原因はいくつかあります。

まず確認したいのはこちらです。

  • 生成位置がCamera外
  • Prefabが非アクティブ
  • Scaleが0になっている
  • Rendererが無効
  • 生成後すぐDestroyされている

特に多いのは「座標問題」です。

Hierarchyには生成されているのに見えない場合は、Transformのpositionを確認すると原因が見つかりやすいです。

Sceneビューで選択してみると、「めちゃくちゃ遠くにいた…」ということもよくあります🙂

Q
Instantiateしたオブジェクトを消すには?
A

生成したオブジェクトは、自動では消えません。

不要になったらDestroyを使います。

Destroy(gameObject);

たとえば、3秒後に削除したい場合はこう書けます。

Destroy(gameObject, 3f);

これはエフェクトや弾などでかなりよく使います。

Destroyを忘れると、Hierarchyに大量のCloneが残り続けることがあります。

特にテスト中は気づきにくいので、Hierarchyを時々確認すると安全です。

Q
InstantiateとSetActiveはどう違う?
A

この2つはかなり混同されやすいです。

機能役割
Instantiate新しく生成する
SetActive表示/非表示を切り替える

つまり、Instantiateは「新しい実体を増やす」処理です。

一方、SetActiveは「既に存在するオブジェクト」をON/OFFしているだけです。

Object Poolingでは、このSetActiveをかなりよく使います。

gameObject.SetActive(false);

こうすることでDestroyせず再利用できます。

最初は「全部Instantiateでいいのでは?」と思いやすいですが、ゲーム規模が大きくなると、生成済みオブジェクトを再利用する場面が増えていきます。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク