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 코루틴은 순차적인 흐름을 간단히 구현할 때 유용합니다.
하지만 중간 일시 정지, 저장, 복구가 필요한 복잡한 시스템에는 부적합합니다.
따라서 코루틴 사용시에는 이러한 특성을 이해하고 구현하시기 바랍니다.
'Unity' 카테고리의 다른 글
유니티에서 FBX 파일 가져왔는데 텍스처가 안 보일 때 (0) | 2025.05.10 |
---|---|
Unity 에서 Empty object 를 Scene 창에서 보이게 하는 방법 (0) | 2025.04.30 |
Unity에서 Enum을 Dictionary로 연결하여 Hierarchy 자식 관리하기 (0) | 2025.04.27 |
Hierarchy 구조를 이용해 스크립트에서 제어하기 (0) | 2025.04.21 |
유니티에서 SerializeField 란 무엇인가요? (0) | 2025.04.20 |