본문 바로가기
Unity

코루틴의 한계 : 일시 정지가 불가능한 구조

by Oz Driver 2025. 4. 27.

 

Unity 코루틴은 흐름을 간단히 제어할 수 있습니다.

그러나 기본적으로 "시작"과 "완전 종료"만 지원하며, 중간에 멈췄다가 이어서 실행하는 기능은 존재하지 않습니다.

 

그 이유는 ? 

StartCoroutine 으로 생성된 코루틴은 메모리에 "Coroutine Handle"로 관리됩니다.
StopCoroutine이나 StopAllCoroutines를 호출하면 이 Handle은 메모리에서 완전히 삭제됩니다.
따라서 삭제된 코루틴은 어디까지 실행했는지 정보가 모두 사라지며, 복구할 수 없기 때문입니다.

 

저장이 불가능한 구조

코루틴은 진행 상황을 저장하지 않습니다.
도중에 StopCoroutine을 호출하면 그 자리에서 종료되고, 다시 StartCoroutine을 호출하면 항상 처음부터 다시 시작합니다.
중간부터 이어서 실행하려면 별도로 진행 상태를 저장하고 흐름을 분기해야 하지만, 코드가 복잡해지고 유지보수가 어려워집니다.

동작 예시

IEnumerator SomeCoroutine()
{
    Debug.Log("Start");
    yield return new WaitForSeconds(1f);
    Debug.Log("After 1 second");
    yield return new WaitForSeconds(2f);
    Debug.Log("After 3 seconds total");
}
 
 

* StartCoroutine(SomeCoroutine()) 호출

* "Start" 출력

* 1초 후 "After 1 second" 출력

* 2초 후 "After 3 seconds total" 출력

 

만약 도중에 StopCoroutine 을 호출하면, 그 순간 바로 종료되고, 어디까지 진행했는지 기억하지 않습니다.
따라서 다시 StartCoroutine 을 호출하면 처음 "Start"부터 다시 실행됩니다.

흐름 정리

StartCoroutine() → Coroutine Handle 생성 → 메모리에 살아있음 → 매 프레임 진행
StopCoroutine() → Coroutine Handle 제거 → 메모리에서 삭제 → 끝

 

적합한 상황과 부적합한 상황

* 코루틴은 이펙트 재생, 짧은 타이머 등 단순한 흐름 제어에는 적합합니다.
* 게임 일시 정지, 저장 및 복구, 복잡한 진행 관리가 필요한 경우에는 적합하지 않습니다.
* 이럴 때는 Update 함수와 상태 기계(FSM)를 사용하는 것이 훨씬 안정적입니다.

 

마무리

Unity 코루틴은 순차적인 흐름을 간단히 구현할 때 유용합니다.

하지만 중간 일시 정지, 저장, 복구가 필요한 복잡한 시스템에는 부적합합니다.

따라서 코루틴 사용시에는 이러한 특성을 이해하고 구현하시기 바랍니다.