【Unity】UnityのRandomクラスは地味に色々できるよって話

UnityのRandomクラスは地味に色々できることに気づいたので、機能を軽く紹介します。

Unity2019.1.0

floatやintをランダムで取得するRandom.Range

まずは一番スタンダードなRandom.Rangeです。
これを使うとintやfloat型でランダムな値が得られます。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 50; i++) {
            var rand = Random.Range(0.0f, 10.0f);
            var obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            obj.transform.position = new Vector3(rand, 0, 0);
            obj.transform.localScale = Vector3.one * 0.3f;
        }
    }
}

f:id:halya_11:20190718225833p:plain

円の中の一点をランダムに取得するRandom.insideUnitCircle

Random.insideUnitCircleを使うと円の中のランダムな一点を取得できます。
この時の円の半径は1です。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 150; i++) {
            var rand = Random.insideUnitCircle * 3;
            var obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            obj.transform.position = new Vector3(rand.x, 0, rand.y);
            obj.transform.localScale = Vector3.one * 0.3f;
        }
    }
}

f:id:halya_11:20190718230244p:plain

ランダムな色を取得するRandom.ColorHSV

Random.ColorHSVを使うと色をランダムで取得できます。
今回は使っていませんが、色相や彩度などの範囲を指定するオーバーロードも充実しています。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 150; i++) {
            var rand = Random.insideUnitCircle * 3;
            var randColor = Random.ColorHSV();
            var obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            obj.transform.position = new Vector3(rand.x, 0, rand.y);
            obj.transform.localScale = Vector3.one * 0.3f;
            obj.GetComponent<Renderer>().material.color = randColor;
        }
    }
}

f:id:halya_11:20190718230637p:plain

球の内部の一点を取得できるRandom.insideUnitSphere

Random.insideUnitSphereを使うと球の内部の一点をランダムに取得できます。
この球の半径は1です。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 150; i++) {
            var rand = Random.insideUnitSphere * 3;
            var randColor = Random.ColorHSV();
            var obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            obj.transform.position = rand;
            obj.transform.localScale = Vector3.one * 0.3f;
            obj.GetComponent<Renderer>().material.color = randColor;
        }
    }
}

f:id:halya_11:20190718231129p:plain

球の表面上の座標をランダムに取得するRandom.onUnitSphere

Random.onUnitSphereを使うと球の表面上の一点をランダムに取得できます。
この球の半径は1です。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 150; i++) {
            var rand = Random.onUnitSphere * 3;
            var randColor = Random.ColorHSV();
            var obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            obj.transform.position = rand;
            obj.transform.localScale = Vector3.one * 0.3f;
            obj.GetComponent<Renderer>().material.color = randColor;
        }
    }
}

f:id:halya_11:20190718230916p:plain

ランダムな回転値を取得するRandom.rotation

Random.rotationを使うとランダムな回転値を取得できます。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 200; i++) {
            var randPos = Random.onUnitSphere * 3;
            var randRot = Random.rotationUniform;
            var randColor = Random.ColorHSV();
            var obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            obj.transform.position = randPos;
            obj.transform.rotation = randRot;
            obj.transform.localScale = Vector3.one * 0.3f;
            obj.GetComponent<Renderer>().material.color = randColor;
        }
    }
}

f:id:halya_11:20190718231518p:plain

ちなみにRandom.rotationUniformというプロパティも用意されていて、こちらは分布が均一になるとのことです。

参考

docs.unity3d.com