코루틴

1. 코루틴 (Coroutine)

유니티에서 제공하는 특수한 함수 실행 방식으로, 한 번 호출되면 끝까지 실행되는 일반 함수와 달리 실행을 잠시 멈췄다가(yield) 나중에 다시 이어서 실행할 수 있습니다.

✅ 코루틴의 특징

  • 비동기적 흐름 제어: 한 프레임에서 실행을 멈추고, 다음 프레임이나 특정 조건(시간 등)이 충족될 때 다시 시작할 수 있습니다.
  • 작업 분할: 무거운 작업을 한 번에 처리하지 않고 여러 프레임에 나누어 실행하여 프레임 드랍을 방지합니다.
  • 직렬적 처리: 비동기처럼 보이지만, 실제로는 유니티 메인 스레드의 라이프 사이클 내에서 순차적으로 처리되는 동기 작업입니다.
  • IEnumerator 활용: 코루틴은 내부적으로 IEnumerator 객체를 반환하며, 유니티 엔진이 프레임마다 MoveNext()를 호출하여 실행 지점을 체크합니다.
  • 리턴 타입: 반드시 IEnumerator를 반환해야 하며, yield return 키워드를 사용합니다.

⏳ 주요 yield return 종류

  • yield return null: 다음 프레임에 이어서 실행.
  • yield return new WaitForSeconds(t): 지정된 $t$초 후 실행 재개.
  • yield return new WaitUntil(condition): 특정 조건이 참(true)이 될 때까지 대기.
  • yield return new WaitWhile(condition): 특정 조건이 거짓(false)이 될 때까지 대기.
  • yield break: 코루틴을 강제로 종료.

⚠️ 코루틴 사용 시 필수 주의사항 (중요!)

1.사용이 끝나면 반드시 중지할 것

  • 코루틴을 실행하면 클래스 객체가 생성되며 메모리가 할당됩니다.
  • 별도로 해제하지 않은 상태로 코루틴이 반복되거나 누적될 경우, **메모리 누수(Memory Leak)**가 발생할 수 있습니다.
  • 필요에 따라 StopCoroutine()을 호출하여 명확하게 종료해주어야 합니다.

2.코루틴 변수 캐싱 (Memory Optimization)

코루틴을 실행할 때마다 힙 메모리에 인스턴스가 할당됩니다. 이를 최적화하는 방법은 다음과 같습니다.

  • 힙 메모리 절약: 주기적으로 실행되는 코루틴은 매번 new 키워드로 생성하지 말고, 변수에 담아 재사용하세요.
  • 메모리 단편화 방지: 변수를 선언해 미리 힙에 할당해두고 해당 객체를 활용하면 가비지 컬렉터(GC)의 부담을 줄일 수 있습니다.

예시: _delay = new WaitForSeconds(spawnDelay);와 같이 미리 할당된 변수를 yield return _delay; 형태로 사용하는 것이 좋습니다.

 

코루틴과 일반 함수의 실행 흐름 차이

  • 전통적 함수(Traditional Function): 호출 시 메인 스레드를 점유하며 끝날 때까지 다음 코드가 실행되지 않습니다 (Blocks Main Thread).
  • 코루틴(Coroutine): yield return을 만나면 실행을 일시 중단(Pause)하고 제어권을 넘겼다가, 다음 프레임이나 지정 시간 후 재개(Resume)하므로 메인 스레드를 차단하지 않습니다.

2. 인보크 (Invoke)

특정 메서드를 일정 시간이 지난 뒤에 자동으로 호출하도록 예약하는 함수입니다.

  • Invoke("메서드명", 시간): 지정된 시간(초) 후에 메서드 실행.
  • InvokeRepeating("메서드명", 대기시간, 반복간격): 일정 시간 후 실행하고, 이후 정해진 간격으로 반복 호출.
  • CancelInvoke("메서드명"): 예약된 호출을 취소.

주의점: 메서드 이름을 문자열(string)로 전달하기 때문에 오타가 나도 컴파일러가 잡아내지 못하며, 리플렉션을 사용하므로 성능 면에서 코루틴보다 약간 불리할 수 있습니다.

 

 🔍 코루틴 vs 인보크 비교

구분 코루틴 (Coroutine) 인보크 (Invoke)
동작 방식 yield를 통해 실행 중단 및 재개 가능
일정 시간 후 메서드 단순 호출
복잡도 반복, 조건부 대기 등 복잡한 흐름 제어 가능
단순 딜레이 후 실행에 적합
취소 방법 StopCoroutine() 필요
CancelInvoke() 필요
가독성 여러 단계의 동작을 직관적으로 표현
단발성 실행 시 코드가 간단함

3. IEnumerator의 원리

코루틴이 작동하는 기반인 IEnumerator 인터페이스의 주요 멤버입니다.

  • bool MoveNext(): 다음 상태/단계로 진행할 수 있는지 확인합니다. 끝에 도달하면 false를 반환합니다.
  • object Current { get; }: 현재 상태에서 반환되는 값을 제공합니다. 코루틴에서는 yield return 뒤의 값입니다.
  • void Reset(): 반복 상태를 처음으로 되돌립니다. (코루틴에서는 거의 사용되지 않음)

🌟 이해 및 마무리

오늘 공부를 통해 코루틴이 단순히 "기다리는 함수"가 아니라, 유니티의 메인 루프와 협력하는 멀티태스킹(Cooperative Multitasking) 방식임을 이해했습니다. 특히 무분별한 코루틴 생성은 메모리 문제를 야기할 수 있으므로, 캐싱적절한 중지가 필수적이라는 점을 명심해야겠습니다

'유니티 > UnityEngine3D 입문 및 스크립팅 기초' 카테고리의 다른 글

물리, 충돌  (0) 2026.01.02
Transform 및 위치 이동  (0) 2026.01.01
오브젝트, 프리팹, 생성과 파괴  (0) 2026.01.01
유니티 개요  (0) 2026.01.01