✅ 왜 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으로 더 정교한 취소 처리