코루틴 (Coroutine)
💬 처음 보시는 분께
코루틴은 “나중에 다시 이어서 실행해 주세요” 라고 Unity에게 맡기는 방식이라, 일반 함수보다 낯설 수 있습니다.
한 번에 다 이해하지 않아도 괜찮습니다. 아래 예시처럼 “yield return 적으면 그만큼 기다린 뒤 다음 줄 실행” 이라고만 기억해 두고, 확장하기 01을 따라 하다 보면 감이 잡힙니다. 막히면 이 문서로 돌아와서 실행 순서만 다시 읽어 보세요.
📖 개념 설명
코루틴은 “시간을 두고 순서대로 실행“하고 싶을 때 쓰는 Unity 기능입니다.
- 일반 메서드: 호출하면 한 번에 끝까지 실행되고 끝납니다.
- 코루틴: 중간에 잠시 멈추었다가 (예: 1초 후) 그 다음 줄부터 다시 실행할 수 있습니다.
쉬운 비유: 요리할 때 “물을 3분 끓인 뒤 스파게티를 넣어라”라고 할 때, 3분 기다리는 동안 게임이 멈추지 않고 다른 일을 할 수 있게 해 주는 것처럼, 몇 초 기다린 뒤 다음 동작을 하게 만들 수 있습니다.
🔑 꼭 알아두면 좋은 것 세 가지
처음에는 이름만 알아두어도 됩니다. “코루틴 쓸 때는 이 세 가지가 필요하다” 정도만 보시면 됩니다.
| 요소 | 한 줄 요약 |
|---|---|
| IEnumerator | 코루틴 메서드의 반환 타입. “이 메서드는 중간에 멈췄다가 이어서 실행되는 구나”라고 Unity가 인식하게 하는 표시입니다. |
| yield return new WaitForSeconds(1f); | “여기서 1초 멈추고, 1초 지나면 다음 줄부터 다시 실행해 주세요” 라고 적는 문장입니다. |
| StartCoroutine(메서드()); | 코루틴을 실제로 시작하려면, Start() 같은 곳에서 이렇게 한 번 불러 줍니다. |
📝 기본 예시 (한 줄씩 보기)
아래 코드는 “3” → 1초 후 “2” → 1초 후 “1” → 1초 후 “Go!” 가 Console에 찍히는 예시입니다.
using UnityEngine;
using System.Collections; // IEnumerator 쓰려면 필요
public class CountdownExample : MonoBehaviour
{
void Start()
{
StartCoroutine(CountdownRoutine()); // 코루틴 시작 (한 번만 부르면 됨)
}
IEnumerator CountdownRoutine() // 반환 타입이 IEnumerator 인 게 코루틴
{
Debug.Log("3");
yield return new WaitForSeconds(1f); // 여기서 1초 멈춤 → 1초 뒤 아래 줄부터 이어서 실행
Debug.Log("2");
yield return new WaitForSeconds(1f); // 또 1초 멈춤
Debug.Log("1");
yield return new WaitForSeconds(1f);
Debug.Log("Go!");
// 여기서 코루틴 끝 (return 없이 끝나도 됨)
}
}
실행 순서 (시간 순서대로)
- Start() 가 실행되고 → CountdownRoutine() 이 시작됨
- “3” 출력 → yield return 에서 1초 대기 (게임은 계속 돌아감)
- 1초 지나면 “2” 출력 → 또 1초 대기
- 1초 지나면 “1” 출력 → 또 1초 대기
- 1초 지나면 “Go!” 출력 → 코루틴 종료
왜 IEnumerator 인가요?
Unity가 yield return을 만나면 “지금 실행한 위치”를 기억해 두었다가, 지정한 시간이 지난 뒤 그 다음 줄부터 다시 실행합니다. 이 “중간에 멈췄다 이어하기”를 가능하게 하는 타입이 IEnumerator입니다. 이름만 어렵고, 코루틴 메서드에는 이 타입을 쓰겠다고 적어 준다 정도만 기억하면 됩니다.
🛠️ 실습: 테스트 씬에서 코루틴 실습해 보기
목표: 전용 테스트 씬에서 코루틴을 한 번 실행해 보고, Console에 “3 → 2 → 1 → Go!”가 시간차로 찍히는 걸 확인합니다. 테트리스 씬과 분리해서 안전하게 연습할 수 있습니다.
이 실습 전용 씬 만들기 (환경 설정)
먼저 이 실습 전용 씬을 만든 뒤 아래 수행 과정을 진행합니다. (자세한 씬 만드는 방법은 개념 실습 테스트 환경 가이드의 씬 만드는 방법 참고.)
이 실습만 할 전용 씬이 없으면 아래 순서로 한 번만 만듭니다. (이미 ConceptTest_Coroutine 씬이 있으면 File → Open Scene으로 열고 아래 실습만 이어서 하세요.)
- File → New Scene → Basic (Built-in) 또는 Empty → Create
- File → Save As → 저장 위치: Assets/Scenes → 파일 이름: ConceptTest_Coroutine → Save
- 아래 실습은 모두 이 씬에서 진행합니다.
수행 과정
- Hierarchy에서 빈 오브젝트 만들기
- 우클릭 → Create Empty → 이름: CoroutineTest
- C# 스크립트 만들기
- Project 창 우클릭 → Create → C# Script → 이름: CoroutineTest
- 스크립트에 아래 코드 넣기 (위 기본 예시와 같은 코드입니다.
using System.Collections;가 있는지 확인하세요.)
using UnityEngine;
using System.Collections;
public class CoroutineTest : MonoBehaviour
{
void Start()
{
StartCoroutine(CountdownRoutine());
}
IEnumerator CountdownRoutine()
{
Debug.Log("3");
yield return new WaitForSeconds(1f);
Debug.Log("2");
yield return new WaitForSeconds(1f);
Debug.Log("1");
yield return new WaitForSeconds(1f);
Debug.Log("Go!");
}
}
-
CoroutineTest 스크립트를 Hierarchy의 CoroutineTest 오브젝트에 드래그해서 추가
- Play 버튼 누르기
- Console 창을 열어 두고, 3 → 2 → 1 → Go! 가 약 1초 간격으로 찍히는지 확인합니다.
- → 코루틴이 “중간에 1초씩 멈췄다가 이어서 실행”하는 걸 눈으로 확인한 것입니다.
- 직접 해보기
WaitForSeconds(1f)를WaitForSeconds(2f)로 바꿔 보세요. 2초 간격으로 로그가 찍힙니다.- “Go!” 다음에
yield return new WaitForSeconds(0.5f);와Debug.Log("끝!");을 넣어 보세요. 0.5초 뒤에 “끝!”이 한 번 더 나옵니다.
✅ 확인 사항
| 확인 | 내용 |
|---|---|
| Console에 3, 2, 1, Go! 가 순서대로 나오나요? | 1초 간격으로 네 개가 찍히면 성공입니다. |
| 컴파일 에러가 나요 (IEnumerator, WaitForSeconds)? | 스크립트 맨 위에 using System.Collections; 가 있는지 확인하세요. |
| 아무 로그도 안 나와요 | Hierarchy에서 CoroutineTest 오브젝트에 CoroutineTest 스크립트가 붙어 있는지, Play 했을 때 해당 씬이 실행 중인지 확인하세요. |
🎯 자주 쓰는 yield (필요할 때만 참고)
| 코드 | 의미 |
|---|---|
yield return new WaitForSeconds(1f); |
1초 기다린 뒤 다음 줄 실행 (가장 많이 씀) |
yield return null; |
한 프레임만 기다린 뒤 다음 줄 실행 |
yield return new WaitForSecondsRealtime(1f); |
일시정지(Time.timeScale=0) 중에도 1초를 재는 대기 |
🔗 테트리스 확장에서 쓰는 곳
- 게임 시작 시: “3, 2, 1, Go!” 카운트다운 후 첫 블록 스폰 → 확장하기 01 - 게임 시작 카운트다운
- 줄이 사라질 때: 줄을 지우기 전에 잠깐 깜빡이거나 대기하는 이펙트 → 확장하기 02 - 줄 사라짐 이펙트
어렵다면 01번(카운트다운)부터 차근차근 따라 해 보세요. 코드를 그대로 복사해서 넣고, Inspector에서 CountdownText만 연결해도 동작합니다.