[Unity]코루틴(Coroutine)

2022. 4. 12. 23:15Tech/Unity

    목차

이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.

 

서론

 유니티에서 빼놓을 수 없는 요소중 하나는 코 루틴을 이용한 비동기 처리입니다. 사실 진정한 의미의 비동기 처리는 아니지만, 그렇게 작동하는 것처럼 보입니다. 이번 글에서는 이러한 코 루틴에 관하여 간단히 알아보려 합니다.


코루틴(Coroutine)

 

  • 여러 개의 입구를 허용하여 실행 재개가 가능한 것 yield return으로 멈춘 시점에서 다시 시작
  • 이전 상태를 기억하고 있다가 재호 출시 해당 위치에서 시작
  • 유니티에서 협력형 멀티태스킹을 구현하는 용도로 사용(시분할)
    • CPU를 나눠 쓰는 방식
    • 리소스를 사용하는 도중에 강제로 CPU를 뺏거나 하지 않아 임계 영역을 보호하기 위한 락이나 세마포어등 동기화 불필요
  • 특정 작업을 단계적으로 발생하게 함
  • 시간이 흐름에 따라 발생하는 루틴을 작성할 수 있음
  • 다른 연산이 완료될 때까지 기다리는 루틴을 작성할 수 있음

코루틴을 사용해본 사람은 yield return ~ 와 같은 구문을 봤을 것입니다. 코루틴에 이지점이 다음 진입점이 된다는 것입니다. 이것이 무슨 말이냐면, yield return 부분부터 다음 호출이 시작된다는 것이죠.

//코루틴 yield 예시 
yield return new WaitForSeconds(time); 
//은 time이라는 시간을 기다린후 진입이란 뜻

 yield return으로 코 루틴을 리턴하면 해당 작업을 기다린 뒤 뒤 작업을 수행합니다. 이러한 코 루틴은 주로 유니티에서의 애니메이션 처리나 지연 연산 등에 이용합니다. 그 외에도 코 루틴의 특성은 많은곳에서 활용할 수 있을것인데, 이는 사용하는 사람의 재량이 아닐까 싶습니다.

 


마무리

 비동기적인 처리를 하는 코루틴의 특성상 매계 인자로 ref, out 은 사용할 수 없습니다. 과거 이 사실을 모르고 꽤나 고생을 했던 기억이 나네요. 또한, Monobehaviour에 의해 실행되고 관리되기 때문에 코 루틴을 실행한 Monobehaviour가 비활성화(혹은 삭제)가 된다면 코 루틴에 작성된 로직은 정상적으로 작동하지 않습니다. 주로 Monobehaviour가 붙은 게임 오브젝트들이 의도치 않게 파괴되거나 비활성화되면, 갑자기 잘 작동하던 코 루틴이 증발하는 현상을 볼 수 있을 겁니다.

반응형
LIST