UnityUnityメモ

Unity初心者必見!オブジェクトをランダムな位置で連続生成する方法

Unity

1. はじめに

Unityでゲームを作りたいけど、どこから手をつければいいかわからない!そんな初心者の方におすすめなのが、今回のチュートリアルです。このチュートリアルでは、キューブをランダムな高さで1秒ごとに出現させ、それぞれが左右に移動する動きを実装していきます。

この作業を通じて、オブジェクトの生成方法スクリプトを使った動きの制御ランダムな要素の追加など、Unityの基本的な機能を学ぶことができます。これらの知識は、他のゲームオブジェクトを扱うときにも応用できるので、Unityを使い始めたばかりの方にはぴったりです!

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




2. 準備: Unityプロジェクトの設定

それでは、まずUnityのプロジェクトを作成して、必要な準備を進めていきましょう!


1. 新しいUnityプロジェクトを作成

  1. Unity Hubを開きます。
  2. 「新しいプロジェクト」をクリックします。
  3. テンプレートを「3D」に設定し、プロジェクト名をわかりやすく「CubeSpawner」にします。
  4. 保存場所を選び、「作成」をクリックします。

2. キューブを作成してプレハブ化

Unityでは、オブジェクトを効率よく使い回すために「プレハブ(Prefab)」を使用します。まずはキューブを作成してプレハブにしてみましょう!

  1. キューブの作成
    1. ヒエラルキー(Hierarchy)ウィンドウで「右クリック」します。
    2. 表示されたメニューから「3D Object」→「Cube」を選びます。
    3. ヒエラルキーに「Cube」という名前のオブジェクトが追加されます。
  2. キューブをプレハブに変換
    1. 作成したキューブをプロジェクト(Project)ウィンドウにドラッグ&ドロップします。
    2. ドロップすると青色のアイコンに変わり、これでプレハブが完成です!
  3. 元のキューブを削除
    • ヒエラルキー上の「Cube」を右クリックして「Delete」を選択します。

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

プレハブを使うためには、オブジェクトを管理する役割を持つ「空のゲームオブジェクト」を作成します。

  1. 空のオブジェクトを作成
    1. ヒエラルキー(Hierarchy)ウィンドウで「右クリック」します。
    2. 表示されたメニューから「Create Empty」を選択します。
    3. ヒエラルキーに「GameObject」という名前の空のオブジェクトが作成されます。
  2. 名前を変更
    • 作成した「GameObject」を選択し、名前を「Spawner」に変更します。

4. スクリプトを管理するフォルダを作成

スクリプトを効率よく管理するためにフォルダを作成します。

  1. Scriptsフォルダを作成
    1. プロジェクト(Project)ウィンドウで右クリックします。
    2. 「Create」→「Folder」を選択します。
    3. フォルダ名を「Scripts」に変更します。

これで準備は完了です!次はスクリプトを作成して、キューブを動かしていきましょう!




3. キューブを移動させるスクリプト作成

キューブが左右に移動する動きをスクリプトで実現します。このステップでは、キューブが画面の右端に到達したら自動で削除されるように設定します。初心者でもわかりやすいように、コードを一つずつ解説していきます!


1. 新しいスクリプトを作成

まず、スクリプトファイルを作成しましょう。

  1. スクリプトを作成
    1. プロジェクト(Project)ウィンドウの「Scripts」フォルダを右クリックします。
    2. 「Create」→「C# Script」を選択します。
    3. スクリプト名を「CubeMover」に変更します。
  2. スクリプトを開く
    • 作成した「CubeMover」スクリプトをダブルクリックして開きます。UnityのデフォルトエディタであるVisual Studioが起動します。

2. スクリプトを記述する

以下のコードを「CubeMover」スクリプトに書き込みます。

using UnityEngine;

public class CubeMover : MonoBehaviour
{
    void Update()
    {
        // キューブを右に移動させる
        transform.position += new Vector3(Time.deltaTime * 5, 0, 0);

        // 画面の右端に到達したらキューブを削除
        if (transform.position.x >= 10f)
        {
            Destroy(gameObject);
        }
    }
}

