敵のウェーブ
CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 44/50。
チャレンジ
中級敵はウェーブごとに現れるようになり、ウェーブはデータとして管理されます。これまでのレッスンで作ったものはすべて残してください。アリーナ自体には敵がいなくなりました。Grunt と Dasher のプレハブにはスクリプトが設定され、四隅には4つのスポーン地点があり、中央の Spawner オブジェクトには WaveSpawner スクリプトが設定されています。
WaveSet.csに、public Enemy enemy(プレハブ)、public int count、public float spacingを持つ[System.Serializable]クラスWaveを追加します。WaveSetは[CreateAssetMenu]を持つ ScriptableObject で、public List<Wave> wavesとpublic float restBetweenWavesを持ちます。シーンのArenaアセットには3つのウェーブ(グラント3体を0.5秒間隔、ダッシャー2体を1秒間隔、グラント5体を0.4秒間隔)と、2秒の休憩時間を設定します。Enemyにpublic static event Action<Enemy> Diedを追加し、敵が破棄される直前に、その敵を渡してイベントを発生させます。WaveSpawnerには、Inspector から設定するwaveSetとspawnPoints、およびプレイ中のウェーブ番号を表すpublic int Wave { get; private set; }を用意します。Startからコルーチンを実行し、アセット内のウェーブを順番に進めます。各ウェーブでは、Waveに1を加えて、Wave 1のようにログを出力します。ウェーブのcountで指定された数の敵を、spacing秒間隔でスポーンさせます。敵i(0から開始)はspawnPoints[i % spawnPoints.Length]に出現させます。生きている敵がいなくなるまで待ってから、restBetweenWaves秒間休憩します。最後のウェーブの後は、セットの最初から再開し、Waveのカウントは続きます。つまり、4、5と増えていきます。Diedイベントを使って生存中の敵の数を数えます。OnEnableでイベントを登録し、OnDisableで登録を解除します。Spawner はアセットを読み取るだけです。Editor でゲームの実行中にアセットを変更した場合、Play 終了後もその変更はアセットに保持されます。
Play を押して、いくつかのウェーブを生き延びてから、Check を押してください。
自分で試してみよう
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
// 後のレッスンでここを実装します。ウェーブをアリーナに送り込みます。
}