UnityUnityメモ

Unity初心者でも簡単!ランダム生成したPrefabを順番に配列へ格納する仕組みを作ろう

Unity

はじめに

この記事では、ランダムにPrefab(事前に準備されたオブジェクト)を生成し、その順番を配列に格納する仕組みを、初心者にもわかりやすく解説します。

例えば、ゲーム中に敵キャラクターやアイテムをランダムで出現させたいとき、この仕組みを応用することで簡単に実現できます。さらに、生成された順番で管理することで、複雑なロジックにも対応できるようになります。

この記事では、具体的な手順やコードを丁寧に説明していきますので、Unityに触れたばかりの方でも安心して取り組めます。それでは早速始めましょう!


Unityを触ったことがないという方はコチラの記事から見てみてください!



2. Prefabの準備

このセクションでは、ランダム生成するPrefabの準備を行います。具体的には、Unity内で3Dオブジェクトを作成し、それらをPrefab化する手順を解説します。


手順 1: 3Dオブジェクトの作成

まず、ランダム生成する対象となるオブジェクトをUnity上に作成します。ここでは「Cube」「Sphere」「Capsule」の3つを作成します。

  1. Cubeの作成
    • ヒエラルキーウィンドウ内で右クリックします。
    • 「3D Object」 → 「Cube」を選択します。
    • ヒエラルキーに「Cube」という名前のオブジェクトが追加されます。
  2. Sphereの作成
    • ヒエラルキーで再度右クリックします。
    • 「3D Object」 → 「Sphere」を選択します。
    • ヒエラルキーに「Sphere」という名前のオブジェクトが追加されます。
  3. Capsuleの作成
    • 同様に、ヒエラルキーで右クリックします。
    • 「3D Object」 → 「Capsule」を選択します。
    • ヒエラルキーに「Capsule」という名前のオブジェクトが追加されます。

手順 2: オブジェクトをPrefab化

次に、作成したオブジェクトをPrefabとして保存します。Prefabは、オブジェクトを再利用可能な形にする機能です。

  1. プロジェクトウィンドウを確認
    • Unityの下部に表示されているプロジェクトウィンドウを開きます。
    • 適切なフォルダを作成しておくと管理がしやすくなります(例: フォルダ名「Prefabs」)。
  2. オブジェクトをPrefab化
    • ヒエラルキーウィンドウから「Cube」をプロジェクトウィンドウにドラッグ&ドロップします。
    • 同様に「Sphere」と「Capsule」もドラッグ&ドロップします。
    • これで3つのPrefabがプロジェクトウィンドウに保存されました。
  3. ヒエラルキーの整理
    • ヒエラルキーウィンドウ内の元データ(Cube、Sphere、Capsule)は削除しておきましょう。
    • プロジェクトウィンドウのPrefabを使えば、必要なときにいつでもオブジェクトを再利用できます。

これで、ランダム生成に使用するPrefabの準備が完了です。次は、これらのPrefabを活用してオブジェクトをランダム生成し、配列に格納する仕組みを作っていきます!



3. オブジェクトを消すスクリプトを作成

生成したオブジェクトが一定時間後に自動で消える仕組みを作る方法を解説します。この仕組みは、ゲーム内の不要なオブジェクトが増えるのを防ぎ、パフォーマンス向上に役立ちます。


3.1 スクリプトを作成する

  1. 新しいスクリプトを作成
    • プロジェクトウィンドウで右クリックし、CreateC# Script を選択します。
    • スクリプト名を「DeleteTime」に変更します。
  2. スクリプトを編集
    • 「DeleteTime」スクリプトをダブルクリックして開き、以下のコードを記述してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeleteTime : MonoBehaviour
{
    private float lifeTime;

    void Start()
    {
        // オブジェクトが存在する時間を設定
        lifeTime = 1.0f;
        // 指定時間後にオブジェクトを破壊
        Destroy(gameObject, lifeTime);
    }
}

3.2 コードの解説

  • lifeTime
    • オブジェクトが存在する時間を秒単位で設定します。ここでは1秒としています。
  • Destroy(gameObject, lifeTime)
    • lifeTimeで指定した時間後に、このスクリプトがアタッチされたオブジェクトを破壊します。

