Unity

Unity에서 IEnumerator와 Coroutine의 모든 것

anvil925 2025. 4. 21. 23:27
728x90
반응형

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 고려

728x90
반응형