Menu
CoddyTech

다음 웨이브

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 필드를 통해 구독합니다.

challenge icon

챌린지

어려움
  1. WaveSpawner에 직렬화된 필드 countdownText(TMP_Text)와 nextWaveButton(GameObject), 그리고 버튼이 지금 웨이브를 시작하도록 호출하는 public void CallNextWave()를 추가합니다.
  2. 각 웨이브 전에 기다리는 부분을 카운트다운으로 바꾸고, yield return StartCoroutine(Countdown());로 실행합니다. 카운트다운이 실행되는 동안 버튼이 표시되고 텍스트에는 올림한 남은 초가 표시되어 Next wave in 8이 됩니다. 시간이 다 되거나 버튼을 클릭하면 카운트다운이 끝납니다. 그러면 텍스트는 비워지고 버튼은 숨겨집니다.
  3. public event Action<int, int> WaveStarted를 추가하고, 웨이브가 시작될 때 웨이브 번호(1부터 시작)와 전체 웨이브 수를 전달해 이벤트를 발생시킵니다.
  4. 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");
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임: 타워 디펜스의 모든 레슨