UnityにおけるRandomクラスのランダムな空間位置生成に関する技術資料

概要

UnityのRandomクラス(UnityEngine名前空間)の一部であるinsideUnitSphereinsideUnitCircleonUnitSphereなどのプロパティおよび関連メソッドは、ゲームやシミュレーション開発において、空間内のランダムな点・方向を簡易に生成する手段を提供します。これらは、シーン内へのオブジェクトのランダム配置、パーティクルエフェクトの拡散、ランダムな初期位置・方向の設定など、幅広い用途に使用可能です。


各プロパティ・メソッドの詳細

Random.insideUnitSphere

説明:

  • 原点(0,0,0)を中心とした半径1の球体内部から、ランダムに一様分布した点(Vector3)を取得します。
  • 球内部であればどの場所も等確率で選ばれます。

用途例:

  • 3D空間内でオブジェクトをランダム分布させる。
  • エフェクトや粒子(パーティクル)の初期位置を球状にばらつかせる。

サンプルコード:

using UnityEngine;

public class Random3DPosition : MonoBehaviour
{
    void Start()
    {
        // ユニットスフィア内部のランダムな点を取得
        Vector3 randomPoint = Random.insideUnitSphere;

        // このオブジェクトの位置に適用
        transform.position = randomPoint;
    }
}

Random.onUnitSphere

説明:

  • 原点(0,0,0)を中心とした半径1の球体表面上の点(Vector3)をランダムに取得します。
  • 内部ではなく表面のみを対象とするため、常にベクトルの長さは1になります。

用途例:

  • 一定の距離を保ちながらランダムな方向を取得したい場合
  • ランダムな方向性を示す際の初期値として利用

サンプルコード:

using UnityEngine;

public class RandomDirection : MonoBehaviour
{
    void Start()
    {
        // ユニットスフィア表面上のランダム点を取得(方向ベクトルとして有用)
        Vector3 randomDirection = Random.onUnitSphere;

        // 方向ベクトルとして利用、例えば遠方へのレイキャストなど
        Ray ray = new Ray(Vector3.zero, randomDirection);
    }
}

Random.insideUnitCircle

説明:

  • 原点(0,0)を中心とした半径1の円内部から、一様分布したランダムな点(Vector2)を取得します。
  • 2Dゲーム、2D UI、2D上の配置などで特に有用です。

用途例:

  • 2D空間内でランダムなスポーンポイント生成
  • 2Dエフェクト(パーティクル、UIアニメーション)における初期座標のばらつき

サンプルコード:

using UnityEngine;

public class Random2DPosition : MonoBehaviour
{
    void Start()
    {
        // ユニットサークル内部のランダムな点を取得(Vector2)
        Vector2 randomPoint2D = Random.insideUnitCircle;

        // 2Dオブジェクトの位置をセット(Z軸は既存の値を使用)
        transform.position = new Vector3(randomPoint2D.x, randomPoint2D.y, transform.position.z);
    }
}

その他の関連メソッド

  • Random.rotation / Random.rotationUniform: ランダムな回転(Quaternion)を生成します。
    用途: オブジェクトの初期向きをランダムにする、エフェクトの方向をランダム化するなど。
using UnityEngine;

public class RandomRotationExample : MonoBehaviour
{
    void Start()
    {
        // ランダムな回転を生成
        Quaternion randomRot = Random.rotation;

        // オブジェクトに適用
        transform.rotation = randomRot;
    }
}

応用例

  1. オブジェクトの散布:
    Random.insideUnitSphereから得られる座標を拡大・平行移動することで、任意の半径や任意の中心位置に分布させることができます。たとえば、半径10の球領域にオブジェクトをばらまくには、transform.position = Random.insideUnitSphere * 10f + centerPosition; とすればよいです。
  2. パーティクルシステムへの応用:
    パーティクルの初期位置や初期速度をRandom.insideUnitSphereRandom.onUnitSphereでバラつかせることで、自然な拡散エフェクトを実現できます。
  3. 2Dゲームでのアイテム配置:
    Random.insideUnitCircleを用いて、2Dマップ上で自然なランダム配置が可能です。これにより、毎回異なるゲームプレイ体験を提供できます。

注意点

  • Randomクラスで生成される乱数はフレームごとに同じシードで呼ばれた場合、同一の結果を得る可能性があります。テストやリプレイ用に再現可能な乱数系列を生成したい場合は、Random.InitState()を用いてシード値を固定します。
  • 位置や方向のスケーリングや変換は、状況に応じて適用します。insideUnitSphereinsideUnitCircleは常に半径1の単位球・単位円が基準なので、任意の大きさ・位置の領域で使用したい場合は、結果に適宜スケールやオフセットを加えます。

まとめ

  • Random.insideUnitSphere: 半径1の球体内部からランダム点を取得(3D)。
  • Random.onUnitSphere: 半径1の球体表面からランダム方向ベクトルを取得(3D)。
  • Random.insideUnitCircle: 半径1の円内部からランダム点を取得(2D)。

これらを活用することで、3Dおよび2D空間における自然なランダム性を簡易に実装可能です。加えて、Random.rotationRandom.rotationUniformによる回転のランダム化も組み合わせることで、よりバリエーション豊かなシーン構築が行えます。

Unity

Posted by hidepon