티스토리 뷰

Unity

[Unity] 코루틴(Coroutine)

sungjine 2023. 8. 3. 21:46
반응형

코루틴은 주로 프레임, 시간 단위로 반복적으로 수행해야 하는 함수 등이 있거나 HTTP 전송, 에셋 로드, 파일 I/O 완료 등을 기다리는 것과 같이 긴 비동기 작업을 처리해야 하는 경우 코루틴을 사용한다.

 

코루틴을 사용하게 되면 프로세스가 진행되는 중 코루틴이 프로세스를 중단시키고 Unity에서 일시적으로 제어를 가져와 사용하고 다시 Unity에 제어와 선택적 반환 값을 반환하여 중단된 부분에서 다시 시작하게 된다.

 

다만 코루틴은 다중 스레드를 사용하는 것과는 다르고 메인 스레드에서 실행된다.

 

실행 방법

아래는 코루틴 메서드의 기본 구조다.

IEnumerator Coroutine()
{
    (1)
    yield break;
    (2)
}

반환 값은 IEnumerator이여야 하며 반환할 때는 yield 문을 사용해야 한다.

 

위의 코드를 실행할 경우 (1) 번이 실행되고 코루틴이 종료되기 때문에 (2)는 실행되지 않는다.

만약 yield break를 yield return null로 변경할 경우 다음 Update()가 실행될 때까지 기다렸다가 (2)를 실행한 후 종료된다.

또한 여러 번 반복해야 하는 경우 아래와 같이 작성할 수 있다.

IEnumerator Coroutine()
{
    while(true)
    {
        yield return null;
    }
}

 

그리고 반환할 수 있는 값은 아래와 같다.

yield break;

코루틴이 종료된다.

 

yield return new WaitForSeconds(float time);
원하는 시간(초)만큼 기다리는 것이 가능하다.


yield return new WaitForSecondsRealtime(float time);
WaitForSeconds와 비슷하지만, Scaled Time의 영향을 받지 않고 현실 시간 기준으로만 동작한다.

yield return new WaitForFixedUpdate();
다음 FixedUpdate()가 실행될 때까지 기다린다.

yield return new WaitForEndOfFrame();
Unity Lifecycle 중 yield WaitForEndOfFrame 이 실행될 때까지 기다린다.

yield return null;
다음 Update()가 실행될 때까지 기다린다.

yield return new WaitUntil(System.Func<Bool> predicate);
조건식이 성공할 때까지 기다린다.

yield return new WaitWhile(System.Func<Bool> predicate);
조건식이 성공하는 중에는 기다린다.

yield return StartCoroutine (IEnumerator coroutine);
다른 코루틴을 실행하고 해당 코루틴이 끝날 때까지 대기한다.

 

코루틴을 만든 후 실행하기 위해서는 StartCoroutine 함수를 사용해야 한다.

StartCoroutine 함수를 사용할 때는 아래와 같은 방법이 있다.

void Update()
{
    StartCoroutine("Coroutine");
    //파라미터가 필요할 경우 : StartCoroutine("Coroutine", params);
    StartCoroutine(Coroutine());
    //파라미터가 필요할 경우 : StartCoroutine(Coroutine(params));
}

IEnumerator Coroutine()
{
    while (true)
    {
        yield break;
    }
}

 

코루틴 정지

코루틴은 StopCoroutine()과 StopAllCoroutines()을 사용하여 정지시킬 수 있다. 코루틴에 연결된 GameObject를 비활성화하기 위해 SetActive를 false로 설정하면 코루틴이 정지된다. MonoBehaviour의 인스턴스를 Destroy 하면 OnDisable을 즉시 트리거하며 Unity는 코루틴을 정지시킨다.

참고: Enabled를 false로 설정하여 MonoBehaviour를 비활성화한 경우에는 코루틴이 정지되지 않는다.

 

단점

StartCoroutine을 할 때 가비지(Garbage)가 생성된다.

이렇게 생성되는 가비지를 줄이기 위해서는 StartCoroutine을 최소한으로 호출해야한다.

 

그리고 new WaitForSeconds 와 같이 계속 객체를 생성하는 경우 가비지가 쌓이게 된다.

때문에 반복적으로 사용하게 되는 경우 캐싱을 통해서 최적화를 해야한다.

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31