테트리스 강좌

초등학생도 쉽게 따라할 수 있는 Unity 테트리스 게임 개발 강좌 자료

코루틴 (Coroutine)

💬 처음 보시는 분께

코루틴은 “나중에 다시 이어서 실행해 주세요” 라고 Unity에게 맡기는 방식이라, 일반 함수보다 낯설 수 있습니다.
한 번에 다 이해하지 않아도 괜찮습니다. 아래 예시처럼 “yield return 적으면 그만큼 기다린 뒤 다음 줄 실행” 이라고만 기억해 두고, 확장하기 01을 따라 하다 보면 감이 잡힙니다. 막히면 이 문서로 돌아와서 실행 순서만 다시 읽어 보세요.


📖 개념 설명

코루틴은 “시간을 두고 순서대로 실행“하고 싶을 때 쓰는 Unity 기능입니다.

쉬운 비유: 요리할 때 “물을 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 없이 끝나도 됨)
    }
}

실행 순서 (시간 순서대로)

  1. Start() 가 실행되고 → CountdownRoutine() 이 시작됨
  2. “3” 출력 → yield return 에서 1초 대기 (게임은 계속 돌아감)
  3. 1초 지나면 “2” 출력 → 또 1초 대기
  4. 1초 지나면 “1” 출력 → 또 1초 대기
  5. 1초 지나면 “Go!” 출력 → 코루틴 종료

왜 IEnumerator 인가요?
Unity가 yield return을 만나면 “지금 실행한 위치”를 기억해 두었다가, 지정한 시간이 지난 뒤 그 다음 줄부터 다시 실행합니다. 이 “중간에 멈췄다 이어하기”를 가능하게 하는 타입이 IEnumerator입니다. 이름만 어렵고, 코루틴 메서드에는 이 타입을 쓰겠다고 적어 준다 정도만 기억하면 됩니다.


🛠️ 실습: 테스트 씬에서 코루틴 실습해 보기

목표: 전용 테스트 씬에서 코루틴을 한 번 실행해 보고, Console에 “3 → 2 → 1 → Go!”가 시간차로 찍히는 걸 확인합니다. 테트리스 씬과 분리해서 안전하게 연습할 수 있습니다.

이 실습 전용 씬 만들기 (환경 설정)

먼저 이 실습 전용 씬을 만든 뒤 아래 수행 과정을 진행합니다. (자세한 씬 만드는 방법은 개념 실습 테스트 환경 가이드의 씬 만드는 방법 참고.)

이 실습만 할 전용 씬이 없으면 아래 순서로 한 번만 만듭니다. (이미 ConceptTest_Coroutine 씬이 있으면 File → Open Scene으로 열고 아래 실습만 이어서 하세요.)

  1. File → New Scene → Basic (Built-in) 또는 Empty → Create
  2. File → Save As → 저장 위치: Assets/Scenes → 파일 이름: ConceptTest_Coroutine → Save
  3. 아래 실습은 모두 이 씬에서 진행합니다.

수행 과정

  1. Hierarchy에서 빈 오브젝트 만들기
    • 우클릭 → Create Empty → 이름: CoroutineTest
  2. C# 스크립트 만들기
    • Project 창 우클릭 → Create → C# Script → 이름: CoroutineTest
  3. 스크립트에 아래 코드 넣기 (위 기본 예시와 같은 코드입니다. 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!");
    }
}
  1. CoroutineTest 스크립트를 Hierarchy의 CoroutineTest 오브젝트에 드래그해서 추가

  2. Play 버튼 누르기
    • Console 창을 열어 두고, 3 → 2 → 1 → Go! 가 약 1초 간격으로 찍히는지 확인합니다.
    • → 코루틴이 “중간에 1초씩 멈췄다가 이어서 실행”하는 걸 눈으로 확인한 것입니다.
  3. 직접 해보기
    • 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초를 재는 대기

🔗 테트리스 확장에서 쓰는 곳

어렵다면 01번(카운트다운)부터 차근차근 따라 해 보세요. 코드를 그대로 복사해서 넣고, Inspector에서 CountdownText만 연결해도 동작합니다.


← 개념 설명 목차