Unity - Coroutine

Youngmin Choi·2022년 5월 28일
0

Unity

목록 보기
12/16
post-thumbnail

1. Coroutine이란?

Co(with) + routine(루틴)이 합쳐진 말로, 직역하면 '협동루틴'이라고 불린다.


코루틴을 사용하면 다음과 같은 특성을 갖는다!

  • 다른 연산이 완료될 때까지 대기 가능
  • 시간의 흐름에 따른 처리 가능
  • 루틴을 병행하여 실행 가능

2. Coroutine의 사용

위의 특성을 근거로, Unity에서 다음과 같은 상황에 사용하면 좋다.

  • 특정 프레임이 아닌, 특정 시간을 대기해야 할 때

    위 코드는 coolTime(1초) 마다 총알을 발사하는 코드이다!
    coolTime과 '현재 시간 - lastFireTime'을 비교해서 coolTime이 지났으면 발사하는 식으로 구현되어 있다.


    그런데 이 코드의 문제가 무엇일까??
    바로 총알이 발사되지 않을 때 낭비되는 연산이다!
    만약 아직 coolTime이 지나지 않아 총알이 발사되지 않고 있다면 유니티에서는 무엇을 하고 있을까?
void Update()
{
	if(Time.time - lastFireTime >= coolTime)
}

Update() 함수 속에 이 연산을 계속하고 있다! 한 마디로 총알을 쏘고싶지 않을때도 쓸데없는 연산을 계속하고 있는 것..! 게임에서는 이러한 성능 문제 하나하나가 굉장이 중요하기 때문에 문제점을 해결하는 것이 좋다! 다행히 우리는 Coroutine이라는 것을 활용하여 이를 해결할 수 있다!

위와 같이 코루틴을 사용하여 코드를 작성하면 아래의 그림과 같이 동작하게 된다~

코루틴은 하나의 쓰레드에서 마치 여러개의 쓰레드를 사용하는 것같이 작동한다. 엄밀히 말하면 코루틴은 쓰레드가 아니다!!(중요) 쓰레드처럼 보여지는 것 뿐!
그래서 코루틴은 프로그램 상에서 보면 멀티 쓰레드와 비슷하다고 이해하면 된다. 하지만 비슷한거지 쓰레드는 아니라는 점!! 유니티는 싱글 스레드로 동작한다는 점을 기억하자!


코루틴은 호출 시 멈췄던 부분과 관련된 정보를 가지고 있습니다. 그래서 1초 후에 다시 호출 되었을 때 이전에 실행했던 다음부터 실행할 수 있었던 것이다. 또 재개(Resume)와 양보(yield)가 가능해, 양보(중지)(yield)하면 루틴은 종료되지 않고 대기했다가 다시 호출되는 곳에서 재개(Resume)할 수 있다.


마지막으로 StartCoroutine이 있듯이, StopCoroutine도 있다!
StopCoroutine은 아무때나 사용하면 안되고, 무한루프에서 특정조건으로 빠져나올 때 사용해야한다!


결론적으로 코루틴은 다른 작업을 먼저하도록 양보(yield)하며, 코루틴 실행도중 다른 작업을 할 수 있고, 다시 재개(resume)하여 멈췄던 곳에서부터 기존 데이터로 실행할 수 있다! 주로 대기시간이 필요할때 혹은 Fade in/out 그리고 Color 알파(a)값을 조절할 때 등등 사용된다.


Update() vs Coroutine 무엇을 사용할까??

  • 코루틴은 프레임에 독립적인 시간이 필요할 때 사용하고, 프레임 당 처리가 필요할 땐 Update()를 사용해야 한다.


    엔진이 제공하는 데이터들과 이를 수행하는 명령들.
    A. Yield return null : 다음 프레임까지 대기
    B. Yield return new WaitForSeconds(flat) : 지정된 초(float) 만큼 대기
    C. Yield return new WaitForFixedUpdate() : 다음 물리 프레임까지 대기
    D. Yield return new WaitForEndOfFrame() : 모든 렌더링 작업이 끝날 때 까지 대기
    E. Yield return StartCoroutine(string) : 다른 코루틴이 끝날 때 까지 대기
    F. Yield return new WWW(string) : 웹 통신 작업이 끝날 때까지 대기
    G. Yield return new AsyncOperation : 비동기 작업이 끝날 때 까지 대기 (씬로딩)
profile
Always, Continually, In all circumstance

0개의 댓글