UnityUnityメモ

Unityでランダムにオブジェクトを表示・非表示!4つのPrefabを使った初心者向けガイド

Unity

1. はじめに

ゲーム開発では、シーン内のオブジェクトを効率的に管理することがとても重要です。Unityでは、**Prefab(プレハブ)**を使うことで、複数のオブジェクトを効率よく生成・配置することができます。

この記事では、4つの異なるPrefabを使って、ランダムにオブジェクトを表示・非表示させる方法を解説します。このスクリプトを応用すれば、ゲーム内でランダムなイベントを発生させたり、動的なエフェクトを作成したりすることができます。

初心者の方でも理解しやすいように、具体的な手順と解説を交えながら進めていきます。

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



2. 使用するUnity機能

今回の解説では、Unityでよく使われる以下の機能を活用します。それぞれの機能について簡単に説明しますので、どんな役割を果たすのか理解しながら進めましょう。


1. Prefab(プレハブ)

  • 説明
    UnityのPrefabは、ゲーム内で使うオブジェクトをテンプレート化したものです。同じ設定を持つオブジェクトを繰り返し使用できるため、作業効率を大幅に向上させます。

2. Instantiate

  • 説明
    Instantiate関数は、指定したPrefabやオブジェクトをシーン内に生成するための関数です。

3. Destroy

  • 説明
    Destroy関数は、指定したオブジェクトをシーンから削除するための関数です。

4. Random.Range

  • 説明
    Random.Rangeは、指定した範囲内でランダムな値を生成する関数です。スクリプトでランダム性を加える際に非常に便利です。

これらの機能を組み合わせることで、シーン内にランダムなオブジェクトを生成し、一定時間後に削除する動きを実現します。次のセクションでは、具体的な手順を詳しく説明していきます!



3. プレハブを作成する手順

Prefab(プレハブ)は、Unityで効率的にオブジェクトを管理するための重要な機能です。ここでは、4つの異なるオブジェクトをPrefab化する方法をステップごとに解説します。


ステップ1:3Dオブジェクトを作成する

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 3D Object」を選び、その中から以下のオブジェクトを作成します:
    • Cube
    • Sphere
    • Capsule
    • Cylinder
  3. 作成したオブジェクトは、それぞれの名前をわかりやすく変更しておきましょう(例:CubePrefabSpherePrefabなど)。

ステップ2:オブジェクトの外見や位置を調整する

  • 各オブジェクトの色やサイズを調整して見た目を分かりやすくします。
    • 色の変更方法
      オブジェクトを選択し、インスペクター(Inspector)ウィンドウから「Material」を設定します。
    • 必要に応じて、位置やスケールを調整してみてください。

ステップ3:Prefabとして保存する

  1. プロジェクト(Project)ウィンドウにフォルダを作成します。
    • フォルダ名は「Prefabs」などにすると管理しやすいです。
  2. 作成した各オブジェクトを選択し、プロジェクトウィンドウにドラッグ&ドロップします。
    • ドロップした時点で、オブジェクトがPrefabとして保存されます。

ステップ4:確認する

  • プロジェクトウィンドウに作成されたPrefabをクリックしてみて、内容が正しく保存されているか確認しましょう。

これで4つのPrefabが準備できました!次のセクションでは、これらのPrefabを活用してランダムな表示・非表示を行うスクリプトを作成していきます。楽しく進めていきましょう!



4. オブジェクトの自動削除スクリプトの作成

ゲーム内で生成されたオブジェクトを一定時間後に削除することで、シーン内が整理され、パフォーマンスの向上が期待できます。ここでは、C#スクリプトを使ってオブジェクトを自動で削除する方法を解説します。


ステップ1:スクリプトを作成する

  1. プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択します。
  2. 新しいスクリプトに名前を付けます。今回は「DeleteTime」とします。

ステップ2:スクリプトの内容を記述する

