Unity - Randomクラスまとめ
初めに
UnityEngine には、Random クラスがあります。このクラスには、ランダムな値を取得するだけでなく、ベクトルや Quaternion、円上の点などさまざまなものをランダムに取得できます。本記事では、Random クラスで取得できる変数をまとめます。
Index
乱数
Random.value
0.0 から 1.0 の間のランダムな浮動小数点数を取得します。
public static float value;
0.0 から 1.0 の間のランダムな浮動小数点数を取得できます。基本的には、結果を乗算して 0 から選択した範囲の数値に変換します。
(例)
using UnityEngine; public class Example : MonoBehaviour { void Start() { //0から1までのランダムな値を取得 float randomNum = Random.value; //0から5までのランダムな値を取得 float num = Random.value * 5f; } }
Random.Range
最小値と最大値の間のランダムな浮動小数点数を取得します。
//第1引数が最小値, 第2引数が最大値 public static int Range (int minInclusive, int maxInclusive); public static float Range (float minInclusive, float maxInclusive);
指定した範囲内のランダムな値を返します。次のような注意点があります。
(注意点)
- 引数と同じ型の値を返す
引数が int の場合は int を、引数が float の場合は float を返します。 - 最小値が最大値よりも大きい場合、最小値と最大値は自動的に交換される
- int 型の場合
- float 型の場合
(例)
using UnityEngine; public class Example : MonoBehaviour { void Start() { //1, 2, 3, 4 の中からランダムな整数を取得 //int型の場合, 最大値は含めない int num = Random.Range(1, 5); //0.2fから0.8fまでのランダムな値を取得 //float型の場合, 最大値を含む float value = Random.Range(0.2f, 0.8f); } }
円または球体内のランダムな点
Random.insideUnitCircle
半径 1 の円内でランダムに選択された点を取得します。
public static Vector2 insideUnitCircle;
using UnityEngine; public class ScriptExample : MonoBehaviour { void Start() { //半径5の円内のランダムな点に移動 transform.position = Random.insideUnitCircle * 5; } }
Random.insideUnitSphere
半径 1 の球体の内部でランダムに選択された点 を取得します。
public static Vector3 insideUnitSphere;
球面上の点ではなく、球体の内部の点であることに注意。
(例)
using UnityEngine; public class Example : MonoBehaviour { void Start() { //半径10の球体の内部でランダムに選択された点を取得 Vector3 vec = Random.onUnitSphere * 10; } }
Random.onUnitSphere
半径 1 の 球体の表面でランダムに選択された点を取得します。
public static Vector3 onUnitSphere ;
球面上の点を取るので、ランダムな方向を取得したい場合に使えます。
(例)
using UnityEngine; public class Example : MonoBehaviour { void Start() { GetComponent<Rigidbody>().velocity = Random.onUnitSphere * 10; } }
Quaternion
Random.rotation
ランダムな Quaternion 型の値を取得します。
public static Quaternion rotation;
ランダムな Quaternion 型の値を返します。Quaternion の各成分(x, y, z, w)は 0 から 1 の間で取得されます。
(例)
using UnityEngine; // Click the "Rotate!" button and a rotation will be applied public class ExampleClass : MonoBehaviour { void OnGUI() { if (GUI.Button(new Rect(10, 10, 100, 50), "Rotate!")) { transform.rotation = Random.rotation; } } }
※Random.rotation は完全なランダムではないようです。低速だがより高品質な乱数を使用する場合は、Random.rotationUniform を使うことができます。
public static Quaternion rotationUniform ;
Color
Random.ColorHSV
HSV でアルファ値を持つランダムな色を生成します。
//hue は色相, saturationは彩度, valueは明度, alphaはα値 public static Color ColorHSV (); public static Color ColorHSV (float hueMin, float hueMax); public static Color ColorHSV (float hueMin, float hueMax, float saturationMin, float saturationMax); public static Color ColorHSV (float hueMin, float hueMax, float saturationMin, float saturationMax, float valueMin, float valueMax); public static Color ColorHSV (float hueMin, float hueMax, float saturationMin, float saturationMax, float valueMin, float valueMax, float alphaMin, float alphaMax);
(例)
using UnityEngine; public class ColorOnClick : MonoBehaviour { void OnMouseDown() { // Pick a random, saturated and not-too-dark color GetComponent<Renderer>().material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f); } }
※Color.HSVToRGB を使うと HSV を RGB に変換することができます。
public static Color HSVToRGB (float H, float S, float V);
シード値を指定して、乱数を再現する
Random.InitState
シード値を指定し、ランダム数生成器の状態を初期化します。
public static void InitState (int seed);
使い方は下記の Random.state の例をご覧ください。
Random.state
乱数ジェネレーターの完全な内部状態を取得または設定できます。
public static Random.State state ;
(例)
using UnityEngine; public class ExampleClass : MonoBehaviour { void Start() { const int initialSeed = 1234; //シード値を初期化 Random.InitState(initialSeed); // cannot be retrieved PrintRandom("Step 1"); PrintRandom("Step 2"); //stateを取得 Random.State stateBeforeStep3 = Random.state; // can be serialized PrintRandom("Step 3"); PrintRandom("Step 4"); //stateを代入 Random.state = stateBeforeStep3; PrintRandom("Step 5"); //Step3と同じ値を取得 PrintRandom("Step 6"); //Step4と同じ値を取得 //シード値を初期化 Random.InitState(initialSeed); PrintRandom("Step 7"); PrintRandom("Step 8"); } static void PrintRandom(string label) => Debug.Log($"{label} - RandomValue {Random.Range(0, 100)}"); //0から100のランダムな値をコンソールに表示 /* コンソールの表示 Step 1 - RandomValue 38 Step 2 - RandomValue 76 Step 3 - RandomValue 69 Step 4 - RandomValue 11 Step 5 - RandomValue 69 Step 6 - RandomValue 11 Step 7 - RandomValue 38 Step 8 - RandomValue 76 */ }
最後に
ランダムに何かを取得したい場合に重宝します。