본문 바로가기

Unity

[Unity] 코루틴

📌 코루틴이란?

  • 정의: 일반 메서드는 한 프레임 안에서 실행 완료되지만, 코루틴은 yield를 통해 작업을 여러 프레임에 나눠서 실행할 수 있는 메서드.
  • 특징:
    • 반드시 IEnumerator 반환
    • yield return 시 실행을 멈추고 다음 프레임 또는 조건 충족 시 재개
    • yield break로 즉시 종료
    • MonoBehaviour를 상속한 객체에서만 사용 가능
    • 코루틴 소유 객체가 비활성화/파괴되면 중단
    • 메인 스레드에서만 실행 (멀티스레드 아님)

📜 주요 메서드

  • StartCoroutine: 코루틴 실행, 반환값(Coroutine)을 이용해 특정 코루틴 제어 가능
  • StopCoroutine: 실행 중인 코루틴 종료 (반환값 이용 방식 권장)
  • StopAllCoroutines: 해당 객체의 모든 코루틴 종료
  • YieldInstruction 예시:
    • yield return null; → 다음 Update까지 대기
    • yield return new WaitForSeconds(t); → t초 후 재개 (TimeScale 영향 받음)
    • yield return new WaitForSecondsRealtime(t); → TimeScale 무시
    • yield return new WaitForFixedUpdate(); → 다음 FixedUpdate까지 대기
    • yield return new WaitForEndOfFrame(); → 렌더링 종료까지 대기

⚙ 동작 원리

  • 유니티 코루틴은 C# Iterator(yield)를 기반으로 함.
  • 첫 yield를 만나면 내부 DelayedCallManager에 등록 → 이후 프레임마다 다음 단계 실행.

⚠ 자주 하는 실수 & 주의점

  1. 다음 로그가 먼저 찍힘 → 코루틴은 프레임을 넘기므로 StartCoroutine 직후 호출문이 먼저 실행될 수 있음.
  2. Stop 호출 없이 중단 → 코루틴 소유 객체가 비활성화/파괴되면 자동 중단됨.
  3. NullException → 실행 도중 참조 필드가 변경/삭제될 수 있음 → 지역 변수 캐싱 필요.
  4. 다른 객체의 코루틴 실행 → 소유권이 실행한 객체에 귀속됨, 참조 객체가 파괴되면 예외 가능.
  5. GC 발생
    • StartCoroutine 시 상태머신 객체(IEnumerator) 생성 → 힙 할당
    • new WaitForSeconds 등 YieldInstruction 생성 시 추가 할당 → 캐싱 권장
  6. WaitForSeconds 오해 → 내부적으로 매 프레임 경과시간 검사, 정확히 해당 시간에 맞춰 실행 보장 안 됨.

💡 장점 

  • 상태 관리 코드 없이 순차 흐름 표현 가능, 시간 지연·조건 대기 구현 용이.