以下のコードを作成したDeleteTimeスクリプトに貼り付けます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeleteTime : MonoBehaviour
{
    public float lifeTime; // オブジェクトの寿命を設定する変数

    void Start()
    {
        // 指定した時間が経過したらこのオブジェクトを削除する
        Destroy(gameObject, lifeTime);
    }
}

ステップ3:スクリプトをアタッチする

  1. プロジェクトウィンドウで、作成したDeleteTimeスクリプトを選択します。
  2. 各Prefab(例:CubePrefabSpherePrefabなど)に、スクリプトをドラッグ&ドロップしてアタッチします。

ステップ4:インスペクターで設定を調整する

  1. 各Prefabを選択し、インスペクターウィンドウでlifeTimeの値を設定します(例:5秒)。
  2. これにより、Prefabが生成されてから5秒後に自動で削除されるようになります。

ステップ5:動作を確認する

  1. ヒエラルキーウィンドウにPrefabを直接配置し、再生ボタン(Play)を押してみてください。
  2. 指定した時間後にオブジェクトが削除されることを確認します。

これでオブジェクトの自動削除スクリプトの作成が完了しました!次は、これらのPrefabをランダムに生成するスクリプトを作成していきましょう。引き続き進めてみてください!



5. ランダム生成スクリプトの作成

次は、ランダムでオブジェクトを生成するスクリプトを作成します。このスクリプトを使うと、指定したPrefabが数秒ごとにランダムな順序で表示されるようになります。


ステップ1:スクリプトを作成する

  1. プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択します。
  2. 新しいスクリプトに名前を付けます。今回は「RandomObject」とします。

ステップ2:スクリプトの内容を記述する

以下のコードをRandomObjectスクリプトに貼り付けます。

全体の説明

このスクリプトは、「RandomObject」というクラスを定義しています。このクラスは、ゲームの中で一定の時間ごとにランダムなオブジェクトを生成します。生成するオブジェクトは事前に設定されたリスト(配列)から選ばれます。

各部分の説明

  • ライブラリのインポート
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
  • 最初に、必要なライブラリをインポートしています。UnityEngineはUnityの基本的な機能を使うためのものです。
  • クラスと変数の定義
public class RandomObject : MonoBehaviour
{
    public GameObject[] objectPrefab;
    private int i;
    private float time;
  • RandomObjectクラスはMonoBehaviourを継承しています。MonoBehaviourはUnityでスクリプトを使うための基本クラスです。
  • public GameObject[] objectPrefab;は、生成するオブジェクトのプレハブ(雛形)を格納するための配列です。これはUnityエディタから設定できます。
  • private int i;は、ランダムに選ばれた配列のインデックスを格納するための変数です。
  • private float time;は、時間を管理するための変数です。
  • Startメソッド
void Start()
{
    time = 0.0f;
}
  • Startメソッドは、スクリプトが最初に実行されるときに呼ばれます。ここでは、time変数を0に初期化しています。
  • Updateメソッド
void Update()
{
    time -= Time.deltaTime;
    if (time <= 0.0f)
    {
        time = 2.0f;
        i = Random.Range(0, objectPrefab.Length);
        Instantiate(objectPrefab[i], new Vector3(0, 0, 0), Quaternion.identity);
    }
}
  • Updateメソッドは、毎フレーム呼ばれます。ここでは、time変数を毎フレーム減らしています。
  • timeが0以下になると、以下の処理を行います:
    1. timeを2.0秒にリセットします。
    2. Random.Range(0, objectPrefab.Length)で、objectPrefab配列からランダムなインデックスを選びます。
    3. Instantiate(objectPrefab[i], new Vector3(0, 0, 0), Quaternion.identity);で、選ばれたプレハブを生成します。位置は(0, 0, 0)、回転は初期状態(Quaternion.identity)です。

全体の動き

このスクリプトは、ゲームが始まるとまずStartメソッドでtimeを0に設定します。次に、Updateメソッドが毎フレーム呼ばれ、timeが減少します。timeが0以下になると、2秒にリセットされ、配列からランダムにオブジェクトが選ばれて生成されます。この動作が繰り返されることで、2秒ごとにランダムなオブジェクトが生成される仕組みです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RandomObject : MonoBehaviour
{
    public GameObject[] objectPrefab; // プレハブの配列
    private int i; // ランダムで選ばれるインデックス
    private float time; // タイマー

    void Start()
    {
        time = 0.0f; // タイマーの初期値
    }

    void Update()
    {   
        time -= Time.deltaTime; // 毎フレーム時間を減らす
        if (time <= 0.0f)
        {
            time = 2.0f; // 次の生成までの間隔(2秒)
            i = Random.Range(0, objectPrefab.Length); // 配列からランダムなインデックスを選ぶ
            Instantiate(objectPrefab[i], new Vector3(0, 0, 0), Quaternion.identity); // ランダムなオブジェクトを生成
        }
    }
}

ステップ3:スクリプトをアタッチする

