【Unity】円状にオブジェクトを生成する

説明

前回サインカーブに引き続き、今回は円状にオブジェクトを生成します。

ちょっとリファクタリングしてますが、yの生成方法は前回と同じです。 さらに、xを同様にCosで求めるだけで、円形になります。

それぞれの周期が半分ずつずれてるので、うまい具合に円になってくれるのですが、 xとyにそれぞれCosとSin与えておけば円になるって覚えとけばなんとかなります。

f:id:rhythmcan0:20180613233826j:plain

あと、距離は円ということで 半径radiusに置き換えました。 円形なので、繰り返しについては正直意味がないんですが、 次の発展絵使えるのでとりあえず残しています。

また、真ん中の球はコピー元のオブジェクトです。 邪魔な場合は、createObjectにPrefabを指定するか、 円を生成後、createObject自体を消滅させても良いでしょう。

f:id:rhythmcan0:20180613234044j:plain

サンプルコード

using UnityEngine;

public class CircleObjectCreater : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 40; // 生成するオブジェクトの数

    [SerializeField]
    private float radius = 5f; // 半径

    [SerializeField]
    private float repeat = 2f; // 何周期するか

    void Start () {

        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π

        for (var i = 0; i < itemCount; ++i)
        {

            var point = ((float)i / itemCount) * oneCycle; // 周期の位置 (1.0 = 100% の時 2π となる)
            var repeatPoint = point * repeat; // 繰り返し位置

            var x = Mathf.Cos(repeatPoint) * radius;
            var y = Mathf.Sin(repeatPoint) * radius;

            var position = new Vector3(x, y);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }

        
    }
    
}

GitHub

github.com

発展

次は、Z軸も利用して螺旋状にオブジェクトを生成していきます。