倒计时
Coddy Unity 塔防游戏 课程的第 23 课,共 25 课。
波次之间,玩家可以建造,倒计时会显示还剩多长时间。准备好的玩家可以按下按钮,提前召唤下一波。间歇部分是协程中的一个循环,它会让出 null,因此每帧运行一次:倒计时、显示剩余时间,并在时间到或按钮请求开始下一波时结束。按钮只会设置一个布尔值,循环会读取它:
while (left > 0f && !skipRequested)
{
// 显示剩余秒数,继续倒计时,等待一帧
}
skipRequested = false;使用后,布尔值会恢复为 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());:显示按钮,并在剩余时间大于 0 且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 在线编辑器