Unityでボーリングゲームを作る #7 オブジェクトを自動で整列する

投稿者: | 2020-02-01


ボーリングのピンのオブジェクトを置く位置を手入力するのではなく、スクリプトで自動で決めて整列させてみます。

void SetNewPins(Transform t, float interval, int line_total)
{
    int line = 0; // 行
    int column = 1; // 列

    for (int o = 0; o < line_total; o++)
    {

        for (int p = 0; p < column; p++)
        {
            Vector3 pos = t.position;

            // 先頭のピンを基準に位置を変える
            pos -= t.forward * (interval * line); // 置く列に合わせて後ろに下げる
            pos += t.right * (interval * p - interval / 2 * line); // 横方向に動かす

            Instantiate(bowling_pin, pos, Quaternion.Euler(0f, 0f, 0f));
        }

        line++;
        column++;
    }

}

先頭のピンの位置と向きを伝えるために、空のゲームオブジェクト等のTransformを渡します。その他に、ピンとピンの間隔と並べるピンの行数を渡すと自動で整列されたボーリングのピンを生成します。

空のゲームオブジェクトの向いている方向の単位ベクトルはtransform.forwardで得られるので、それを空のゲームオブジェクトの位置から引くと、その分位置が後ろに下がります。これに間隔と行数をかけた値をかければ、行の値が増えるほど、後ろに配置されます。
行数を0から始めれば、1本目はその場に置かれ、2本目からは1行分、4本目からは2行分後ろに下げられます。

そうして置く行が決まると、今度はその行の何列目かによって、同じ間隔だけ間をあけて横に並べた後、間隔の値の半分を単位として逆方向にずらせば良いと思いました。1行目(0行目)は1/2 * 0 = 0、2行目は1/2 * 1 = 1/2、3行目は1/2 * 2 = 1、4行目は1/2 * 3 = 3/2 というふうに、全体が三角形になるように置くために行全体を横にずらすための値が行数によって決まるので、簡単な繰り返し文で作れました。

一本ずつ位置を決めてインスタンスを作っています。

等間隔でちゃんと配置されている気がします。

引数を変えればいろんな場所・サイズに配置できます。

コメントを残す

メールアドレスが公開されることはありません。