[Unity] 半径Rの円周上のランダムな位置を取得する



2Dでの取得方法です。


 private Vector3 CircleHorizon(float radius){
        var angle = Random.Range(0,360);

        var rad = angle * Mathf.Deg2Rad;  
        var px = Mathf.Cos(rad) * radius;
        var py = Mathf.Sin(rad) * radius;
        return new Vector3(px, py, 0);
    }




原点(0,0)を中心に半径radiusのランダムな位置を取得します。原点の位置を変えたければpxとpyに座標の位置を足してあげる事になります。


var angle = Random.Range(0,360);
var rad = angle * Mathf.Deg2Rad;  
var px = Mathf.Cos(rad) * radius + ax;
var py = Mathf.Sin(rad) * radius + ay;
return new Vector3(px, py, 0);


その位置に弾を生成してターゲットに向かって飛ばしたいならこうなります。


//bulletは弾 directionは動かす方向
var pos = CircleHorizon(r) ;
var bullet.transform.position = pos ;
var direction = (target.transform.position - pos) .normalized  ;

//directionをFixedUpdateの中で足す 
bullet.transform.position += direction * speed * Time.deltaTime;


簡単に説明すると、まずランダムな角度を取得してangleに保存します。一周は360度ですがRandom.Rangeはintで指定した時はmax値が含まれないので、第2引数には359ではなく360が入ります。

ここから三角関数の話になります。詳しい説明は省きますが、取得したangleにMathf.Deg2Radをかけてラジアンという単位に変換しています。Deg2Radの中身は定数です。
Mathf.CosとMathf.Sinを使って位置を出したい時は基本的にラジアンに変更して扱います。

Unity Documentation

それに半径をかけてあげれば求めたい位置が出ます。


半径r(Min)から半径r(Max)までのランダムな位置

説明は不要かもしれませんが、要はRを欲しい範囲でランダムにすればいいので、

private Vector3 CircleHorizon(float min,float max){

        var angle = Random.Range(0,360);
        var radius = Random.Range(min,max)
        var rad = angle * Mathf.Deg2Rad;  
        var px = Mathf.Cos(rad) * radius;
        var py = Mathf.Sin(rad) * radius;
        return new Vector3(px, py, 0);

}


半径をランダムにすれば取得できます。
円の中のランダムな位置を取りたいのであればminを0にすればOKです。ですが...
そういった関数は用意されています。

var pos = Random.insideUnitCircle * radius ;

Unity Documentation

コメント