ウェーブ
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が返され、すぐに設定できます。
チャレンジ
簡単Grunt と Runner はプレハブになり、独自の EnemyData を持つ Tank と Boss も加わりました。Spawner オブジェクトは WP0 にあります。敵をウェーブごとに送り出しましょう。
Wave.csで、Wave をシリアライズ可能なクラスにし、次の public フィールドを作成します。enemy(Enemy 型。プレハブ)、count(int 型)、spacing(float 型。敵同士の間隔を秒で指定)。WaveSpawnerに、シリアライズされた private フィールドを3つ追加します。waves(List<Wave>)、waypoints(Transform 配列)、timeBetweenWaves(float)。Startから、ウェーブを順番に処理するコルーチンを実行します。各ウェーブについて、timeBetweenWaves秒待ち、ウェーブ番号を1から数えてWave 1のようにログに出力し、そのウェーブのcountで指定された数の敵を最初のウェイポイントに出現させ、それぞれにwaypointsを設定してから、敵を出現させるごとにspacing秒待ちます。- 最後のウェーブの後、
All waves sentをログに出力します。
Inspector でゲームの8つのウェーブと、8秒の休止時間を設定します。Play を押して最初のウェーブが来るのを見たら、Check を押しましょう。
自分で試してみよう
using UnityEngine;
// 後で実装:敵を波状に経路に沿って送り出す。
public class WaveSpawner : MonoBehaviour
{
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。