UnityUnityメモ

Unityでランダムな大きさのオブジェクトを生成!初心者向けガイド

Unity

1. はじめに

Unityでゲームを開発するとき、効率よくオブジェクトを生成・管理するために「Prefab(プレハブ)」を使うととても便利です。Prefabは、事前に設定したオブジェクトのテンプレートのようなもので、同じ設定のオブジェクトを何度でも簡単に生成できます。

今回の記事では、Prefabシステムを活用して「2秒ごとに異なるサイズの立方体(Cube)を生成する方法」を解説します。スクリプトを使って自動的に生成されるキューブは、それぞれ異なるサイズにランダム変更され、シーン上で動きながら指定された条件で消滅する仕組みです。


この記事はUnity初心者でもわかりやすいよう、手順をステップバイステップで紹介しています。「Prefabってどう使うの?」「スクリプトでオブジェクトを生成するってどうやるの?」という疑問を解消しながら進めていきましょう。

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



2. 必要な準備

このセクションでは、Unityで2秒ごとに異なるサイズの立方体(Cube)を生成するための準備を行います。まずはプロジェクトの作成からPrefabの準備まで、順を追って解説します。


1. Unityプロジェクトの作成

まずはUnityで新しいプロジェクトを作成します。

  1. Unity Hubを起動し、「新規作成」ボタンをクリックします。
  2. プロジェクトのテンプレートは「3D」を選び、プロジェクト名を入力します。(例:PrefabCubeProject
  3. 保存場所を指定し、「作成」ボタンをクリックします。

2. 必要な3Dオブジェクト(Cube)の作成

Unityエディターが開いたら、シーンに立方体を追加します。

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 表示されたメニューから「3D Object」→「Cube」を選びます。
  3. シーンに立方体が追加されます。

3. Prefabの作成

次に、追加した立方体をPrefab化して再利用可能なオブジェクトにします。

  1. ヒエラルキーウィンドウに表示されている立方体を、プロジェクト(Project)ウィンドウにドラッグ&ドロップします。
  2. ドロップした場所に青いアイコンのファイルが生成されます。これがPrefabです。
  3. Prefabファイルの名前を「CubePrefab」に変更しておくと、後でわかりやすくなります。

これで準備は完了です!次は、スクリプトを作成して、オブジェクトの生成や動きを制御する仕組みを作りましょう。



3. スクリプト作成

ここでは、2つのスクリプトを作成します。1つは、立方体を右に動かして一定の条件で削除する「CubeMove」スクリプト。もう1つは、Prefabを使って2秒ごとに異なるサイズの立方体を生成する「CubeManager」スクリプトです。それぞれのスクリプトを作成し、機能を解説していきます。


1. CubeMoveスクリプトの作成

立方体を右に動かし、一定の条件で削除するスクリプトを作成します。

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

public class CubeMove : MonoBehaviour
{
    void Update()
    {
        // 立方体を右に動かす
        transform.position += new Vector3(Time.deltaTime * 5, 0, 0);

        // x座標が10を超えたらオブジェクトを削除する
        if (transform.position.x >= 10f)
        {
            Destroy(gameObject);
        }
    }
}

解説:

  • transform.position を使ってオブジェクトを右方向に動かします。
  • Destroy(gameObject) を使って、x座標が10を超えたらオブジェクトを削除します。

コード全体の説明

このスクリプトは、UnityのMonoBehaviourを継承していて、Updateメソッドを使って毎フレームごとに立方体を右に動かします。そして、立方体の位置がx座標10を超えたらその立方体オブジェクトを削除します。

各部分の説明

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;

この部分は必要なライブラリをインポートしています。System.CollectionsSystem.Collections.Genericはリストなどのコレクションを使うためのライブラリですが、このスクリプトでは実際には使っていません。UnityEngineはUnityの基本機能を使うためのライブラリです。

public class CubeMove : MonoBehaviour

この行でCubeMoveという名前のクラスを定義しています。このクラスはMonoBehaviourを継承していて、Unityのコンポーネントとして使えます。

    void Update()

Updateメソッドは、Unityで毎フレームごとに呼び出される特別なメソッドです。この中に毎フレーム実行したい処理を記述します。

        // 立方体を右に動かす
        transform.position += new Vector3(Time.deltaTime * 5, 0, 0);

この行では、立方体の位置を右に動かしています。transform.positionはオブジェクトの現在の位置です。new Vector3(Time.deltaTime * 5, 0, 0)は、x方向にTime.deltaTime * 5だけ動かすという意味です。Time.deltaTimeは、前のフレームから経過した時間を返します。これを使うことで、フレームレートに依存しない動きを実現できます。

        // x座標が10を超えたらオブジェクトを削除する
        if(transform.position.x >= 10f)
        {
            Destroy(gameObject);
        }

この部分では、立方体のx座標が10以上になったときにオブジェクトを削除しています。if文で条件をチェックし、Destroy(gameObject)でこのスクリプトが付いているオブジェクトを削除します。

全体の動き

このスクリプトがアタッチされた立方体は、毎フレーム右方向に少しずつ移動します。そして、x座標が10を超えた瞬間に削除されます。具体的には、以下のような流れです:

  1. ゲームが始まる。
  2. 毎フレーム、立方体が右に動く。
  3. 立方体のx座標が10を超えると、その立方体が削除される。

2. CubeManagerスクリプトの作成

Prefabを使って2秒ごとに異なるサイズの立方体を生成するスクリプトを作成します。

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

public class CubeManager : MonoBehaviour
{
    public GameObject cubePrefab; // 生成するPrefab
    private float time;           // タイマー
    private float scaleX;         // ランダムなサイズ

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

        if (time <= 0.0f)
        {
            // ランダムなサイズを設定
            scaleX = Random.Range(1, 5);

            // Prefabを生成
            GameObject cube = Instantiate(cubePrefab, new Vector3(-10, 0, 0), Quaternion.identity);

            // サイズを変更
            cube.transform.localScale = new Vector3(scaleX, 1, 1);

            // CubeMoveスクリプトを追加
            cube.AddComponent<CubeMove>();

            // タイマーをリセット
            time = 2.0f;
        }
    }
}

