Unity

유니티 코루틴의 동작원리

우대비 2025. 5. 12. 21:17
반응형

코루틴의 동작 원리

코루틴은 단일 스레드를 멀티 스레드 처럼 사용할 수 있는 특수한 함수를 의미합니다.

오늘은 이 기능이 어떤 원리로 동작하는지에 대해 포스팅 해보겠습니다.

 

 

코루틴이란?

코루틴을 사용하면 단일 스레드를 멀티 스레드처럼 활용할 수 있게됩니다.
함수가 진행되는 도중 yield 문을 통해 일시 정지하고, 입력한 시간 뒤에 함수를 재개합니다.
이를 통해 몇초에 한번씩 몬스터를 감지하는 기능을 구현할 수 있으며,
Update문을 대신하여 회전하거나 이동하는 로직을 구현할 수 있습니다.

 

 

어떻게 일시정지후 재개할 수 있을까

IEnumerator MyCoroutine()
{
    Debug.Log("시작");
    yield return new WaitForSeconds(1f);
    Debug.Log("1초 후");
    yield return new WaitForSeconds(1f);
    Debug.Log("2초 후");
}

void Start()
{
    StartCoroutine(MyCoroutine());
}

위의 예제 코드를 실행할때의 동작 원리를 설명드리겠습니다.

 

 

StartCoroutine() 호출 시 다음과 같은 클래스를 생성됩니다.

private class CoroutineWrapper : IEnumerator
{
    private int state;  // 현재 실행 위치
    private object current;  // 현재 yield 반환값
    private MyCoroutine originalMethod;  // 원본 메서드
    
    // 지역 변수들을 저장할 필드들
    private float localVariable1;
    private string localVariable2;
    // ... 기타 지역 변수들
}

 

 

컴파일러가 Yield 문을 기준으로 Switch - Case문을 생성합니다.

private class CoroutineWrapper : IEnumerator
{
    public bool MoveNext()
    {
        switch (state)
        {
            case 0:  // 초기 상태
                Debug.Log("시작");
                state = 1;
                current = new WaitForSeconds(1f);
                return true;
                
            case 1:  // 첫 번째 yield 이후
                Debug.Log("1초 후");
                state = 2;
                current = new WaitForSeconds(1f);
                return true;
                
            case 2:  // 두 번째 yield 이후
                Debug.Log("2초 후");
                state = 3;
                return false;  // 코루틴 종료
                
            default:
                return false;
        }
    }
}

 

정리

  1. C# 컴파일러가 yield return을 사용하는 메서드를 상태 머신으로 변환
  2. Unity가 이 IEnumerator를 받아서 자체적인 코루틴 관리 시스템에서 처리
  3. 매 프레임마다 Unity가 MoveNext()를 호출하여 코루틴의 실행을 관리

제가 앞서 설명한 CoroutineWrapper는 실제 구현이 아닌 개념적인 설명이었습니다. 실제 구현은 C# 컴파일러와 Unity 엔진에서 이루어집니다.

 

 

주의 사항

유니티의 코루틴은 게임오브젝트에 의존적인 형태입니다.

그렇기 때문에 코루틴 실행중에 게임오브젝트가 비활성화되면 코루틴도 함께 종료되고

비활성화 상태에서 코루틴이 실행되려하면 오류가 발생합니다.

 

 

 

 

 

 

 

 

 

 

반응형
LIST

'Unity' 카테고리의 다른 글

유니티 쿼터니언(Quaternion)  (1) 2025.05.16
유니티 드로우콜  (0) 2025.05.14
TIL: Unity 인벤토리 시스템 구현  (2) 2025.05.01
퀘스트 시스템  (2) 2025.04.28
TIL - Addressable 설계  (2) 2025.04.23