Menu
CoddyTech

카운트다운

Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 23번째.

웨이브 사이에 플레이어는 건설을 하고, 카운트다운은 남은 시간을 보여 줍니다. 준비된 플레이어는 버튼을 눌러 다음 웨이브를 일찍 시작할 수 있습니다. 휴식 시간은 코루틴에서 null을 반환하는 루프이므로 프레임마다 한 번씩 실행됩니다. 시간을 세면서 표시하고, 시간이 다 되거나 버튼을 눌러 웨이브를 요청하면 끝납니다. 버튼은 bool 값만 설정하고, 루프가 그 값을 확인합니다:

while (left > 0f && !skipRequested)
{
    // 남은 초를 표시하고, 카운트다운한 다음, 한 프레임 기다린다
}
skipRequested = false;

사용한 뒤에는 bool 값을 다시 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. 중단 부분을 yield return StartCoroutine(Countdown());로 바꿉니다. 버튼을 표시하고, 남은 시간이 있고 callNow가 아닌 동안 매 프레임 올림한 값으로 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 플레이그라운드