3.3 スクリプトをPrefabにアタッチ

  1. オブジェクトにスクリプトを追加
    • 作成したスクリプトを、CubeSphereCapsule のそれぞれにドラッグ&ドロップしてアタッチします。
  2. Prefab化する
    • ヒエラルキーに配置した CubeSphereCapsule をプロジェクトウィンドウにドラッグして、Prefabに変換します。
    • ヒエラルキー内の元データは削除しておきましょう。

3.4 動作確認

  1. シーンを再生
    • Unityの「Play」ボタンを押してゲームを開始します。
  2. 動作確認
    • オブジェクトが生成され、1秒後に消えることを確認してください。

次のステップでは、ランダムでPrefabを生成し、その順番を配列に格納するスクリプトを作成します。続けてチャレンジしましょう!



4.ランダムなPrefabを生成し配列に格納する仕組み

このセクションでは、ランダムなPrefabを生成し、その順番を配列に格納する方法を解説します。Unity初心者でも安心して取り組めるように、具体的な手順とコードを紹介します!


1. 空のゲームオブジェクトを作成

まず、Prefabを管理するための空のゲームオブジェクトを作成します。

  1. ヒエラルキーウィンドウで右クリックし、「Create Empty」を選択します。
  2. 作成された空のオブジェクトの名前を「ObjectSpawner」に変更します。

2. スクリプト「ObjectSet」を作成

次に、Prefabをランダムに生成し、その順番を配列に格納するためのスクリプトを作成します。

  1. プロジェクトウィンドウで右クリックし、「CreateC# Script」を選択します。
  2. スクリプト名を「ObjectSet」に変更します。
  3. スクリプトをダブルクリックして開き、以下のコードを記述します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectSet : MonoBehaviour
{
    public GameObject[] cloneArray; // 生成可能なPrefabを格納
    public GameObject[] setArray = new GameObject[3]; // 生成されたPrefabを格納
    private int randomNum; // ランダム番号
    private float time; // タイマー
    private int count; // 生成カウント

    void Start()
    {
        time = 0.0f; // タイマー初期化
        count = 0;   // 生成カウント初期化
    }

    void Update()
    {
        time -= Time.deltaTime; // タイマーを進める
        if (time <= 0.0f && count < 3) // 一定時間ごとに実行
        {
            time = 1.0f; // 次の生成までの時間
            randomNum = Random.Range(0, cloneArray.Length); // ランダムな番号を取得
            GameObject obj = Instantiate(cloneArray[randomNum], new Vector3(0, 0, 0), Quaternion.identity); // オブジェクト生成
            setArray[count] = obj; // 配列に格納
            count++; // カウントを進める
        }
    }
}

3. スクリプトを空のゲームオブジェクトにアタッチ

  1. 「ObjectSpawner」を選択します。
  2. 作成した「ObjectSet」スクリプトをドラッグ&ドロップでアタッチします。

4. インスペクターでの設定

  1. 「ObjectSpawner」を選択し、インスペクターウィンドウで「ObjectSet (Script)」の項目を確認します。
  2. Clone Arrayのサイズを「3」に設定します。
  3. 各要素に以下のPrefabを設定します:
    • 要素0:CubeのPrefab
    • 要素1:SphereのPrefab
    • 要素2:CapsuleのPrefab

これで準備完了です!


すべての設定が完了したら、再生ボタンをクリックして動作を確認しましょう。ランダムに生成されるオブジェクトが、配列「setArray」に順番に格納される様子をデバッグログなどで確認してみてください!



5.テストプレイと確認

さて、これまでのステップで準備が整いました。ここでは、実際にテストプレイを行い、正しく動作しているかを確認する方法を解説します。

1. シーンの確認

まず、シーンが正しく設定されていることを確認してください。

  • ヒエラルキーに「ObjectSpawner」(空のゲームオブジェクト)が存在し、そこに「ObjectSet」スクリプトがアタッチされていることを確認します。
  • インスペクターの「ObjectSet (Script)」セクションで、Clone ArrayにCube、Sphere、CapsuleのPrefabが設定されていることを確認します。

