확장하기 01: 게임 시작 카운트다운 (3, 2, 1, Go!)
💬 이 실습을 하기 전에
코루틴이 어렵게 느껴져도 걱정하지 마세요. 이 실습에서는 코드를 그대로 복사해서 Spawner에 넣고, Canvas에 텍스트 하나만 만들어서 연결하면 됩니다. “왜 이렇게 하면 되는지”는 나중에 천천히 이해해도 괜찮습니다. 먼저 화면에 3, 2, 1, Go! 가 나오는 걸 보는 것이 중요합니다.
📌 이 실습은?
게임이 시작될 때 화면에 3 → 2 → 1 → Go! 를 보여 준 뒤, 그다음에 첫 블록이 나오게 하는 연습입니다.
필요한 것: 8단계까지 완료한 Tetris 씬, Canvas에 카운트다운용 텍스트 하나.
🎯 목표 (한 줄 요약)
- Start() 에서 바로 블록을 만들지 않고, 코루틴으로 “3 → 2 → 1 → Go!” 를 1초씩 보여 준 뒤 그다음에 첫 블록을 만든다.
🛠️ 1. UI 준비 (Canvas에 카운트다운 텍스트)
아래 순서대로 하면 됩니다. 한 단계씩 진행하세요.
- Hierarchy에서 Canvas 선택 → 우클릭 → UI → Text - TextMeshPro (또는 Text - Legacy).
- 이름을 CountdownText 로 바꾼다.
- Rect Transform: 화면 중앙에 두기 (Anchor 중앙, Pos X/Y 0, Width 400, Height 150 정도).
- 폰트 크기: 80~120 정도로 키워서 “3”, “2”, “1”, “Go!” 가 잘 보이게 한다.
- 정렬: 가운데 정렬 (Horizontal & Vertical Alignment: Center).
- 처음에는 비어 있거나 “3”이 보이기 전까지 숨겨 두려면, GameObject.SetActive(false) 로 나중에 켜도 된다. 아래 코드에서는 처음에 비활성으로 두고, 코루틴 시작할 때 SetActive(true) 로 켠 뒤, 끝나면 SetActive(false) 로 끈다.
(TextMeshPro를 쓰면 TMP_Text, Legacy Text를 쓰면 Text 타입으로 연결하면 됩니다. 아래 예시는 TMP_Text 기준입니다.)
🛠️ 2. Spawner 수정 (코루틴으로 카운트다운 후 스폰)
Spawner.cs를 아래 전체 코드로 통째로 교체해도 됩니다. (기존 Spawner에 이미 있는 내용 + 카운트다운만 추가된 버전입니다.)
바뀐 점만 요약하면:
- countdownText 변수 하나 추가 → Inspector에서 CountdownText 오브젝트를 끌어다 연결.
- Start() 에서: countdownText가 있으면 StartCoroutine(CountdownThenSpawn()) 로 카운트다운을 먼저 재생하고, 없으면 예전처럼 SpawnNext() 만 부름.
- CountdownThenSpawn() 이 코루틴인데, 안에서 “3” 표시 → 1초 대기 → “2” → 1초 대기 → “1” → 1초 대기 → “Go!” → 0.5초 대기 → 텍스트 숨기고 SpawnNext() 한 번 호출.
using UnityEngine;
using TMPro;
using System.Collections;
public class Spawner : MonoBehaviour
{
public GameObject[] tetrisBlockPrefabs;
public Transform spawnPoint;
[Header("카운트다운 (선택)")]
public TMP_Text countdownText; // Inspector에서 CountdownText 연결. 비워 두면 카운트다운 없이 바로 스폰
private GameBoard gameBoard;
private GameController gameController;
void Start()
{
gameBoard = FindObjectOfType<GameBoard>();
gameController = FindObjectOfType<GameController>();
if (countdownText != null)
StartCoroutine(CountdownThenSpawn()); // 카운트다운 후 첫 블록 스폰
else
SpawnNext(); // countdownText가 없으면 기존처럼 바로 스폰
}
/// <summary>3, 2, 1, Go! 표시 후 SpawnNext() 한 번 호출.</summary>
IEnumerator CountdownThenSpawn()
{
countdownText.gameObject.SetActive(true); // 텍스트 켜기
countdownText.text = "3";
yield return new WaitForSeconds(1f); // 1초 기다린 뒤 아래로
countdownText.text = "2";
yield return new WaitForSeconds(1f);
countdownText.text = "1";
yield return new WaitForSeconds(1f);
countdownText.text = "Go!";
yield return new WaitForSeconds(0.5f);
countdownText.gameObject.SetActive(false); // 텍스트 끄기
SpawnNext(); // 이제 첫 블록 생성
}
public void SpawnNext()
{
if (gameBoard.IsGameOver())
{
Debug.Log("Game Over!");
gameController.GameOver();
Time.timeScale = 0;
return;
}
int randomIndex = Random.Range(0, tetrisBlockPrefabs.Length);
Instantiate(
tetrisBlockPrefabs[randomIndex],
spawnPoint.position,
Quaternion.identity
);
}
}
✅ 동작 확인
- Play 하면 처음에 3 → 2 → 1 → Go! 가 1초 간격으로 바뀌고, “Go!” 다음 약 0.5초 뒤에 첫 블록이 나와야 합니다.
- Countdown Text를 Inspector에서 비워 두면, 예전처럼 카운트다운 없이 바로 첫 블록이 나옵니다.
❓ 막혔을 때 확인해 보세요
| 증상 | 확인할 것 |
|---|---|
| 카운트다운이 안 보임 | Canvas에 CountdownText를 만들었는지, Spawner Inspector에서 Countdown Text 칸에 그 오브젝트를 연결했는지 확인. |
| “3”만 보이고 안 바뀜 | Spawner 스크립트에 using System.Collections; 가 있는지 확인. IEnumerator 를 쓰려면 필요합니다. |
| 컴파일 에러 (IEnumerator, TMP_Text 등) | 위 코드를 통째로 붙여 넣었는지, using TMPro; 와 using System.Collections; 가 맨 위에 있는지 확인. |
💡 정리 (나중에 이해해도 됩니다)
- StartCoroutine(CountdownThenSpawn()) 으로 “시간을 두고 순서대로 실행”하는 코루틴을 시작했다.
- yield return new WaitForSeconds(1f) 로 “1초 기다린 뒤 다음 줄 실행”을 반복했다.
- 카운트다운이 끝난 뒤에만 SpawnNext() 를 호출해서, “3, 2, 1, Go!” 다음에 첫 블록이 나오게 했다.
| ← 확장하기 목차 | 02 줄 사라짐 이펙트 → |