
Unity에서 IEnumerator와 Coroutine의 모든 것
Unity를 사용하면서 비동기적 흐름을 구현할 일이 자주 생깁니다. 예를 들어 특정 시간 후에 동작을 실행하거나, 순차적으로 애니메이션이나 효과를 재생하고 싶을 때 IEnumerator를 활용한 Coroutine(코루틴) 기능은 매우 유용합니다. 이번 글에서는 IEnumerator의 개념부터 코루틴 활용법까지 상세히 알아보겠습니다.
IEnumerator란?
IEnumerator는 C#에서 반복자의 역할을 하는 인터페이스입니다. 하지만 Unity에서는 이 인터페이스를 코루틴을 위한 도구로 사용하는 경우가 일반적입니다.
Unity에서 IEnumerator는 다음과 같이 yield return 키워드와 함께 사용되며, 코드 실행을 일시 정지하고 재개할 수 있게 합니다.
IEnumerator MyCoroutine()
{
Debug.Log("시작!");
yield return new WaitForSeconds(2);
Debug.Log("2초 후 실행!");
}
이런 식으로 yield return으로 일시정지하고, 일정 시간 후 또는 조건이 충족될 때 다시 실행됩니다.
Coroutine이란?
Coroutine은 Unity에서 IEnumerator를 기반으로 한 비동기 흐름 제어 방식입니다. 일반적으로 다음과 같이 사용합니다.
StartCoroutine(MyCoroutine());
MonoBehaviour의 멤버 함수로 존재하며, 현재 GameObject가 활성화되어 있을 때만 작동합니다.
자주 사용하는 yield 종류
Unity에서는 다양한 yield return 옵션을 제공하여 여러 상황에 맞게 코루틴을 제어할 수 있습니다.
- yield return null : 다음 프레임까지 대기
- yield return new WaitForSeconds(float seconds) : 지정 시간 대기
- yield return new WaitUntil(() => 조건) : 조건이 true가 될 때까지 대기
- yield return new WaitWhile(() => 조건) : 조건이 false가 될 때까지 대기
Coroutine 중지 및 제어
코루틴은 다음과 같은 방식으로 제어할 수 있습니다.
Coroutine routine = StartCoroutine(MyCoroutine());
StopCoroutine(routine); // 개별 코루틴 중지
StopAllCoroutines(); // 모든 코루틴 중지
주의할 점은 StartCoroutine("CoroutineName")처럼 문자열로 시작한 코루틴은 StopCoroutine()으로 정지하기 어렵다는 점입니다.
실수하기 쉬운 예시
yield return이 없는 IEnumerator
IEnumerator Faulty()
{
Debug.Log("실행됨");
// yield return 없음 → 코루틴으로 작동하지 않음
}
MonoBehaviour가 아닌 클래스에서 사용
public class Enemy
{
public IEnumerator Patrol() { ... } // 가능하지만 직접 실행은 불가
}
MonoBehaviour를 상속받지 않으면 StartCoroutine 호출 불가능합니다.
중복 실행 방지하지 않음
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
StartCoroutine(MyCoroutine()); // 누를 때마다 중복 실행
}
중복 실행 방지를 위해 bool 체크나 StopCoroutine 처리 필요합니다.
Coroutine vs async/await
C# 최신 버전에서는 async/await 문법을 사용한 비동기 처리도 가능하지만, Unity의 MonoBehaviour 라이프사이클과의 통합성은 떨어집니다.
- UI, 게임 흐름 제어 → Coroutine 권장
- 데이터 로딩, 네트워크, 외부 연동 → async/await 고려
'Unity' 카테고리의 다른 글
| Unity에서의 객체? 클래스? 생성자? (0) | 2025.05.07 |
|---|---|
| Unity에서의 Scroll기능 (0) | 2025.04.23 |
| Unity LineRenderer는 무엇인가? (0) | 2025.04.18 |
| Unity Addressables의 개념과 실전 적용 방법 (0) | 2025.04.17 |
| Unity에서 GetComponent 제대로 쓰는 법 (0) | 2025.04.16 |