3. コードの解説

  • Updateメソッド
    • 毎フレーム実行されるメソッドです。この中にキューブの動きを記述します。
  • transform.position += new Vector3(Time.deltaTime * 5, 0, 0);
    • キューブの位置を毎フレーム更新し、右方向(X軸方向)に移動させます。Time.deltaTimeを使うことで、フレームレートに依存しないスムーズな移動が可能です。
  • if (transform.position.x >= 10f)
    • キューブのX座標が10以上になった場合、以下の処理を実行します。
  • Destroy(gameObject);
    • Destroyメソッドを使って、指定されたオブジェクト(この場合はキューブ)を削除します。

4. スクリプトをアタッチする

  1. ヒエラルキー(Hierarchy)ウィンドウで「Cube」のプレハブを選択します。
  2. インスペクター(Inspector)ウィンドウにある「Add Component」ボタンをクリックします。
  3. 検索バーに「CubeMover」と入力し、スクリプトを選択します。

これでキューブに「CubeMover」スクリプトがアタッチされました!


5. 動作確認

  1. シーン内にキューブを配置し、ゲームを再生します。
  2. キューブが右方向に移動し、画面の右端に到達すると削除されることを確認してください。

これでキューブを移動させるスクリプトの作成は完了です!次は、キューブをランダムな高さで出現させるスクリプトを作成していきましょう!



4. キューブをランダムな高さで出現させるスクリプト作成

次に、キューブを1秒おきにランダムな高さで出現させるスクリプトを作成します。このスクリプトでは、UnityのInstantiateを使ってプレハブを生成し、Random.Rangeを使用してランダムなY座標を設定します。


1. 新しいスクリプトを作成

まずは新しいスクリプトファイルを作成します。

  1. スクリプトを作成
    1. プロジェクト(Project)ウィンドウの「Scripts」フォルダを右クリックします。
    2. 「Create」→「C# Script」を選択します。
    3. スクリプト名を「CubeSpawner」に変更します。
  2. スクリプトを開く
    • 作成した「CubeSpawner」スクリプトをダブルクリックして開きます。

2. スクリプトを記述する

以下のコードを「CubeSpawner」スクリプトに記述してください。

using System.Collections;
using UnityEngine;

public class CubeSpawner : MonoBehaviour
{
    public GameObject cubePrefab; // キューブのプレハブを格納
    private float spawnTimer;    // 出現タイマー

    void Update()
    {
        // タイマーを減少させる
        spawnTimer -= Time.deltaTime;

        // タイマーが0以下になった場合、キューブを生成
        if (spawnTimer <= 0.0f)
        {
            // ランダムなY座標を生成(0〜5の範囲)
            float randomY = Random.Range(0f, 5f);

            // キューブを指定した位置に生成
            Instantiate(cubePrefab, new Vector3(-8f, randomY, 0f), Quaternion.identity);

            // タイマーをリセット
            spawnTimer = 1.0f;
        }
    }
}

3. コードの解説

  • public GameObject cubePrefab;
    • プレハブを格納するための変数です。これに先ほど作成したキューブのプレハブを設定します。
  • spawnTimer -= Time.deltaTime;
    • 出現タイマーを減少させます。Time.deltaTimeを使うことで、フレームレートに依存しない正確な時間管理が可能です。
  • Random.Range(0f, 5f);
    • Y座標をランダムに設定します。ここでは0から5の範囲でランダムな値を取得します。
  • Instantiate(cubePrefab, new Vector3(-8f, randomY, 0f), Quaternion.identity);
    • キューブを生成します。X座標を-8に固定し、Y座標をランダムな値に、Z座標を0に設定しています。
  • spawnTimer = 1.0f;
    • キューブを1秒間隔で出現させるために、タイマーをリセットします。

