UnityにおけるRandomクラスのランダムな空間位置生成に関する技術資料
目次
概要
UnityのRandom
クラス(UnityEngine
名前空間)の一部であるinsideUnitSphere
、insideUnitCircle
、onUnitSphere
などのプロパティおよび関連メソッドは、ゲームやシミュレーション開発において、空間内のランダムな点・方向を簡易に生成する手段を提供します。これらは、シーン内へのオブジェクトのランダム配置、パーティクルエフェクトの拡散、ランダムな初期位置・方向の設定など、幅広い用途に使用可能です。
各プロパティ・メソッドの詳細
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;
}
}
応用例
- オブジェクトの散布:
Random.insideUnitSphere
から得られる座標を拡大・平行移動することで、任意の半径や任意の中心位置に分布させることができます。たとえば、半径10の球領域にオブジェクトをばらまくには、transform.position = Random.insideUnitSphere * 10f + centerPosition;
とすればよいです。 - パーティクルシステムへの応用:
パーティクルの初期位置や初期速度をRandom.insideUnitSphere
やRandom.onUnitSphere
でバラつかせることで、自然な拡散エフェクトを実現できます。 - 2Dゲームでのアイテム配置:
Random.insideUnitCircle
を用いて、2Dマップ上で自然なランダム配置が可能です。これにより、毎回異なるゲームプレイ体験を提供できます。
注意点
Random
クラスで生成される乱数はフレームごとに同じシードで呼ばれた場合、同一の結果を得る可能性があります。テストやリプレイ用に再現可能な乱数系列を生成したい場合は、Random.InitState()
を用いてシード値を固定します。- 位置や方向のスケーリングや変換は、状況に応じて適用します。
insideUnitSphere
やinsideUnitCircle
は常に半径1の単位球・単位円が基準なので、任意の大きさ・位置の領域で使用したい場合は、結果に適宜スケールやオフセットを加えます。
まとめ
Random.insideUnitSphere
: 半径1の球体内部からランダム点を取得(3D)。Random.onUnitSphere
: 半径1の球体表面からランダム方向ベクトルを取得(3D)。Random.insideUnitCircle
: 半径1の円内部からランダム点を取得(2D)。
これらを活用することで、3Dおよび2D空間における自然なランダム性を簡易に実装可能です。加えて、Random.rotation
やRandom.rotationUniform
による回転のランダム化も組み合わせることで、よりバリエーション豊かなシーン構築が行えます。
ディスカッション
コメント一覧
まだ、コメントがありません