[ 개발 공부 ] Unity Coroutine의 동작 원리 및 특징

2024. 5. 17. 16:00게임 개발/개발 공부

혹여나 틀린 점이 있다면 댓글로 피드백 해주시면 감사하겠습니다.

 

> Unity Coroutine의 동작원리

Key Point!

  • 어떻게 싱글 스레드로 비동기 방식을 구현하는가?
  • 어느 주기에 실행되는가?
  • IEnumerator는 무엇인가?

> 코루틴의 동작 원리 요약

1. MonoBehaviour를 상속받은 스크립트에서 StartCoroutine으로 실행한다.
2. StartCoroutine으로 실행된 IEnumerator 메서드 yield return시 제어권한을 유니티에 반환한다.
3. 이후 유니티 라이프 사이클에 있는 LateUpdate에서 yield return의 조건을 충족하는 지 확인한다.
4. 조건이 충족된다면, 나머지 구문을 실행한다.


이러한 동작을 우리는 코루틴이라고 부른다.

 

+ 정보

제어권한은 유니티 내부에 있는 DelayedCallManager로 반환되고,

이후 yield 반환문 조건은 LateUpdate 타이밍에 DelayedCallManager 에서 확인합니다.

 

하지만 요약만 들으면 어떤 방식인지 어느 정도 감은 잡힐 수 있지만, 자세한 설명은 부족할 것입니다.

이해하기 위해서는 알아야 할 부분들이 굉장히 많기 때문에 링크를 첨부하겠습니다.

 

- IEnumerator에 대해서

(링크_)

 

- 싱글 스레드로 비동기 방식을 구현하는 방법

(링크_)

 


> 코루틴의 특징

1. 코루틴은 MonoBehaviour를 상속받는 객체에서 실행된다.

 

2. 코루틴은 반드시 IEnumerator를 반환해야 한다.

 

3. yield return을 만날 때마다 이후 실행되는 코드들이 

 

4. 코루틴을 다루는 메서드들은 모두 MonoBehaviour 클래스에 구현되어 있습니다.

StartCoroutine, StopCoroutine, StopAllCoroutine...

 

5. 코루틴에는 소유권이라는 개념이 있다.

코루틴을 실행한 MonoBehaviour를 상속받는 객체에서 소유권을 얻는다. 소유권을 가진 객체가 비활성화되거나 파괴되면 해당 객체가 소유한 모든 코루틴이 중단된다.

 

6. 코루틴은 메인 스레드에서 실행된다.

코루틴은 멀티 스레드가 아닌 단일 스레드에서 비동기 방식을 구현하고 있다.


 

+ 유니티에서, 코루틴과 인보크의 차이

둘 다 싱글 스레드에서 비동기 방식을 구현합니다.

 

1. 실행 시간

Coroutine은 StartCoroutine을 통해 함수를 실행할 수 있지만,

Invoke는 무조건 "함수 이름"으로 실행되기 때문에 리플렉션이 일어납니다.

이 부분에서 Invoke가 시간이 코루틴보다 느려질 수 있다.

 

2. 작업의 다양성

그리고 Invoke는 함수를 늦게 실행하거나, 몇 초 간격으로 반복하는 단순한 작업만 가능하다면,

Coroutine은 다양한 작업이 가능합니다.

 

3. 오브젝트의 활성화, 비활성화에 따른 중지

Coroutine은 실행한 오브젝트가 비활성화되면 자동으로 중지됩니다.

반면에 Invoke는 실행한 오브젝트가 비활성화되어도 중지되지 않습니다.

 

4. 매개변수 전달 가능

Coroutine은 매개변수가 있는 함수까지 실행이 가능한 반면,

Invoke는 void형만 실행할 수 있습니다.

 

5. TimeScale

코루틴은 TimeScale이 0인 경우에도 yield return new WaitForSecondsRealtime()를 활용해 동작시킬 수 있습니다. 

Invoke는 TimeScale의 영향을 받는다.