4. スクリプトをアタッチする

  1. ヒエラルキー(Hierarchy)ウィンドウで「Spawner」オブジェクトを選択します。
  2. インスペクター(Inspector)ウィンドウで「Add Component」をクリックし、「CubeSpawner」スクリプトを追加します。
  3. インスペクター内のCube Prefabフィールドに、プロジェクトウィンドウ内のキューブプレハブをドラッグ&ドロップして設定します。

これで、キューブをランダムな高さで出現させるスクリプトの作成が完了しました!



5. 実行と結果の確認

これまでに作成したスクリプトと設定を確認し、ゲームを実行して正しく動作するかテストします。問題が発生した場合の対処方法についても解説します!


1. ゲームを実行する

  1. 再生ボタンをクリック
    Unityエディタの上部にある再生ボタン(▶)をクリックしてゲームを実行します。
  2. 挙動を確認
    • キューブが画面の左端(X座標が-8)から1秒おきに出現していることを確認してください。
    • キューブがランダムな高さ(Y座標が0〜5の範囲)に出現しているかを確認します。
    • 出現したキューブが右方向(X軸)にスムーズに移動し、画面右端(X座標が10)で削除されているかをチェックします。

2. 動作の確認ポイント

  • キューブの出現間隔
    • 出現間隔が1秒になっているか確認してください。
    • 出現が速すぎたり遅すぎたりする場合は、CubeSpawnerスクリプト内のspawnTimerの値を調整します。
  • キューブの移動
    • キューブがスムーズに右方向に移動していることを確認してください。
    • もし移動が速すぎる、または遅すぎる場合は、CubeMoverスクリプト内の速度(Time.deltaTime * 5)の値を調整します。
  • 削除処理
    • キューブが画面右端で削除されていることを確認してください。
    • 削除されない場合は、CubeMoverスクリプトのDestroyメソッドを確認し、transform.position.x >= 10fの条件が正しいかを見直してください。

3. よくある問題と対処方法

  • 問題1: キューブが出現しない
    原因: プレハブが正しく設定されていない可能性があります。
    解決方法:
    • 「Spawner」オブジェクトを選択し、Cube Prefabフィールドに正しいプレハブがドラッグ&ドロップされているか確認してください。
  • 問題2: キューブが移動しない
    原因: CubeMoverスクリプトがプレハブにアタッチされていない可能性があります。
    解決方法:
    • キューブのプレハブを選択し、インスペクターでCubeMoverスクリプトがアタッチされているか確認してください。
  • 問題3: 出現位置や移動がランダムでない
    原因: Random.Rangeの値が正しく設定されていない可能性があります。
    解決方法:
    • CubeSpawnerスクリプトのRandom.Range(0f, 5f)を確認し、適切な範囲が設定されているか確認してください。

4. 結果の確認

ゲームが期待通りに動作していれば、以下のような動きが実現できているはずです。

  • キューブが1秒おきに出現する。
  • 出現位置の高さがランダムである。
  • キューブが右方向にスムーズに移動する。
  • キューブが画面右端で削除される。

これでテストと確認が完了です!動作が確認できたら、次のステップとして応用やデザインの改善に取り組んでみましょう!



7. 応用: 発展させるアイデア

基本的なキューブの出現と移動が完成したら、さらに楽しい演出や実用的な仕組みを追加してゲームを発展させてみましょう!ここでは、いくつかの応用アイデアを紹介します。


1. キューブの速度をランダムにする

出現するキューブの移動速度をランダムに変更することで、動きにバリエーションを持たせることができます。

実装のポイント:

  • CubeMoverスクリプトに速度の変数を追加します。
  • CubeSpawnerスクリプトでInstantiate時にランダムな速度を設定します。

コード例(CubeMover.csの変更):

public float speed = 5f;

void Update()
{
transform.position += new Vector3(Time.deltaTime * speed, 0, 0);

if (transform.position.x >= 10f)
{
Destroy(gameObject);
}
}

コード例(CubeSpawner.csの変更):

