ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - Randomクラスまとめ

初めに

 UnityEngine には、Random クラスがあります。このクラスには、ランダムな値を取得するだけでなく、ベクトルや Quaternion、円上の点などさまざまなものをランダムに取得できます。本記事では、Random クラスで取得できる変数をまとめます。

乱数

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 型の場合  min \leq 戻り値 < max
  • float 型の場合  min \leq 戻り値 \leq max

(例)

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
*/
}

最後に

 ランダムに何かを取得したい場合に重宝します。