解説:

  • Instantiate メソッドでPrefabを生成し、初期位置を設定します。
  • Random.Range を使って、ランダムな幅(scaleX)を設定します。
  • cube.transform.localScale を変更してサイズを適用します。
  • 生成した立方体に「CubeMove」スクリプトを追加し、動作を制御します。

コード全体の説明

  1. 変数の宣言:
    • cubePrefab: 新しく作るキューブの元となるプレハブ(テンプレート)を指定します。
    • time: 次にキューブを作るまでの時間を管理します。
    • scaleX: 作られるキューブの横幅(x方向の大きさ)をランダムに決定します。
  2. Updateメソッド:
    • 毎フレーム(画面が更新される度に)呼び出されるメソッドです。
    • timeを減らして、キューブを生成するタイミングを決めます。
    • timeが0以下になったときに新しいキューブを生成し、そのキューブのサイズをランダムに設定します。

各部分の説明

public GameObject cubePrefab;
private float time;
private float scaleX;
  • cubePrefab: 新しく生成するキューブのテンプレートを格納します。publicなので、Unityのインスペクターから設定できます。
  • time: 次にキューブを作るまでの時間を管理します。privateなので、外部からは直接変更できません。
  • scaleX: 新しく作るキューブの横幅をランダムに決めるための変数です。

Updateメソッド

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

    if(time <= 0.0f)
    {
       scaleX = Random.Range(1, 5);
       GameObject cube = Instantiate(cubePrefab, new Vector3(-10, 0, 0), Quaternion.identity);
       cube.transform.localScale = new Vector3(scaleX, 1, 1);
       time = 2.0f;
    }
}
  • time -= Time.deltaTime;: timeからTime.deltaTimeを引きます。Time.deltaTimeは前のフレームからの経過時間なので、これで時間がカウントダウンされます。
  • if(time <= 0.0f): timeが0以下になったら以下の処理を行います。
    • scaleX = Random.Range(1, 5);: scaleXに1から4までのランダムな値を設定します。
    • GameObject cube = Instantiate(cubePrefab, new Vector3(-10, 0, 0), Quaternion.identity);: cubePrefabから新しいキューブを生成し、位置を(-10, 0, 0)に設定します。
    • cube.transform.localScale = new Vector3(scaleX, 1, 1);: 生成したキューブの横幅をscaleXに設定し、縦と奥行きは1にします。
    • time = 2.0f;: 次のキューブを作るまでの時間を2秒にリセットします。

全体の動き

このスクリプトは、ゲームが実行されている間、毎フレーム実行されます。最初はtimeが0以下でなければ何も起こりませんが、timeが0以下になると、新しいキューブが生成され、その横幅がランダムに設定されます。そして、再びtimeを2秒にリセットし、次のキューブを生成するまでのカウントダウンが始まります。


これでスクリプトが完成しました!次のセクションでは、これらのスクリプトをUnityエディターで適用する方法を解説します。



4. スクリプトの適用

