Unityで指定した範囲の乱数の生成方法と注意点を実際にサンプルを作って確認します。
Unityで指定範囲の乱数を生成するには、RandomクラスのRandom.Range関数を利用します。
乱数を扱うならまずは憶えておくべき関数でしょう。
公式リファレンス – Random.Range
以下にRandom.Range関数の実際の使い方を示します。
乱数をコンソールに出力する
指定範囲の乱数を生成してコンソール出力させてみます。
新規プロジェクトを作成し、Project nameを「乱数を使う」としておきます。
乱数を表示するためのスクリプトを作成します。
Assetsフォルダで 右クリック > Create > C# Script を選択して名前をRansuとします。
スクリプトファイルRansuをダブルクリックして開きます。
Startメソッド内に以下の2行を入力します。
int n = Random.Range(0, 10);
Debug.Log(n);
スクリプト全体のイメージ(ハイライト部分が追加したスクリプト)
Ransu
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ransu : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
int n = Random.Range(0, 10);
Debug.Log(n);
}
// Update is called once per frame
void Update()
{
}
}
スクリプトをアタッチするための空のオブジェクトを作成します。
Hierarchyウインドウから + > Create Empty を選択し、GameMainと名称変更します。
スクリプトファイルRansuをドラッグ&ドロップしてGameMainにアタッチします。
実行確認します。
画面左下に数値が表示されていれば成功です。表示される数値は実行するたびに変わります。
数値の範囲は0~9の整数となります。何度か実行して確認してみてください。
スクリプト解説
Random.Range関数は引数に生成したい乱数の範囲を指定できる便利な関数です。
ただし、引数のが整数の場合(1や5など)と引数が実数の場合(1.0fや12.5fなど)とで乱数の戻り値に違いがありますので、解説します。
引数が整数の場合
引数を1や10などの整数を指定すると生成される乱数も整数(int型)となります。
例)
int n = Random.Range(0, 10);
引数に(0, 10) と指定すると0~9までの整数型乱数が返ってきます。
Random.Range( 最小値, 最大値 )
最小値に指定した数は乱数として生成されますが、最大値に指定した数は生成されません。
最大値 – 1 が生成される最大の乱数となります。ここが注意点です。
引数が実数の場合
引数を1.0fなどの実数を指定すると生成される乱数も実数(float型)となります。
例)
float n = Random.Range(0.0f, 10.0f);
上記例では、変数nに 0.0 ~ 10.0 の範囲の乱数が生成されます。
最小値・最大値とも引数に指定した数も生成される乱数に含まれます。
試しに先ほどのスクリプトの10行目を上記に置き換えて実行してみてください。
実行イメージ(0.0~10.0の範囲の値で乱数が生成される)
【注意】スクリプトにusing System;を書くとUnityの乱数命令が使えない
C#で通常利用するusing System; がスクリプトの先頭にあるとUnityでのRandomクラスを認識してくれません。
これはSystemとUnityEngine両方にRandomクラスが定義されているためで、Unityで乱数を扱うのであればUnityEngine側のRandomクラスを使うべきです。
もし、スクリプト入力中にRandom.と入力してRangeなどの候補が表示されないようでしたらスクリプト先頭にusing System; がないか確認してみてください。
Randomクラスその他の命令
Random.Range以外にもRandomクラスには乱数を返す便利な変数があります。
いくつか紹介します。
0.0 ~ 1.0 の範囲のランダムな実数を返す
Random.valueを使うと0.0~1.0までのランダムな実数を返してくれる極めてシンプルな変数です。
スクリプト例
float n = Random.value;
Debug.Log("Random.value: " + n);
実行結果
Random.value: 0.7791138
半径1の円の内部のランダムな点を返す
Random.insideUnitCircleを使うとVector2型の半径1の円の内部のランダムな点を返してくれます。
スクリプト例
Vector2 pos = Random.insideUnitCircle;
Debug.Log("insideUnitCircle: " + pos);
実行結果
insideUnitCircle: (-0.3, 0.1)
半径1の球体の表面上にランダムな点を返す
Random.onUnitSphereを使うとVector3型の半径1の球体の表面上にランダムな点を返してくれます。
スクリプト例
Vector3 pos = Random.onUnitSphere; Debug.Log("onUnitSphere: " + pos);
実行結果
onUnitSphere: (0.6, 0.6, -0.5)
Randomクラスの詳細はUnityスクリプトリファレンスを参照してください。
以上、Unityで乱数を扱う場合の基本と注意点でした。
コメント