Unity
[Unity] 코루틴
주완짱
2025. 8. 10. 21:02
📌 코루틴이란?
- 정의: 일반 메서드는 한 프레임 안에서 실행 완료되지만, 코루틴은 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에 등록 → 이후 프레임마다 다음 단계 실행.
⚠ 자주 하는 실수 & 주의점
- 다음 로그가 먼저 찍힘 → 코루틴은 프레임을 넘기므로 StartCoroutine 직후 호출문이 먼저 실행될 수 있음.
- Stop 호출 없이 중단 → 코루틴 소유 객체가 비활성화/파괴되면 자동 중단됨.
- NullException → 실행 도중 참조 필드가 변경/삭제될 수 있음 → 지역 변수 캐싱 필요.
- 다른 객체의 코루틴 실행 → 소유권이 실행한 객체에 귀속됨, 참조 객체가 파괴되면 예외 가능.
- GC 발생
- StartCoroutine 시 상태머신 객체(IEnumerator) 생성 → 힙 할당
- new WaitForSeconds 등 YieldInstruction 생성 시 추가 할당 → 캐싱 권장
- WaitForSeconds 오해 → 내부적으로 매 프레임 경과시간 검사, 정확히 해당 시간에 맞춰 실행 보장 안 됨.
💡 장점
- 상태 관리 코드 없이 순차 흐름 표현 가능, 시간 지연·조건 대기 구현 용이.