UnityUnityメモ

【Unity】複数のprefabからランダムに選んで生成したい

Unity

1. はじめに

ゲーム開発では、プレイヤーの体験をより面白くするために「ランダムな要素」がよく使われます。特に、ランダムなオブジェクト生成は、敵キャラの出現やアイテムの配置、背景の変化など、さまざまな場面で活用されています。

例えば:

  • 敵キャラのスポーン:一定時間ごとに異なる敵を出現させる
  • アイテムの配置:ランダムな場所にパワーアップアイテムやコインを配置する
  • 背景オブジェクトの変化:ランダムに木や岩を配置して、マップにバリエーションを持たせる

こうしたランダムなオブジェクト生成を実現するために、Unityでは Prefab(プレファブ) という機能を使います。Prefabを使うことで、一度作ったオブジェクトを何度でも再利用でき、スクリプトを使って自由に配置や動きを制御することができます。

本記事で学べること

この記事では、以下のことを学びながら、ランダムなオブジェクト生成の方法を身につけていきます。 ✅ Prefabを作成する方法(再利用可能なオブジェクトを作る)
スクリプトでPrefabをランダムに生成する方法(ランダムなオブジェクト出現)
簡単なC#スクリプトでオブジェクトを動かす方法(前方向に移動させる)

この方法をマスターすれば、ゲーム開発で敵キャラをランダムに出現させたり、アイテムをランダムに配置したりできるようになります!
それでは、実際にUnityを使って、ランダムなオブジェクト生成に挑戦していきましょう!




2. 事前準備

それでは、Unityでランダムにオブジェクトを生成するための準備を進めていきましょう。
まずは、新しいUnityプロジェクトを作成し、必要なオブジェクト(スフィア)を作成して、それぞれ異なる色を設定していきます。


Unityプロジェクトの作成

  1. Unityを開く
    Unity Hubを開き、「新しいプロジェクト」をクリックします。
  2. 3Dプロジェクトを作成
    テンプレートの一覧から 「3D (URPなし)」 を選び、プロジェクト名を 「RandomPrefabGenerator」 などと設定し、作成ボタンを押します。
  3. プロジェクトが開いたら準備完了!
    これで、ランダムなオブジェクト生成の準備を進めることができます。

必要なオブジェクト(スフィア)の作成

次に、ランダムに生成するオブジェクトを作ります。今回は、異なる色の**スフィア(球体)**を3つ用意します。

  1. スフィアの作成
    • Unityの上部メニューから 「GameObject」→「3D Object」→「Sphere」 を選びます。
    • すると、シーン内にスフィアが1つ作成されます。
  2. スフィアを3つ複製
    • 作成したスフィアを選択した状態で Ctrl + D(Macなら Cmd + D)を押すと複製されます。
    • この操作を2回繰り返し、合計3つのスフィアを用意してください。

マテリアルを使って異なる色を設定

それぞれのスフィアに異なる色を付けるために、マテリアル(Material) を作成します。

  1. 新しいマテリアルの作成
    • プロジェクトウィンドウ(Project)「Assets」フォルダ を開き、右クリック →「Create」→「Material」 を選びます。
    • 作成されたマテリアルの名前を 「RedMaterial」 に変更しましょう。
    • Inspectorウィンドウ で「Albedo」カラーを 赤色 に設定します。
  2. 異なる色のマテリアルを3つ作成
    • 同じ手順で 「BlueMaterial」「GreenMaterial」 も作り、それぞれ青と緑の色に設定します。
  3. スフィアにマテリアルを適用
    • シーン内のスフィアを1つ選択 し、「Inspector」ウィンドウの「Mesh Renderer」コンポーネントの「Material」欄 に、作成したマテリアルをドラッグ&ドロップします。
    • この操作を繰り返し、それぞれのスフィアに 異なる色のマテリアル を設定してください。

ここまでのまとめ

✅ Unityの新規プロジェクトを作成した
✅ 3つのスフィアを用意した
✅ 異なる色のマテリアルを作成し、それぞれのスフィアに適用した

これで、ランダムに生成するオブジェクトの準備が整いました!
次のステップでは、これらのスフィアがスクリプトを使って前方向に飛んでいく方法を解説していきます。




3. スフィアを動かすスクリプトを作成

次に、作成したスフィアが前方向に飛んでいくようにスクリプトを追加していきます。


