カウントダウン
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 23/25。
ウェーブの合間にプレイヤーは建築を行い、カウントダウンで残り時間が表示されます。準備ができたプレイヤーは、ボタンを押して次のウェーブを早めに呼び出せます。休憩時間は、nullを返すコルーチン内のループなので、フレームごとに1回実行されます。時間をカウントダウンして表示し、時間切れになるか、ボタンでウェーブが要求されると終了します。ボタンはboolを設定するだけで、ループがそれを読み取ります:
while (left > 0f && !skipRequested)
{
// 残り秒数を表示し、カウントダウンして、1フレーム待つ
}
skipRequested = false;boolは使用後にfalseに戻します。そうしないと、最初の休憩以降は毎回すぐに終了してしまいます。Mathf.CeilToIntは切り上げるため、残り時間が2.3秒なら3と表示されます。yield return StartCoroutine(Countdown());はカウントダウンを実行し、完了するまで待ちます。
チャレンジ
難しい各ウェーブの開始までカウントダウンします。ボタンを押すと、早めに開始できます。
WaveSpawnerに、シリアライズ対象のcountdownText(TMP_Text)とnextWaveButton(GameObject)、private bool callNow;、およびpublic void CallNextWave() { callNow = true; }を追加します。- break を
yield return StartCoroutine(Countdown());に置き換えます。ボタンを表示し、残り時間があり、かつcallNowが false の間、毎フレーム、切り上げた値でNext wave in 8を表示します。 - その後、
callNowを false に戻し、テキストを消去して、ボタンを非表示にします。
「プレイ」を押します。「Next Wave」を押すと待ち時間をスキップできます。その後、「確認」を押します。
自分で試してみよう
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private List<Wave> waves = new List<Wave>();
[SerializeField] private Transform[] waypoints;
[SerializeField] private float timeBetweenWaves = 8f;
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
for (int i = 0; i < waves.Count; i++)
{
yield return new WaitForSeconds(timeBetweenWaves);
Debug.Log("Wave " + (i + 1));
Wave wave = waves[i];
for (int n = 0; n < wave.count; n++)
{
Enemy enemy = Instantiate(wave.enemy, waypoints[0].position, Quaternion.identity);
enemy.waypoints = waypoints;
yield return new WaitForSeconds(wave.spacing);
}
}
Debug.Log("All waves sent");
}
}
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド