スポンサーリンク
スポンサーリンク
UnityUnityメモ

Unityでランダムな大きさで立方体(Prefab)を生成する方法

Unity

はじめに

こんにちは!今回は、UnityのPrefabシステムを使って、2秒おきに異なるサイズの立方体(Cube)を生成する方法を紹介します。Prefabを使うと、オブジェクトを簡単に複製したり、管理したりすることができます。では、早速始めましょう!

1.キューブを作成

  • Hierarchyウィンドウで右クリックし、「3D Object」→「Cube」を選びます。これでシーンに立方体が作成されます。

2.キューブのスクリプトを作成

  • Projectウィンドウで右クリックし、「Create」→「C# Script」を選び、「CubeMove」と名前を付けます。
  • CubeMoveスクリプトをダブルクリックして、以下のコードを入力します。

コード全体の説明

このスクリプトは、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を超えると、その立方体が削除される。
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);
        }
    }
}
  • Cube を選択した状態で、InspectorウィンドウにCubeMoveスクリプトをドラッグ&ドロップしてアタッチします。

3.キューブをPrefabとして保存

  • Hierarchyウィンドウから立方体をドラッグして、Projectウィンドウにドロップします。これでPrefabが作成されました。
  • シーン内の立方体は削除しておきます。PrefabはProjectウィンドウに保存されているので安心です。

4.キューブを生成するスクリプトを作成する

  • Projectウィンドウで右クリックし、「Create」→「C# Script」を選び、「CubeManager」と名前を付けます。
  • CubeManagerスクリプトをダブルクリックして、以下のコードを入力します。

コード全体の説明

  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秒にリセットし、次のキューブを生成するまでのカウントダウンが始まります。

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

public class CubeManager : MonoBehaviour
{
    public GameObject cubePrefab;
    private float time;
    private float scaleX;

    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;
        }
    }
}

5.CubeManagerスクリプトをセットアップする

  • Hierarchyウィンドウで右クリックし、「Create Empty」を選びます。新しい空のオブジェクトが作成されます。
  • 空のオブジェクトを選択し、InspectorウィンドウにCubeManagerスクリプトをドラッグ&ドロップしてアタッチします。
  • CubeManagerスクリプトをアタッチしたオブジェクトを選択し、Inspectorウィンドウで「Cube Prefab」というフィールドを確認します。ProjectウィンドウからCube Prefabをこのフィールドにドラッグ&ドロップします。

6.シーンを実行

Unityエディターの再生ボタンを押して、シーンを実行します。2秒おきに異なる横幅の立方体が左端に生成され、右に動いてx座標が10を超えると削除されるのを確認できるはずです。

まとめ

これで、Unityで2秒おきに異なるサイズの立方体を生成し、それらが右に動いて一定範囲を超えたら削除される方法の紹介は終わりです。ぜひ、試してみてくださいね!

スポンサーリンク
C-BA memo
タイトルとURLをコピーしました