다음 웨이브
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 18개 중 17번째.
웨이브 사이에 플레이어는 건설을 하고, 카운트다운은 남은 시간을 보여 줍니다. 준비가 된 플레이어는 버튼을 눌러 다음 웨이브를 일찍 시작할 수 있습니다. 휴식 시간은 null을 yield하는 코루틴의 루프이므로 프레임마다 한 번 실행됩니다. 남은 시간을 줄여 가며 표시하고, 시간이 다 되거나 버튼을 눌러 웨이브를 요청하면 종료됩니다. 버튼은 bool만 설정하고, 루프가 이를 확인합니다:
while (left > 0f && !skipRequested)
{
// 남은 초를 표시하고, 카운트다운한 다음, 한 프레임을 기다립니다
}
skipRequested = false;bool은 사용된 후 다시 false로 설정됩니다. 그렇지 않으면 첫 번째 이후의 모든 휴식 시간이 즉시 끝나게 됩니다. Mathf.CeilToInt는 올림하므로, 남은 시간이 2.3초이면 3으로 표시되고, 카운트다운은 마지막 1초 내내 0이 아니라 1을 표시합니다. 카운트다운은 별도의 코루틴이며, yield return StartCoroutine(Countdown());은 이를 실행하고 웨이브 루프가 계속되기 전에 완료될 때까지 기다립니다.
HUD에는 웨이브 번호도 표시됩니다. 스포너는 그 번호를 알고 GameManager가 이를 표시하므로, 스포너는 웨이브와 전체 웨이브 수를 담은 C# 이벤트 WaveStarted를 발생시킵니다. 적의 정적 이벤트와 달리 이 이벤트는 해당 스포너 하나에 속하며, GameManager는 자신의 spawner 필드를 통해 구독합니다.
챌린지
어려움WaveSpawner에 직렬화된 필드countdownText(TMP_Text)와nextWaveButton(GameObject), 그리고 버튼이 지금 웨이브를 시작하도록 호출하는public void CallNextWave()를 추가합니다.- 각 웨이브 전에 기다리는 부분을 카운트다운으로 바꾸고,
yield return StartCoroutine(Countdown());로 실행합니다. 카운트다운이 실행되는 동안 버튼이 표시되고 텍스트에는 올림한 남은 초가 표시되어Next wave in 8이 됩니다. 시간이 다 되거나 버튼을 클릭하면 카운트다운이 끝납니다. 그러면 텍스트는 비워지고 버튼은 숨겨집니다. public event Action<int, int> WaveStarted를 추가하고, 웨이브가 시작될 때 웨이브 번호(1부터 시작)와 전체 웨이브 수를 전달해 이벤트를 발생시킵니다.GameManager에 직렬화된 필드spawner(WaveSpawner)와waveText(TMP_Text)를 추가하고, WaveStarted를 구독한 다음Wave 1/8을 표시합니다.
HUD에는 WaveText, CountdownText, NextWaveButton이 있습니다. Play를 눌러 빌드하고, 첫 웨이브를 일찍 시작한 다음 Check를 누릅니다.
직접 해보기
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 = 5f;
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");
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.