スクリプトの作成

スフィアを前に移動させるスクリプトを作りましょう。

  1. スクリプトの作成
    • プロジェクトウィンドウ(Project)右クリック →「Create」→「C# Script」 を選びます。
    • スクリプトの名前を 「Sphere」 に変更します。
  2. スクリプトの編集
    • 作成したスクリプトをダブルクリックすると、コードエディタ(Visual Studio など) が開きます。
    • 以下のコードを入力してください。
using UnityEngine;

public class Sphere : MonoBehaviour
{
    void Update()
    {
        transform.Translate(Vector3.forward * 0.05f);
    }
}
  1. スクリプトを保存
    • コードを入力したら、Ctrl + S(Macなら Cmd + S でスクリプトを保存します。

スクリプトをスフィアに適用

次に、作成したスクリプトを3つのスフィアに適用します。

  1. スクリプトをアタッチ
    • プロジェクトウィンドウ(Project) から 「Sphere」スクリプト を探します。
    • 3つのスフィアそれぞれに、スクリプトをドラッグ&ドロップ して適用してください。
  2. 動作確認
    • ゲームを再生(ボタンをクリック)すると、スフィアが前方向に移動するのが確認できます。

ここまでのまとめ

スクリプトを作成してスフィアを前方向に移動させる処理を追加した
スクリプトを3つのスフィアに適用し、動作を確認した

これで、ランダムに生成するスフィアが動く準備が整いました!
次は、スフィアをPrefab(プレファブ) に変換して、スクリプトでランダムに生成する方法を解説していきます。




4. スフィアをPrefab化する

前のステップで作成した3つのスフィアを Prefab(プレファブ) に変換していきます。
Prefabを使うことで、シーン上に手動でオブジェクトを配置する必要がなくなり、スクリプトを使って簡単に再利用・管理ができるようになります。


Prefabとは?

Prefab(プレファブ)とは、Unityで作成したゲームオブジェクトを 再利用可能なテンプレート として保存できる機能です。
例えば、敵キャラやアイテムなどをPrefabにしておけば、スクリプトで何度でも自由に生成 することができます。

Prefabを使うメリット

オブジェクトを一括管理できる
 Prefabを修正すると、シーン内のすべてのインスタンスに変更が反映されます。

スクリプトで自由に生成できる
 手動で配置しなくても、スクリプトから Instantiate() を使ってオブジェクトを生成できます。

効率的にオブジェクトを扱える
 同じオブジェクトを複数配置するときに、シーンが煩雑にならず、プロジェクトの管理が楽になります。


3つのスフィアをPrefabにする手順

それでは、作成した3つのスフィアをPrefabに変換していきましょう。

1. Prefab用のフォルダを作成

  1. 「Project」ウィンドウ を開きます。
  2. 「Assets」フォルダ内で 右クリック → 「Create」→「Folder」 を選び、新しいフォルダを作成します。
  3. フォルダ名を 「Prefabs」 に変更しましょう。

2. スフィアをPrefabに変換

  1. シーン内のスフィアを1つ選択します。
  2. 「Project」ウィンドウの「Prefabs」フォルダにドラッグ&ドロップ します。
  3. すると、スフィアがPrefabに変換され、青色のアイコン になります。
  4. 同じ手順で、残りの2つのスフィアもPrefabに変換 します。

3. シーン上のスフィアを削除

Prefabとして保存されたので、シーン内に配置していたスフィアは不要になります。
シーン上のスフィアをすべて削除しておきましょう。


ここまでのまとめ

Prefabの概要とメリットを理解した
3つのスフィアをPrefab化した
シーン上のスフィアを削除した

これで、スクリプトを使って ランダムにスフィアを生成する準備 が整いました!
次のステップでは、C#スクリプトを作成し、1秒ごとにランダムなスフィアを生成する方法を解説していきます。




5. スクリプトでスフィアをランダム生成する

これまでに作成した3つのスフィアのPrefabをスクリプトでランダムに生成 してみましょう。
ここでは、C#スクリプトを作成し、Instantiate() を使ってランダムにPrefabを選ぶ方法を解説します。


C#スクリプトの作成

まずは、新しいスクリプトを作成し、スフィアをランダムに生成する処理を書いていきます。

  1. 「Project」ウィンドウの「Assets」フォルダ を開きます。
  2. 右クリック → 「Create」→「C# Script」 を選択します。
  3. スクリプト名を 「GameManager」 に変更します。
  4. スクリプトをダブルクリック して開き、以下のコードを入力してください。
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public GameObject[] Prefabs; // 生成するPrefabの配列
    private float time = 1.0f; // 生成間隔(1秒ごと)
    private int number; // ランダムに選ばれるPrefabのインデックス

    void Update()
    {
        time -= Time.deltaTime; // タイマーを減らす

        if (time <= 0.0f) // タイマーが0になったら
        {
            time = 1.0f; // タイマーをリセット
            number = Random.Range(0, Prefabs.Length); // 配列からランダムにPrefabを選ぶ
            Instantiate(Prefabs[number], new Vector3(0, 0, 0), Quaternion.identity); // 選ばれたPrefabを生成
        }
    }
}