  1. ヒエラルキーウィンドウで空のゲームオブジェクトを作成します。
    • 名前を「RandomObjectController」などに変更すると管理がしやすいです。
  2. 作成したRandomObjectスクリプトをドラッグ&ドロップして、このゲームオブジェクトにアタッチします。

ステップ4:Prefabを登録する

  1. ヒエラルキーウィンドウでRandomObjectControllerを選択します。
  2. インスペクターウィンドウで、objectPrefabフィールドが表示されます。
  3. プロジェクトウィンドウの4つのPrefabをobjectPrefabフィールドにドラッグ&ドロップして登録します。



6. 実行してみよう!

これまでに作成したPrefab、削除スクリプト、ランダム生成スクリプトを組み合わせて、実際にUnityで動かしてみましょう。手順に沿って確認していきます!


ステップ1:実行してみる

  1. Unityエディターの上部にある「再生ボタン(Play)」をクリックします。
  2. シーンビューに注目してください。
    数秒ごとにランダムなオブジェクトが生成される様子が確認できるはずです。

ステップ2:削除が機能しているか確認

  • 各PrefabにアタッチしたDeleteTimeスクリプトが機能している場合、生成されたオブジェクトは指定した時間(例:5秒)後に自動的に削除されます。

ステップ3:調整してみる

動作を確認したら、次のような調整を試してみましょう:

  • 生成間隔を変更
    RandomObjectスクリプトのtime = 2.0f;を変更して、生成の間隔を短くしたり長くしたりできます。
  • 生成位置を変更
    Instantiatenew Vector3(0, 0, 0)を他の位置(例:new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5))など)に変更して、ランダムな位置にオブジェクトを生成してみましょう。
  • 寿命を変更
    DeleteTimeスクリプトのlifeTimeを変更して、オブジェクトの寿命を調整してください。

これで、ランダムなオブジェクト生成が動作するシステムが完成しました!次のステップとして、より複雑な動作や条件を追加して、オリジナルのゲームを構築してみてください。トライ&エラーを楽しみながらUnityを学びましょう!



よくある質問

Q
オブジェクトが削除されないのですが?
A

DeleteTimeスクリプトが正しくアタッチされているか、lifeTimeが設定されているか確認してください。

Q
オブジェクトが生成される位置を変えたいです。
A

Instantiate内のnew Vector3(0, 0, 0)を変更してください。

Q
表示速度を調整したいです。
A

RandomObjectスクリプトのtime = 2.0f;の値を変更してください。

おすすめのアセット

Tons Of Game Assets Bundleは、Unityで使えるゲーム開発用のアセットがたっぷり詰まったパッケージです。2D、3Dゲームの制作に必要な素材がすべて揃っており、初心者からプロまで幅広いユーザーに対応しています。テンプレートやスクリプト、グラフィック、サウンドなど、多彩なコンテンツが含まれており、効率的なゲーム開発をサポートします。