2024. 10. 20. 19:01ㆍUNITY/공부
유니티에서 코루틴(Coroutine)을 열거자(Enumerator)로 선언하는 이유는, 코루틴이 유니티의 게임 루프와 비동기적으로 작동하기 때문입니다. 정확하게는 비동기적인 것처럼 실행되는 것이다. 실제로는 유니티의 메인 스레드에서 순차적으로 실행되며, 진정한 비동기적 작업(즉, 멀티쓰레드에서 동시에 실행되는 작업)은 아니다.
비동기적 "처럼" 보이는 이유
유니티의 코루틴은 메인 스레드에서 동작하면서도, yield return 을 통해 특정 지점에서 일시 정지하고 특정 조건이 충적되면 다시 재개한다. 이 일시 정지 상태동안, 다른 작업들이 스레드에서 계속 실행될 수 있기 때문에, 마치 비동기적인 작업처럼 느껴지는 것이다.
yield 키워드
IEnumerator 코드를 특정 지점에서 멈추게 할 수 있는 이유는 yield 키워드 덕분이다. yield는 코루틴의 흐름을 제어하는 역할을 하며, 이를 통해 코드가 특정시점에서 멈추고 이후 조건이 충족될 때 다시 재개할 수 있도록 한다.유니티는 코루틴을 시작하면 IEnumerator의 상태를 계속 추적하면서 yield return 구문을 만날 때 까지 적절한 작업(대기, 다른 코루틴 대기 등)을 수행한다. 대기 조건이 완료되면 그 지점부터 다시 코루틴을 재개한다.
유니티의 코루틴 상태 관리 방식
1. 코루틴의 시작:
- StartCoroutine() 메서드를 호출하면, 유니티는 IEnumerator 객체를 생성하고 이를 코루틴 큐에 등록한다. 이때, IEumerator는 코드의 흐름을 멈추고 재개할 수 있는 상태를 유지하는 개체로 작동한다.
2. MoveNext() 호출:
- 유니티의 게임 루프가 매 프레임마다 각 코루틴에 대해 MoveNext()를 호출한다.
- MoveNext()는 IEnumerator의 내부 상태를 갱신하며, yield return이 반환되는 지점까지 코드를 실행한다. 즉, MoveNext()가 호출될 때마다 yield return을 만나기 전까지 코루틴 내부의 코드가 실행된다.
3. yield return과 일시 중지:
yield return을 만나는 순간, MoveNext()는 false를 반환하지 않고 유니티는 코루틴을 일시 중지시킵니다. 이때, 어떤 종류의 yield return이 사용되었는지에 따라 일시 중지의 방식이 달라진다.
- yield return null: 다음 프레임까지 대기하고, 그 후에 코루틴을 다시 시작한다.
- yield return new WaitForSeconds(float time): 지정된 시간(초)만큼 대기한 후 다시 시작한다.
- yield return StartCoroutine(OtherCoroutine()): 다른 코루틴이 완료될 때까지 대기한다.
- yield break: 코루틴을 종료한다.
4. 내부 관리:
- 유니티는 각 코루틴의 IEnumerator 객체와 그 객체가 현재 어떤 상태인지(대기 중, 재개 준비 중, 특정 시간 동안 멈춤 등)에 대한 정보를 내부 관리 시스템을 통해 추적한다. 이때, 유니티는 각 코루틴의 상태와 실행을 관리하기 위해 타이머, 조건 검사, 다른 코루틴상태 등을 추적한다.
5. 재개:
- 대기 시간이 끝났거나 조건이 충족되면, 유니티는 다시 해당 코루틴의 MoveNext()를 호출하여 저장된 상태로부터 이어서 실행을 재개한다. 이때 다시 코드가 실행되다가, 또 다른 yield return을 만나면 동일한 방식으로 다시 일시 정지한다.
참고자료
'UNITY > 공부' 카테고리의 다른 글
[Unity] 유니티는 왜 싱글 쓰레딩을 권장하는가? (1) | 2024.11.28 |
---|---|
[Unity] Unity의 enabled, isActiveAndEnabled 및 activeInHierarchy의 차이점 (0) | 2023.05.11 |
[Unity] 현재 실행중인 애니메이터의 길이를 구하는 방법 GetCurrentAnimatorStateInfo (0) | 2023.02.22 |
[Unity] 드로우 콜, Draw Call (0) | 2022.08.24 |
[Unity]유니티에 csv, 엑셀, txt 파일 불러오기 (0) | 2021.06.24 |