Menu
CoddyTech

ウェーブ

Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 4/18。

敵はウェーブごとに出現します。つまり、同じ種類の敵のグループが道に沿って間隔を空けて配置され、次のグループが現れる前に休止時間があります。ウェーブは数個の数値で構成されるため、[System.Serializable] クラスです。スポーナーは List<Wave> を保持し、Inspectorには入力用の行として表示されます。[System.Serializable] がないと、UnityはWaveを保存できず、Inspectorにリストも表示されず、リストは空のままです。

タイミング制御にはコルーチンを使います。これは、スポーンした後に new WaitForSeconds(...) を返して、ゲームの残りの処理を止めずに待つループです。花火ショーも同じように、連発ごとに休止を挟みながら進行します。

IEnumerator Show()
{
    foreach (Salvo salvo in salvos)
    {
        for (int i = 0; i < salvo.rockets; i++)
        {
            Instantiate(rocketPrefab, launcher.position, Quaternion.identity);
            yield return new WaitForSeconds(salvo.gap);
        }
        yield return new WaitForSeconds(pause);
    }
}

敵は今やプレハブです。プレハブのフィールドが参照できるのは、アセットとプレハブ内のオブジェクトだけなので、新しい敵の waypoints 配列は空です。スポーナーが経路を保持し、Instantiate の直後にすべての敵へ渡します。Instantiateは渡された型のオブジェクトを返すため、Enemy型のプレハブフィールドを使えば、新しいEnemyが返され、すぐに設定できます。

challenge icon

チャレンジ

簡単

Grunt と Runner はプレハブになり、独自の EnemyData を持つ Tank と Boss も加わりました。Spawner オブジェクトは WP0 にあります。敵をウェーブごとに送り出しましょう。

  1. Wave.cs で、Wave をシリアライズ可能なクラスにし、次の public フィールドを作成します。enemy(Enemy 型。プレハブ)、count(int 型)、spacing(float 型。敵同士の間隔を秒で指定)。
  2. WaveSpawner に、シリアライズされた private フィールドを3つ追加します。waves(List<Wave>)、waypoints(Transform 配列)、timeBetweenWaves(float)。
  3. Start から、ウェーブを順番に処理するコルーチンを実行します。各ウェーブについて、timeBetweenWaves 秒待ち、ウェーブ番号を1から数えて Wave 1 のようにログに出力し、そのウェーブの count で指定された数の敵を最初のウェイポイントに出現させ、それぞれに waypoints を設定してから、敵を出現させるごとに spacing 秒待ちます。
  4. 最後のウェーブの後、All waves sent をログに出力します。

Inspector でゲームの8つのウェーブと、8秒の休止時間を設定します。Play を押して最初のウェーブが来るのを見たら、Check を押しましょう。

自分で試してみよう

using UnityEngine;

// 後で実装:敵を波状に経路に沿って送り出す。
public class WaveSpawner : MonoBehaviour
{
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityゲーム:タワーディフェンスのすべてのレッスン