プレハブをスクリプトで複製してシーンに生成するには Instantiate() を使います。ゲーム中に敵・アイテム・エフェクトを動的に出現させる際の基本メソッドです。
このページを読み終えると、以下のことができるようになります。
Instantiate() でプレハブからオブジェクトを複製できるObject.Instantiate() — オブジェクト(プレハブを含む)を複製してシーンに追加します。
書式:Instantiate メソッド(基本)
1
public static Object Instantiate(Object original);
| パラメータ | 説明 |
|---|---|
original |
複製元のオブジェクト(プレハブまたはシーン上のオブジェクト) |
MonoBehaviour を継承したクラスの中ではクラス名を付けずに Instantiate(...) と呼び出せます。SerializeField で複製元のプレハブをフィールドに持ち、Instantiate() に渡すのが基本パターンです。
1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;
public class Spawner : MonoBehaviour
{
[SerializeField]
private GameObject _original;
private void Update()
{
// 何らかのタイミングで複製する
Instantiate(_original);
}
}
この基本形では、複製されたオブジェクトはプレハブと同じ位置・向きに生成されます(プレハブの Transform が原点設定なら原点に現れます)。
⚠️
_originalがnullのままだと実行時エラーになります。Inspector ビューから必ずプレハブを設定してください。
書式:Instantiate メソッド(位置・向き指定)
1
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
| パラメータ | 説明 |
|---|---|
original |
複製元のオブジェクト |
position |
生成先のワールド座標 |
rotation |
生成時の向き(Quaternion) |
Quaternion.identity は「回転なし(標準の向き)」を意味します。向きを変えずに位置だけ指定したい場合に使います。
1
2
// このスクリプトを持つオブジェクトの位置に生成する
Instantiate(_original, transform.position, Quaternion.identity);
スポナー(出現地点)を複数配置した場合、それぞれが持つ transform.position を渡せば、各スポナーの位置にオブジェクトを生成できます。
Instantiate() は複製したオブジェクトを戻り値で返します。受け取ることで、生成直後にコンポーネントを取得したりプロパティを変更できます。
1
2
3
var item = Instantiate(_original, transform.position, Quaternion.identity);
var rb = item.GetComponent<Rigidbody>();
rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
_original が GameObject 型のフィールドであれば、戻り値も自動的に GameObject として扱えます。
ここまでの内容をまとめた動作確認用のサンプルです。マウスの左クリックを検知して、スクリプトを持つオブジェクトの位置にプレハブを複製し、生成直後に上方向へ力を加えます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// ClickSpawner.cs
using UnityEngine;
using UnityEngine.InputSystem;
public class ClickSpawner : MonoBehaviour
{
[SerializeField]
private GameObject _original;
private void Update()
{
if (Mouse.current.leftButton.wasPressedThisFrame)
{
var obj = Instantiate(_original, transform.position, Quaternion.identity);
var rb = obj.GetComponent<Rigidbody>();
rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
}
}
}
Mouse.current.leftButton.wasPressedThisFrame は、そのフレームで左クリックが押されたときだけ true になります(Input System で解説済み)。クリックするたびにオブジェクトが1個生成され、ポンと上に飛び上がります。
Item にするItem を Project ビューへドラッグ & ドロップしてプレハブ化し、シーン上の Item は削除するClickSpawner スクリプトを作成してアタッチするItem プレハブを設定するInstantiate(original) でプレハブからオブジェクトを複製できるInstantiate(original, position, rotation) で生成位置と向きを指定できるQuaternion.identity は「回転なし」を表す定数Mouse.current.leftButton.wasPressedThisFrame でクリックをトリガーにして生成できるInstantiate(_original) の基本形でオブジェクトを生成したとき、どこに生成されますか?Quaternion.identity は何を意味しますか?_original)の Transform 設定と同じ位置・向きに生成される。プレハブが原点設定なら原点付近に生成される。Instantiate(_original, transform.position, Quaternion.identity);Quaternion の定数。GameObject の親子関係 では、Hierarchy の木構造・ローカル座標系・スクリプトでの親子操作を学び、Instantiate() と組み合わせてオブジェクトの生成・管理を整理する方法を学びます。