スクリプトの解説

このスクリプトでは、以下のような処理を行っています。

Prefabを配列(Prefabs)で管理
1秒ごとにPrefabの配列からランダムに1つ選択
選ばれたPrefabをInstantiate()で生成


Instantiate() を使用してランダムにPrefabを選ぶ方法

Unityでは、Instantiate() を使うことで、Prefabをシーン内に生成できます。

Instantiate(Prefabs[number], new Vector3(0, 0, 0), Quaternion.identity);

このコードでは、以下の処理を行っています。

  1. Prefabs[number] → ランダムに選ばれたPrefabを取得
  2. new Vector3(0, 0, 0) → 生成する位置(原点)を指定
  3. Quaternion.identity → 回転なし(デフォルトの状態で生成)

Random.Range() を使ってランダム要素を追加

Random.Range(0, Prefabs.Length) を使うことで、配列の要素数に応じたランダムな数値 を取得できます。

number = Random.Range(0, Prefabs.Length);

このコードは、0 から Prefabs.Length - 1 の範囲でランダムな整数を取得し、それをnumber に代入しています。
このnumberを使って、配列からランダムにPrefabを選択 しています。


ここまでのまとめ

C#スクリプトを作成した
Instantiate() を使ってPrefabを生成する方法を学んだ
Random.Range() を使ってランダムにPrefabを選ぶ方法を理解した

次のステップでは、このスクリプトを 空のGameObjectにアタッチして動作を確認 していきます!




5. スクリプトの適用と動作確認

ここまでで、ランダムにスフィアを生成するスクリプトを作成しました。
次は、このスクリプトを実際に適用し、ゲームを実行して動作を確認 していきます。


GameManager オブジェクトの作成

スクリプトを適用するために、空のGameObject を作成し、その中にスクリプトをアタッチします。

  1. Hierarchy(ヒエラルキー)ウィンドウを開く
  2. 右クリック → 「Create Empty」 を選択し、新しい空のオブジェクトを作成
  3. 作成したオブジェクトの名前を 「GameManager」 に変更する

スクリプトのアタッチ方法

作成した「GameManager」オブジェクトに、先ほど作成した GameManagerスクリプト をアタッチします。

  1. 「Project」ウィンドウで「GameManager」スクリプトを選択
  2. 「Hierarchy」ウィンドウの「GameManager」オブジェクトにドラッグ&ドロップ

これで、スクリプトがGameManagerオブジェクトに適用されました。


PrefabをInspectorに登録

スクリプトの Prefabs 配列に、作成したスフィアのPrefabを登録します。

  1. GameManagerオブジェクトを選択
  2. Inspectorウィンドウで「GameManager (Script)」コンポーネントを確認
  3. 「Prefabs」というリストが表示されるので、サイズを「3」に設定
  4. 「Project」ウィンドウの「Prefabs」フォルダから3つのスフィアPrefabを、それぞれのスロットにドラッグ&ドロップ

ゲーム実行時の動作確認

すべての設定が完了したら、ゲームを実行してランダム生成の動作を確認 します。

  1. 「再生(▶)ボタン」をクリックしてゲームを開始
  2. 画面の中央に、1秒ごとにランダムな色のスフィアが生成される ことを確認する
  3. スクリプトの処理が正しく動作しているかチェック

問題がある場合のチェックポイント

スフィアが生成されない → Prefabが Prefabs 配列に正しく登録されているか確認
エラーメッセージが出る → スクリプト内の変数が正しく設定されているか確認
スフィアが同じ位置に積み重なるInstantiate() の座標を変更してランダムな位置にする


