본문으로 건너뛰기
Unity C# 기초집LESSON 18

Coroutine

난이도초급
예상 시간45분
선수지식17강 이벤트

18강. Coroutine

1. 이번 강의에서 해결할 문제

Update에서 누적 시간을 직접 검사하는 생성 코드는 상태 전환과 지연 흐름을 읽기 어렵습니다. 일정 간격으로 반복되는 생성 과정을 Coroutine으로 표현합니다.

2. 학습 목표

3. 핵심 개념

Coroutine은 yield 지점에서 실행을 잠시 멈추고 이후 프레임에 이어가는 Unity 흐름입니다. 별도 스레드가 아니므로 Unity API를 안전하게 사용할 수 있지만 무거운 계산을 병렬로 처리해 주지는 않습니다. WaitForSeconds는 timeScale의 영향을 받습니다.

4. 단계별 실습

C# · 파일 경로: Assets/DeliverySorter/Scripts/Spawning/PackageSpawner.cs

PackageSpawner.cs
using System.Collections;
using UnityEngine;

public sealed class PackageSpawner : MonoBehaviour
{
[SerializeField] private PackageItem packagePrefab;
[SerializeField] private Transform spawnPoint;
[SerializeField] private PackageTypeData[] packageTypes;
[SerializeField, Min(0.1f)] private float spawnInterval = 1.5f;

private Coroutine spawnRoutine;

public void BeginSpawning()
{
if (spawnRoutine == null) spawnRoutine = StartCoroutine(SpawnLoop());
}

public void StopSpawning()
{
if (spawnRoutine == null) return;
StopCoroutine(spawnRoutine);
spawnRoutine = null;
}

private IEnumerator SpawnLoop()
{
while (true)
{
SpawnOne();
yield return new WaitForSeconds(spawnInterval);
}
}

private void SpawnOne()
{
if (packageTypes == null || packageTypes.Length == 0) return;
int index = Random.Range(0, packageTypes.Length);
PackageItem item = Instantiate(packagePrefab, spawnPoint.position, Quaternion.identity);
item.Configure(packageTypes[index]);
}
}

이벤트 연결 작업

GameSession의 StateChanged를 구독해 Playing이면 BeginSpawning, Paused 또는 GameOver면 StopSpawning을 호출하는 SpawnStateBinder를 별도 작성합니다.

5. 코드가 동작하는 이유

Coroutine 참조가 null일 때만 시작하므로 생성 루프가 중복되지 않습니다. 각 반복은 한 택배를 만든 후 지정 시간 동안 양보합니다. 상태 이벤트가 루프의 수명을 제어해 GameOver 뒤 추가 생성을 막습니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

Coroutine 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Coroutine” 실습을 안전하게 진행하기 위한 판단으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2“Coroutine” 실습 중 ‘GameOver에도 루프 유지’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

18강. Coroutine 미완료 상태