Menu
CoddyTech

カウントダウン

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());はカウントダウンを実行し、完了するまで待ちます。

challenge icon

チャレンジ

難しい

各ウェーブの開始までカウントダウンします。ボタンを押すと、早めに開始できます。

  1. WaveSpawner に、シリアライズ対象の countdownText(TMP_Text)と nextWaveButton(GameObject)、private bool callNow;、および public void CallNextWave() { callNow = true; } を追加します。
  2. break を yield return StartCoroutine(Countdown()); に置き換えます。ボタンを表示し、残り時間があり、かつ callNow が false の間、毎フレーム、切り上げた値で Next wave in 8 を表示します。
  3. その後、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プレイグラウンド