GameObject cube = Instantiate(cubePrefab, new Vector3(-8f, randomY, 0f), Quaternion.identity);
cube.GetComponent<CubeMover>().speed = Random.Range(3f, 8f);

2. キューブの色をランダムに変更する

キューブごとに異なる色を設定することで、視覚的な楽しさを追加できます。

実装のポイント:

  • CubeSpawnerスクリプトで生成時にRendererの色を変更します。

コード例(CubeSpawner.csの変更):

GameObject cube = Instantiate(cubePrefab, new Vector3(-8f, randomY, 0f), Quaternion.identity);
Renderer cubeRenderer = cube.GetComponent<Renderer>();
cubeRenderer.material.color = new Color(Random.value, Random.value, Random.value);

3. キューブの形状や種類を増やす

キューブ以外の形状(球体や円柱)をランダムに出現させることで、多様なオブジェクトを生成できます。

実装のポイント:

  • 複数のプレハブを用意し、Instantiate時にランダムに選択します。

コード例(CubeSpawner.csの変更):

public GameObject[] prefabArray; // 複数のプレハブを格納

GameObject cube = Instantiate(prefabArray[Random.Range(0, prefabArray.Length)], new Vector3(-8f, randomY, 0f), Quaternion.identity);



4. キューブが消えるときにエフェクトを追加する

キューブが画面右端で削除される際に、爆発エフェクトやパーティクルを表示すると、より華やかな演出が可能です。

実装のポイント:

  • パーティクルシステムを用意し、Destroy時にエフェクトを生成します。

コード例(CubeMover.csの変更):

public GameObject explosionEffect;

void OnDestroy()
{
Instantiate(explosionEffect, transform.position, Quaternion.identity);
}

5. スコアシステムを追加する

プレイヤーがキューブをクリックして得点を稼ぐシステムを追加すれば、インタラクティブ性が増します。

実装のポイント:

  • キューブにOnMouseDownメソッドを実装してクリックを検知。
  • スコアを管理するスクリプトを作成。

コード例(CubeMover.csの変更):

public static int score = 0;

void OnMouseDown()
{
score += 10;
Destroy(gameObject);
}

6. サウンドを追加する

出現時や削除時にサウンドを再生すると、さらに臨場感が増します。

実装のポイント:

  • AudioSourceを追加し、音を再生するスクリプトを記述します。

コード例(CubeSpawner.csの変更):

public AudioClip spawnSound;
void SpawnCube()
{
AudioSource.PlayClipAtPoint(spawnSound, transform.position);
Instantiate(cubePrefab, new Vector3(-8f, randomY, 0f), Quaternion.identity);
}

7. 背景やカメラ演出を加える

背景にアニメーションをつけたり、カメラをキューブに追従させる演出を加えると、ゲーム全体の完成度が上がります。

実装のポイント:

  • 背景用のスプライトや画像を用意。
  • カメラにスクリプトを追加して動きをつける。

これらのアイデアを実装すれば、簡単なキューブの動きから多彩な演出が可能になります!自分だけのカスタマイズを試してみてくださいね!



よくある質問

Q
スクリプトを正しくアタッチしているのに動きません。原因は何ですか?
A

プレハブを正しく設定していない可能性があります。スクリプト内で使用するオブジェクトが正しくインスペクターにアタッチされているか確認してください。

Q
キューブの出現間隔を変更したい場合はどうすれば良いですか?
A

time = 1.0f;の値を変更することで出現間隔を調整できます。

Q
移動速度を変更するにはどうすれば良いですか?
A

transform.position += new Vector3(Time.deltaTime * 5, 0, 0);5を変更してください。

おすすめのアセット

Infinite Runner Engine 3Dは、簡単に無限ランナーゲームを作れるUnityのアセットです。キャラクターが永遠に走り続けるスタイルのゲームを作成したい方に最適です。このアセットは、プレイヤーキャラクターの動きや障害物の生成、スコアシステムなど、必要な要素がすべて揃っています。