카운트다운
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 23번째.
웨이브 사이에 플레이어는 건설을 하고, 카운트다운은 남은 시간을 보여 줍니다. 준비된 플레이어는 버튼을 눌러 다음 웨이브를 일찍 시작할 수 있습니다. 휴식 시간은 코루틴에서 null을 반환하는 루프이므로 프레임마다 한 번씩 실행됩니다. 시간을 세면서 표시하고, 시간이 다 되거나 버튼을 눌러 웨이브를 요청하면 끝납니다. 버튼은 bool 값만 설정하고, 루프가 그 값을 확인합니다:
while (left > 0f && !skipRequested)
{
// 남은 초를 표시하고, 카운트다운한 다음, 한 프레임 기다린다
}
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; }를 추가합니다.- 중단 부분을
yield return StartCoroutine(Countdown());로 바꿉니다. 버튼을 표시하고, 남은 시간이 있고callNow가 아닌 동안 매 프레임 올림한 값으로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 플레이그라운드