MonoBehaviour을 상속받은 클래스에서는 StartCoroutine()을 자유롭게 쓸 수 있다.
하지만 일반 C# 클래스(POCO)에서는 불가능하다.
그 이유는 코루틴이 Unity의 메인 루프(즉, MonoBehaviour의 실행 컨텍스트) 위에서만 동작하기 때문이다.
하지만 CoroutineRunner를 사용하면 순수 C# 클래스에서도 코루틴을 실행할 수 있다.
CoroutineRunner는 이름 그대로 코루틴을 대신 실행시켜주는 도우미 클래스다.
기본적으로 MonoBehaviour를 상속하고 있으며, 내부적으로 싱글톤으로 구현되어 있다.
즉, MonoBehaviour 내부 코드를 전부 가지고 있기 때문에
POCO 클래스에서도 다음처럼 코루틴을 실행할 수 있다.
_spawnCoroutine = CoroutineRunner.instance.StartCoroutine(RespawnCoroutine());
이때 CoroutineRunner.instance는 MonoBehaviour 기반이므로,
Unity의 Update 루프에서 정상적으로 코루틴을 처리한다.
CoroutineRunner는 Visual Scripting namespace에 위치한다.
MonoBehaviour를 상속받는다.즉, MonoBehaviour를 상속받지 않은 C# 클래스라도
Unity 루프에 접근할 수 있는 경로를 확보하게 된다.
CoroutineRunner는 싱글톤이기 때문에,
모든 코루틴이 하나의 동일한 MonoBehaviour 컨텍스트에서 실행된다.
따라서 다음과 같은 주의가 필요하다.
StopAllCoroutines()를 호출하면,CoroutineRunner를 공유할 경우,즉, 단일 객체 안에서만 안전하게 쓰는 용도라면 문제 없지만,
여러 클래스가 동시에 Runner를 공유하는 구조라면 StopCoroutine()으로 개별 관리하는 편이 낫다.
처음에는 “그냥 코루틴을 쓰는 법이 하나 더 있구나” 정도로 생각했는데,
막상 써보니 구조적으로 완전히 다른 방식이었다.
CoroutineRunner는 편리하지만,
싱글톤으로 동작하는 특성 때문에 제어 범위를 명확히 이해하고 써야 한다!