[UNITY] 간단한 CoroutineRunner 만들기

  CoroutineRunner가 필요할까?

  • 여러 코루틴을 관리할 때 코드가 지저분해짐
  • 중단/시작/덮어쓰기 규칙을 정형화하고 싶을 때
  • 반복적인 Coroutine 핸들 관리 코드가 싫을 때


 기본 개념

  • 코루틴을 키(key)로 구분해서 관리하고
  • 특정 키에 새로운 코루틴을 덮어쓰기 하거나,
  • 전체 코루틴을 멈출 수 있음


🚀 간단한 CoroutineRunner 만들기

 장점

기능설명

✅ 키 기반 코루틴 관리 "PCR" 키, "Narration" 키 따로 관리 가능
✅ 중복 방지 같은 키는 자동으로 중지 후 덮어쓰기
✅ 확장성 좋음 RunAndWait(), 타임아웃, CancellationToken 등 추가 가능
✅ 코드 깔끔함 Coroutine 핸들 관리 필요 없음

 

1. 변수 선언

[SerializeField] private CoroutineRunner coroutineRunner;

 

 

2. 코루틴 실행은 이렇게!

public void PCR_Denaturation() { coroutineRunner.Run("PCR", _PCR_Denaturation()); } 
public void PCR_Annealing() { coroutineRunner.Run("PCR", _PCR_Annealing()); } 
public void PCR_Extension() { coroutineRunner.Run("PCR", _PCR_Extension()); }

3. 모든 코루틴 종료하고 싶다면?

 
coroutineRunner.StopAll();

 

또는 특정 것만:

coroutineRunner.Stop("PCR");

 

 

CoroutineRunner.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoroutineRunner : MonoBehaviour
{
    private Dictionary<string, Coroutine> coroutines = new Dictionary<string, Coroutine>();

    // 코루틴 실행 (동일 키는 덮어쓰기)
    public void Run(string key, IEnumerator coroutine)
    {
        Stop(key);
        coroutines[key] = StartCoroutine(InternalRun(key, coroutine));
    }

    // 코루틴 실행 후 완료까지 대기
    public IEnumerator RunAndWait(string key, IEnumerator coroutine)
    {
        Run(key, coroutine);

        while (coroutines.ContainsKey(key))
        {
            yield return null;
        }
    }

    // 특정 키의 코루틴 중지
    public void Stop(string key)
    {
        if (coroutines.ContainsKey(key))
        {
            StopCoroutine(coroutines[key]);
            coroutines.Remove(key);
        }
    }

    // 모든 코루틴 중지
    public void StopAll()
    {
        foreach (var coroutine in coroutines.Values)
        {
            StopCoroutine(coroutine);
        }

        coroutines.Clear();
    }

    // 내부 실행 후 자동 제거
    private IEnumerator InternalRun(string key, IEnumerator coroutine)
    {
        yield return StartCoroutine(coroutine);
        coroutines.Remove(key);
    }
}

 

 

  • UniTask와 async/await로 리팩토링
  • CancellationToken으로 더 정교한 취소 처리