[Unity] CoroutineRunner — POCO에서 코루틴을 실행하는 방법

shin0112·2025년 12월 8일

Unity

목록 보기
11/13

✨ 들어가며

MonoBehaviour을 상속받은 클래스에서는 StartCoroutine()을 자유롭게 쓸 수 있다.
하지만 일반 C# 클래스(POCO)에서는 불가능하다.

그 이유는 코루틴이 Unity의 메인 루프(즉, MonoBehaviour의 실행 컨텍스트) 위에서만 동작하기 때문이다.
하지만 CoroutineRunner를 사용하면 순수 C# 클래스에서도 코루틴을 실행할 수 있다.

1️⃣ CoroutineRunner란?

Class CoroutineRunner | Visual Scripting | 1.8.0

CoroutineRunner는 이름 그대로 코루틴을 대신 실행시켜주는 도우미 클래스다.
기본적으로 MonoBehaviour를 상속하고 있으며, 내부적으로 싱글톤으로 구현되어 있다.

즉, MonoBehaviour 내부 코드를 전부 가지고 있기 때문에
POCO 클래스에서도 다음처럼 코루틴을 실행할 수 있다.

_spawnCoroutine = CoroutineRunner.instance.StartCoroutine(RespawnCoroutine());

이때 CoroutineRunner.instance는 MonoBehaviour 기반이므로,
Unity의 Update 루프에서 정상적으로 코루틴을 처리한다.

2️⃣ 구조

CoroutineRunner는 Visual Scripting namespace에 위치한다.

  • 내부적으로 MonoBehaviour를 상속받는다.
  • 인스턴스는 싱글톤(static)으로 관리된다.
  • 다른 객체가 없어도 코루틴을 실행할 수 있다.

즉, MonoBehaviour를 상속받지 않은 C# 클래스라도
Unity 루프에 접근할 수 있는 경로를 확보하게 된다.

3️⃣ 주의점

CoroutineRunner는 싱글톤이기 때문에,
모든 코루틴이 하나의 동일한 MonoBehaviour 컨텍스트에서 실행된다.

따라서 다음과 같은 주의가 필요하다.

  • StopAllCoroutines()를 호출하면,
    해당 싱글톤 인스턴스에서 실행 중인 모든 코루틴이 중단된다.
  • 여러 시스템이 동시에 CoroutineRunner를 공유할 경우,
    하나의 중단 명령이 전체에 영향을 줄 수 있다.

즉, 단일 객체 안에서만 안전하게 쓰는 용도라면 문제 없지만,
여러 클래스가 동시에 Runner를 공유하는 구조라면 StopCoroutine()으로 개별 관리하는 편이 낫다.

✍️ 마치며

처음에는 “그냥 코루틴을 쓰는 법이 하나 더 있구나” 정도로 생각했는데,
막상 써보니 구조적으로 완전히 다른 방식이었다.

CoroutineRunner는 편리하지만,
싱글톤으로 동작하는 특성 때문에 제어 범위를 명확히 이해하고 써야 한다!

0개의 댓글