【Unity初心者向け】作りながら覚えるゲーム制作講座 #6 乱数で弾の位置と速さをランダムに

前回の講座では、弾を作って自機が弾に当たるとゲームオーバーになる処理を実装しました!
ただ、弾が毎回同じ場所に繰り返し出現しているだけで、まだゲームとしては物足りなかったですね。

今回は弾の動きに変化をつけるため、発射位置と速さをランダムにしたい思います!
そして、弾の数を増やしてゲームの難易度を良い感じに調整します!

弾の出現位置をランダムにする

まずは、出現する位置をランダムにしてみましょう。
ここでは、X座標が -8.0 ~ 8.0 の間になるようにしてみます。

乱数について

座標などの値をランダムにするには、ランダムな数値を生成して、それを設定する必要があります。
ランダムな数値のことを、 「乱数」 と呼びます!
Unity で乱数を使うには、 Random.Range というものを使います。

具体的には、 Random.Range(乱数の最小値, 乱数の最大値) と書くことで乱数を生成できます。
例えば、 -8.0 ~ 8.0 の乱数にしたい場合、 Random.Range(-8.0f, 8.0f) と書きます。

乱数で位置を設定

では、実際に乱数で位置を設定してみましょう!

今まで X座標 は 0.0 という定数を使っていましたが、これを x という変数に置き換えます。
そして、 x の値を乱数を使って設定するようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    float x = 0.0f;
    float y = 12.0f;

    // Update is called once per frame
    void Update()
    {
        // 下に移動
        y -= 10.0f * Time.deltaTime;

        // 地面より下に行った場合
        if (y < 0.0f)
        {
            // 初期化
            x = Random.Range(-8.0f, 8.0f);
            y = 12.0f;
        }

        // 位置を更新
        transform.localPosition = new Vector3(x, y, 0);
    }
}

これで、弾の位置が毎回ランダムになるようになりましたね!

今回は float(小数)型 の乱数を生成しました。
ちなみに、 int(整数)型 の乱数も同じ書き方で生成できます。
ただ、注意点として int 型の乱数の場合は最大値は生成される乱数に含まれません
例えば、 Random.Range(0, 10) と書くと 0 ~ 9 までの乱数になります。

弾の速さをランダムにする

続いて、落下する速さもランダムにしてみましょう。
ここでは 5.0 ~ 15.0 の間になるようにしてみます。

乱数で速さを設定

今まで速さは 5.0 という定数を使っていましたが、これを speed という変数に置き換えます。
そして、 speed の値も乱数を使って設定するようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    float x = 0.0f;
    float y = 12.0f;
    float speed = 10.0f;

    // Update is called once per frame
    void Update()
    {
        // 下に移動
        y -= speed * Time.deltaTime;

        // 地面より下に行った場合
        if (y < 0.0f)
        {
            // 初期化
            x = Random.Range(-8.0f, 8.0f);
            y = 12.0f;
            speed = Random.Range(5.0f, 15.0f);
        }

        // 位置を更新
        transform.localPosition = new Vector3(x, y, 0);
    }
}

これで、弾の速さも毎回ランダムになるようになりました!

最初の落下からランダムが適用されるようにする

これで完全にランダムになったように見えますが、実は最初の落下だけは毎回同じ動きになっています。
これは、ランダムが適用されるのが if 文に入った時なので、最初に地面に着くまではランダムが適用されていないのです。

これを修正するには、 y の初期値を 0.0 より小さい値にしてください。
ここでは -1.0 にしてみます。

float y = -1.0f;

これで、開始後すぐに if 文の中に入るので、実質最初の落下からランダムな動きになります!

本当は初期化処理を分けて書いたほうが良いのですが、今回は一番簡単な方法で実現させています。

弾を増やす

では、最後に弾の数を増やしてみましょう!
作った Bullet オブジェクトを好きな数だけコピー&ペーストしてください。
ここでは 5 個に増やしてみます。

ゲームを実行すると、それぞれの弾がちゃんと独立して動作していますね!

まとめ

これで、弾が最終形態になりました。

次回はいよいよクライマックスで、ゴール地点クリア/ゲームオーバー表示を作成します!
次回でついにゲームが完成です!!