2. プレイモードに移行

Unityエディタの上部にある再生ボタンをクリックして、プレイモードに移行します。

3. 動作を確認

プレイモード中に以下の点をチェックしましょう:

  • 1秒ごとにPrefabが1つずつ生成されるか。
  • 生成されたPrefabが順番に「Set Array」に格納されているか(インスペクターで確認できます)。
  • 生成されたPrefabが1秒後に消えるか。

4. 問題が発生した場合のチェックリスト

もし期待通りに動作しない場合は、以下を確認してください:

  • Clone Arrayが空の場合
    インスペクターで「Clone Array」に正しいPrefabが設定されているか確認してください。
  • Prefabが生成されない場合
    「ObjectSet」スクリプトのコードにタイプミスがないか、またPrefabがプロジェクトウィンドウ内で存在しているか確認してください。
  • 生成されたPrefabが消えない場合
    「DeleteTime」スクリプトが正しくアタッチされているか確認してください。また、コード内のDestroy(gameObject, lifeTime);が正しく動作しているか確認しましょう。

5. 成功の確認

問題がなければ、以下のような挙動を確認できます:

  • ランダムなPrefabが1秒ごとに生成される。
  • 生成されたPrefabが1秒後に消える。
  • 生成されたPrefabが「Set Array」に順番通り格納されている。

ここまで動作が確認できれば成功です!ぜひ、この仕組みを応用してさまざまなランダム生成に挑戦してみてください。



よくある質問(FAQ)

Q
他のPrefabを追加したい場合はどうすればいいですか?
A

新しいPrefabを追加したい場合、以下の手順を行ってください:

  1. 新しいオブジェクトを作成し、Prefab化します(ヒエラルキーからプロジェクトウィンドウにドラッグ&ドロップ)。
  2. 「ObjectSet」スクリプトがアタッチされたゲームオブジェクトを選択します。
  3. インスペクターで「Clone Array」のサイズを増やし、空いた要素に新しいPrefabを設定します。 これで新しいPrefabもランダム生成の対象になります。
Q
配列のサイズを変更するにはどうすればいいですか?
A

生成するPrefabの数を増やしたい場合、以下のコードを変更してください:

  1. 「setArray」のサイズを変更するには、「ObjectSet」スクリプト内の次の行を編集します:
    public GameObject[] setArray = new GameObject[3]; 3を必要な数に変更します。
  2. コードを保存し、Unityに戻ると配列のサイズが更新されます。
Q
Prefabが生成されない場合の原因は何ですか?
A

以下の点を確認してください:

  • Clone ArrayにPrefabが正しく設定されているか: インスペクターで「Clone Array」にPrefabをドラッグ&ドロップしているか確認します。
  • Prefabにスクリプトがアタッチされているか: 「DeleteTime」スクリプトが各Prefabに正しくアタッチされていることを確認してください。
  • ランダム番号の範囲が正しいか: スクリプトの以下の行を確認します:
    randomNum = Random.Range(0, cloneArray.Length);「cloneArray.Length」が正しい範囲を示しているか確認してください。

おすすめのアセット

「Michsky UI バンドル」は、Unityでのゲーム開発やアプリ制作に役立つ、使いやすいユーザーインターフェース(UI)パッケージのセットです。このバンドルを活用することで、プロジェクトのUIを簡単に美しく仕上げることができます。

主な特徴:

  • 多彩なUIコンポーネント: ボタン、スライダー、チェックボックスなど、さまざまなUI要素が含まれています。
  • カスタマイズ可能なデザイン: 色やレイアウトを自由に調整でき、プロジェクトのテーマに合わせたUIを作成できます。
  • 高い互換性: Unityのビルトイン、URP、HDRPなど、主要なレンダーパイプラインと互換性があります。

おすすめポイント:

  • 初心者でも簡単に使える: 複雑な設定なしで、すぐにプロジェクトに組み込めます。
  • 時間と労力の節約: ゼロからUIを作成する手間を省き、開発効率を向上させます。
  • プロフェッショナルな仕上がり: 高品質なデザインで、プロジェクトの見栄えを向上させます。