ここまでのまとめ

GameManagerオブジェクトを作成し、スクリプトをアタッチした
PrefabをInspectorに登録してスクリプトで使用できるようにした
ゲームを実行し、ランダムなスフィア生成の動作を確認した

これで、スクリプトを使ってランダムにPrefabを生成する方法 を習得しました!
次のステップでは、応用として 生成位置や間隔を変更する方法 についても紹介していきます。




6. まとめ

これまでのステップで、Unityを使って 複数のPrefab(スフィア)をランダムに生成する方法 を学びました。
最後に、この記事で学んだ内容を振り返り、さらに応用できるポイント を紹介します。


学んだことの復習

Prefabの作成と管理方法
 - ゲームオブジェクト(スフィア)を作成し、マテリアルを適用
 - オブジェクトをPrefab化して再利用しやすくする

スクリプトでランダムにPrefabを生成する方法
 - Instantiate() を使ってPrefabを生成
 - Random.Range() でランダムなPrefabを選択

GameManagerでスクリプトを適用する方法
 - 空のオブジェクトにスクリプトをアタッチ
 - InspectorでPrefabを登録し、動作を確認

この記事を通じて、Unityでランダムなオブジェクト生成の基礎をしっかり理解できたと思います!


応用:ランダム生成のバリエーション

今回のスクリプトを応用すれば、ゲームの演出やシステムをさらに発展 させることができます。
いくつかの改良ポイントを紹介するので、試してみましょう!

① 生成位置をランダムに変更

現在のスクリプトでは、スフィアが 常に同じ位置(0,0,0) に生成されています。
これを変更して、ランダムな位置にスフィアを生成 することもできます。

▼ 例:ランダムな位置にスフィアを生成

Vector3 spawnPosition = new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5));
Instantiate(Prefabs[number], spawnPosition, Quaternion.identity);

こうすることで、スフィアが X軸 -5〜5、Z軸 -5〜5の範囲内 にランダムで出現します。


② 生成間隔を変更

現在は 1秒ごと にスフィアが生成されていますが、間隔をランダム にすることも可能です。

▼ 例:ランダムな時間間隔で生成

private float spawnInterval = 1.0f;

void Update()
{
time -= Time.deltaTime;

if (time <= 0.0f)
{
time = Random.Range(0.5f, 2.0f); // 0.5秒~2秒の間でランダムに生成
number = Random.Range(0, Prefabs.Length);
Instantiate(Prefabs[number], new Vector3(0, 0, 0), Quaternion.identity);
}
}

これを加えると、スフィアの生成間隔が一定ではなくなり、より自然な動き になります。


③ スフィアのスピードを変更

スフィアが 前方向に移動する速度をランダム にして、異なる動きを加えることもできます。

▼ 例:ランダムな速度を設定

void Update()
{
float speed = Random.Range(0.02f, 0.1f); // 速度をランダムに変更
transform.Translate(Vector3.forward * speed);
}

これを適用すると、スフィアごとに異なるスピードで動くようになります。


まとめ

基本のランダム生成を学んだ
ランダムな位置・間隔・スピードを応用できるようになった
ゲーム開発に活かせるテクニックを習得した!

「今回のスクリプトを使えば、基本的なランダム生成はできますが、もっと詳細なスポーン条件(出現間隔、出現数、特定のタイミングでの生成など)を細かく調整したい場合は、「Spawn Controller」 というアセットを使うのもおすすめです。このアセットを使えば、スポーンのルールを簡単に設定でき、さらに高度なランダム生成が可能になります。→ Spawn Controllerを見る

今回学んだテクニックを活かして、敵のスポーン、アイテムの配置、背景のランダム生成 など、さまざまな応用にチャレンジしてみましょう!




よくある質問(FAQ)

Q
ランダム生成されるPrefabの種類を増やすには?
A

Prefabs 配列に追加すればOKです。

Q
生成する位置をランダムにするには?
A

Instantiate() の第二引数に new Vector3(Random.Range(-5,5), 0, Random.Range(-5,5)) のように指定するとランダム配置が可能です。

Q
生成間隔を変更するには?
A

time 変数の初期値を変更するか、InvokeRepeating() を使うことで調整できます。

タイトルとURLをコピーしました