Unity:プレハブをランダムな位置に生成させる

Unity

作ったプレハブをシーン上のランダムな位置に生成させるスクリプトを紹介します。

プレハブをスクリプトからの生成方法する基本を知りたい方は以下をご覧ください。

シーンの準備

シーンにPlaneCubeを1つずつ配置します。

Cubeは「落ちてくるCube」として後ほどプレハブ化します。

まずCubeにRigidbodyを追加しておきます。

Materialで適当に色をつけました。(色はつけなくてもいいです。気分なので)

一旦、実行確認して落ちてくることを確認します。

うまくいったので、Cubeをプレハブ化しておきます。

プレハブ化したらシーン上のCubeは削除しておいてください。

Planeを選択して、InspectorウインドウのPosition項目を全て0にしておきます。
※作るタイミングによってPlaneの位置がまちまちのため

シーンの準備は以上です。

スクリプトの作成と設定

Plane上のランダムな位置にプレハブ化したCubeが落ちてくるようにします。

RandomCubeという名前でC#スクリプトを作成します。

RandomCubeをダブルクリックしてVisual Studioを起動し、以下のハイライト部分を入力してください。

RandomCube

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

public class RandomCube : MonoBehaviour
{
    // 生成するプレハブ格納用
    public GameObject PrefabCube;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // 30フレーム毎にシーンにプレハブを生成
        if(Time.frameCount % 30 == 0)
        {
            // プレハブの位置をランダムで設定
            float x = Random.Range(-5.0f, 5.0f);
            float z = Random.Range(-5.0f, 5.0f);
            Vector3 pos = new Vector3(x, 10.0f, z);

            // プレハブを生成
            Instantiate(PrefabCube, pos, Quaternion.identity);
        }    
    }
}

スクリプトアタッチ用に空のオブジェクトを作成します。

Hierarchyウインドウで、 + > Create Empty を選択し、名前をGameMainとしておきます。

RandomCubeをGameMainにドラッグ&ドロップしてアタッチします。

GameMainを選択し、InspectorウインドウのPrefab Cube項目にAssetsフォルダのCubeプレハブをドラッグ&ドロップします。

実行確認します。
Plane上のランダムな位置にCubeプレハブが落ちてくれば成功です!

スクリプト解説

デフォルトのPlaneは、シーン上で10×10のサイズです。
中心の位置を(X, Y, Z) = (0, 0, 0)としたのでX軸とZ軸はそれぞれマイナス方向にサイズが5ある状態になっています。

スクリプトでは、Cubeの位置をY軸のみ10.0で固定にして、X軸とZ軸をランダムな位置に設定しています。

乱数の範囲は、X軸・Z軸それぞれ -5 ~ 5 の範囲で乱数を発生させればいいことになります。
乱数の範囲指定には、Random.Range関数が便利です。

float x = Random.Range(-5.0f, 5.0f);
float z = Random.Range(-5.0f, 5.0f);

これをVector3型の変数に代入してプレハブの生成位置変数posに決定しています。

Vector3 pos = new Vector3(x, 10.0f, z);

プレハブを指定した位置に設定するにはInstantiate関数を使います。

Instantiate(PrefabCube, pos, Quaternion.identity);

第1引数のPrefabCubeは、public型で宣言してあるため、Inspectorウインドウから生成したいプレハブを設定できるようになります。

public GameObject PrefabCube;

これらのスクリプト全体を30フレームに1回の割合で実行するようにTime.frameCountを使って制御しています。30の部分の数値は適当に変えてみてください。

// 30フレーム毎にシーンにプレハブを生成
if(Time.frameCount % 30 == 0)
{
    // プレハブの位置をランダムで設定
    float x = Random.Range(-5.0f, 5.0f);
    float z = Random.Range(-5.0f, 5.0f);
    Vector3 pos = new Vector3(x, 10.0f, z);

    // プレハブを生成
    Instantiate(PrefabCube, pos, Quaternion.identity);
}

以上、Unity:プレハブをランダムな位置に生成させるでした。

コメント

タイトルとURLをコピーしました