Menu
CoddyTech

倒计时

Coddy Unity 塔防游戏 课程的第 23 课,共 25 课。

波次之间,玩家可以建造,倒计时会显示还剩多长时间。准备好的玩家可以按下按钮,提前召唤下一波。间歇部分是协程中的一个循环,它会让出 null,因此每帧运行一次:倒计时、显示剩余时间,并在时间到或按钮请求开始下一波时结束。按钮只会设置一个布尔值,循环会读取它:

while (left > 0f && !skipRequested)
{
    // 显示剩余秒数,继续倒计时,等待一帧
}
skipRequested = false;

使用后,布尔值会恢复为 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());:显示按钮,并在剩余时间大于 0 且 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 在线编辑器