ステージの作り方(2):障害物生成オブジェクトの作成

前回の作業で動く障害物を作ることができました。あとはそれを適当なタイミングで生成すれば良いので、ここで障害物を自動生成するゲームオブジェクト(Spawner)を作っていきましょう。


※Spawnerとは、敵などを生成するゲームオブジェクトを指す用語です。「Spawn(スポーン)」は産卵する・大量に発生する、といった意味の単語で、洋ゲーとかでよく使われます。

スポンサーリンク

Spawnerのゲームオブジェクトの作成

では、まずは障害物生成用オブジェクトのゲームオブジェクトを作ります。

シーンに空のゲームオブジェクトを作り、

  • 名前:WallSpawner
  • タグ:WallSpawner(※新しく作ってください)

に変更しましょう。

SpawnerのC#スクリプト

次に障害物を生成するためのC#スクリプトを書いていきます。「Scripts」内の「Obstacle」フォルダに新しいC#スクリプトを作り、名前を「WallSpawner」に変更して次のスクリプトを書いてください。

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

public class WallSpawner : MonoBehaviour
{

    public bool isActive = false;

    [SerializeField]
    GameObject wallPrefab = null;
    [SerializeField, Min(0.1f)]
    float defaultMinWaitTime = 1;
    [SerializeField, Min(0.1f)]
    float defaultMaxWaitTime = 1;
    [SerializeField]
    Vector2 defaultMinSize = Vector2.one;
    [SerializeField]
    Vector2 defaultMaxSize = Vector2.one;

    bool isSpawning = false;
    float minWaitTime;
    float maxWaitTime;
    Vector2 minSize;
    Vector2 maxSize;
    Coroutine timer;

    //外部から値を代入するためのプロパティ
    public float MinWaitTime
    {
        set
        {
            //あまりにも小さい値になるとものすごい数の障害物が生成されてしまうので、0.1未満にならないようにする
            minWaitTime = Mathf.Max(value, 0.1f);
        }
        get
        {
            return minWaitTime;
        }
    }

    public float MaxWaitTime
    {
        set
        {
            maxWaitTime = Mathf.Max(value, 0.1f);
        }
        get
        {
            return maxWaitTime;
        }
    }

    void Start()
    {
        InitSpawner();
    }

    void Update()
    {
        if (!isActive)
        {
            //生成中なら中断する
            if(timer != null)
            {
                StopCoroutine(timer);
                isSpawning = false;
            }

            return;
        }

        //生成中じゃないなら生成開始
        if (!isSpawning)
        {
            timer = StartCoroutine("SpawnTimer");
        }
    }

    //初期化用メソッド
    public void InitSpawner()
    {
        minWaitTime = defaultMinWaitTime;
        maxWaitTime = defaultMaxWaitTime;
        minSize = defaultMinSize;
        maxSize = defaultMaxSize;
    }

    //生成処理を行うコルーチン
    IEnumerator SpawnTimer()
    {
        isSpawning = true;

        GameObject wallObj = Instantiate(wallPrefab, transform.position, Quaternion.identity);
        Wall wall = wallObj.GetComponent<Wall>();

        float sizeX = Random.Range(minSize.x, maxSize.x);
        float sizeY = Random.Range(minSize.y, maxSize.y);
        wall.SetWall(new Vector2(sizeX, sizeY));

        float waitTime = Random.Range(minWaitTime, maxWaitTime);
        yield return new WaitForSeconds(waitTime);

        isSpawning = false;
    }

}

コメントを入れてあるので詳しい説明は省きますが、内容としては

  • ランダムな生成間隔で
  • ランダムな大きさの障害物を生成する

スクリプトになっています。

書けたらこのスクリプトを先ほど作ったWallSpawnerにアタッチして、座標を(10, -3, 0)くらいに設定し、「Wall Prefab」に障害物のプレハブを設定してください。できたらWallSpawnerをプレハブ化しておきましょう。

ここまできちんとできていれば、ゲームを実行したときに下のGIFのようになると思います。

障害物を自動生成した場合の例

(クリックで再生)

障害物の大きさを変えたい場合は、「Default Min Size」「Default Max Size」の値を適当に変更してください。


次のページ→ゲーム管理オブジェクト(GameManager)の作成&UIの追加