スクリプトを作成したら、それをUnityエディターで適用して動作を確認する準備をしましょう。このセクションでは、「CubeMove」と「CubeManager」のスクリプトを適切にアタッチし、Prefabをリンクする方法を説明します。


1. 「CubeMove」スクリプトをPrefabに適用する

  1. プロジェクトウィンドウで作成したPrefab(例: CubePrefab)をダブルクリックして開きます。
  2. 開いたPrefab編集モードで、「CubeMove」スクリプトをドラッグ&ドロップしてPrefabにアタッチします。
  3. アタッチ後、インスペクターウィンドウに「CubeMove」が表示されていることを確認してください。

2. 「CubeManager」スクリプトを空のゲームオブジェクトに適用する

  1. ヒエラルキーウィンドウで空のゲームオブジェクトを作成します。
    • 右クリックして「Create Empty」を選択し、新しいゲームオブジェクトを作成します。
    • ゲームオブジェクトの名前を「GameManager」に変更します。
  2. プロジェクトウィンドウで作成した「CubeManager」スクリプトを、「GameManager」オブジェクトにドラッグ&ドロップしてアタッチします。
  3. アタッチ後、インスペクターウィンドウに「CubeManager」が表示されていることを確認してください。

3. PrefabをCubeManagerにリンクする

  1. ヒエラルキーウィンドウで「GameManager」オブジェクトを選択します。
  2. インスペクターウィンドウに表示されている「CubeManager」スクリプトの cubePrefab フィールドに、プロジェクトウィンドウのPrefab(例: CubePrefab)をドラッグ&ドロップします。
  3. リンクが正しく設定されると、cubePrefab フィールドにPrefabの名前が表示されます。

これでスクリプトの適用が完了しました!次にUnityエディターで動作を確認してみましょう。次のセクションでは、実行して動作を確認する手順とチェックポイントを解説します。



5. 実行して確認

スクリプトを適用し、Prefabをリンクしたら、いよいよUnityで動作を確認します。ここでは、実行手順と、動作を確認する際のチェックポイントを紹介します。


1. プレイモードで動作を確認する

  1. Unityエディターの上部にある「Play」ボタン(▶)をクリックします。
  2. シーンビューまたはゲームビューを確認し、以下の動作が実行されることを確認してください。
    • 2秒ごとに立方体が生成される。
    • 生成される立方体のサイズがランダムで変化する(横幅のみ)。
    • 立方体が右方向に移動し、画面外(x=10以上)に到達すると削除される。

2. チェックポイント

動作を確認する際は、以下のポイントをチェックしてください。

  • Prefabが生成されているか
    • シーンビューまたはゲームビューに立方体が表示されていることを確認します。
    • ヒエラルキーウィンドウにも、生成された立方体が一時的に表示されます。
  • サイズがランダムに変更されているか
    • 生成される立方体の横幅(X軸)が毎回異なることを確認します。
    • サイズが「1〜5」の範囲内で変化しているかを確認してください。
  • 立方体が移動して削除されるか
    • 立方体が右方向に移動し、x=10を超えると消えることを確認します。

3. 問題がある場合の対処法

動作が期待通りでない場合、以下を確認してください。

  • スクリプトのエラー
    • コンソールウィンドウを開いて、エラーメッセージが表示されていないか確認します。
    • エラーがある場合、メッセージをクリックして該当のスクリプトを修正してください。
  • Prefabのリンク
    • 「CubeManager」スクリプトの cubePrefab フィールドに正しいPrefabがリンクされているか確認します。
  • スクリプトの適用
    • 「CubeManager」スクリプトが正しいオブジェクト(例: GameManager)にアタッチされているか確認します。
    • 「CubeMove」スクリプトがPrefabにアタッチされているか確認します。

4. 成功したら…

動作が正常であれば、2秒ごとに異なるサイズの立方体が生成され、画面を横切るシンプルな仕組みが完成です!この仕組みは、他のオブジェクトにも応用できます。例えば、敵キャラクターを生成したり、アイテムを配置したりするゲーム要素に発展させることができます。


これで動作確認が完了です!次のセクションでは、今回のプロジェクトで学んだ内容をまとめます。よくある質問も併せてご覧ください。



よくある質問

Q
Prefabを作成できないのですが、どうすればいいですか?
A

ヒエラルキーウィンドウでオブジェクトを選択し、それをプロジェクトウィンドウにドラッグ&ドロップすることでPrefabが作成されます。

Q
生成したオブジェクトが消えないのですが?
A

「CubeMove」スクリプトでDestroyメソッドを使用していますが、条件を確認して再設定してください。

Q
スクリプトを適用しても動作しません。
A

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