[Unity] Coroutine (코루틴)

⭐ 코루틴이란?

● 하나의 프로세스에서 작업에 대기 시간을 두거나, 여러 프레임에 걸쳐 실행되도록 하는 기능으로 스레드와 다릅니다.

    ○ 스레드는 멀티 스레드를 통해 실제로 여러 작업을 동시에 실행

    ○ 코루틴은 실제로는 동기 방식이며, 비동기 방식으로 보이게끔 해주는 함수

 

● Ienumerator 반환형을 가진 함수입니다.   

    ○ C#에서 제공하는 인터페이스 중 하나로 반복 가능한 객체를 순회할 수 있는 기능을 제공   

    ○ 일반적으로 foreach나 코루틴에서 사용

 

 

 

yield 키워드

 

● return 대신 yield 키워드를 이용하여 반환하며, yield 키워드 사용시 사용이 일시 중지되고 다른 코드를 실행하거나

   유니티에게 제어권을 반납하고 다음 실행시 중단점부터 다시 실행됩니다.

 

● yield는 object, 즉 System.Object를 상속받는 타입은 모두 리턴할 수 있습니다.

 

 

 

코루틴을 사용하는 이유


● Update 문에서 사용하는 것보다 효율적일 수 있다!

    ○ 경우에 따라 매 프레임 실행되는 Update 문보다 코루틴으로 특정 조건이나 시간에서만 실행되는 코루틴이 더 효율적

 

● 특정 조건까지 대기해야하는 동기적 처리

    ○ 서버에 데이터를 보내는 등의 작업이 완료된 후 다음 코드로 넘어가야 할 경우 코루틴을 사용하면 제어하기 편함

 

● 시간 대기를 통해 다양한 애니메이션 연출, 기능 구현이 편리

 

 

 

코루틴 사용하기


💡코루틴을 실행하고 중단하기

private void Start()
{
    StartCoroutine(ExampleCoroutine());  → 코루틴을 실행하는 구문
}

private IEnumerator ExampleCoroutine()
{
    Debug.Log("코루틴 시작");
    yield return new WaitForSeconds(1f);  → 1초 후 다음 코드로 넘어감
    Debug.Log("1초후");
}

 

● StartCoroutine(Coroutine Method) → 코루틴을 실행

● StopCoroutine(Coroutine Method) → 코루틴을 중단

 

 

 

💡코루틴의 작업 순서

private void Start()
{
    StartCoroutine(ExampleCoroutine());
    Debug.Log("D");
}

private IEnumerator ExampleCoroutine()
{
    Debug.Log("A");
    Debug.Log("B");
    yield return new WaitForSeconds(1f);
    Debug.Log("C");
}

 

위와 같은 예시의 경우 출력 결과가 어떻게 될까?
    ○ yield return new waitForSeconds(1f)를 만나면 일단 코루틴은 중지되고 다음 코드를 실행하러 간다

       → 모든 작업이 다 끝났을 때 다시 코루틴으로 돌아가서 조건 체크 (1초가 지났는지가 조건)

 

 

● 실제로 콘솔창을 봐도 A → B → D → C 순으로 출력

 

 

 

💡자주 사용되는 yield 반환값

yield return null 한 프레임 대기
yield return new WaitForSeconds(float seconds) 지정 시간 대기 (게임 시간 기준)
yield return new WaitForSecondsRealtime(float seconds) 지정 시간 대기 (실제 시간 기준)
yield return new WaitUntil(() => 조건) 조건이 참이 될 때까지 대기
yield return new WaitWhile(() => 조건) 조건이 거짓이 될 때까지 대기
yield return new WWW(string url) 웹 통신 작업이 끝날 때까지 대기
yield return new WaitForFixedUpdate() 다음 물리 프레임까지 대기
yield return new WaitForEndOfFrame() 모든 렌더링 작업이 끝날 때까지 대기
yield return StartCoroutine(Coroutine Method) 다른 코루틴이 끝날 때까지 대기

 

 

 

⭐ 코루틴을 잘 사용하는 방법

● new WaitForSeconds 같은 객체를 매번 생성하지 않기

    ○ 캐싱을 통해 미리 객체를 생성해서 사용하면 GC를 줄일 수 있습니다.

 

● 불필요한 코루틴 사용 피하기

    ○ 매 프레임 동작하는 기능은 오히려 코루틴에서 사용하면 낭비가 크기 때문에 Update문을 이용합니다.

    ○ 코루틴은 특정 조건이나 시간에 작동하는 경우 사용

 

● 사용이 끝난 코루틴 확실하게 종료하기

    ○ 더 이상 필요없는데 종료하지 않은 코루틴이 계속 남아있을 수 있기 때문에 확실하게 종료해줍니다.

 

● yield return null을 과도하게 사용하지 않기

    ○ yield return null도 결국 매 프레임 실행되기 때문에 Update와 차이가 없습니다.

 

● 코루틴 변수로 관리하기

    ○ 미리 코루틴 변수를 선언 후 메서드를 담아 관리하면 중복 실행 방지 및 관리에 유용합니다.