본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[C#] Coroutine

by 빛하_ 2024. 1. 19.

Coroutine (코루틴)

하나의 작업을 다수의 프레임에 분산할 때 사용한다.

ex. 텍스트의 색 변환, 인벤토리 창에서 한 칸을 한 프레임마다 보여주고 싶을 때

 

주로 한 개의 메서드 안에서 특정 값을 재활용해서 오브젝트를 연출하고 싶을 때 사용한다.

함수의 실행을 일시 중지하고 다시 재개하는 방식으로 비동기적인 작업을 수행한다.

 

// 예시코드 1
using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    IEnumerator Start()
    {
        while (true)
        {
            Debug.Log("Hello, World!");
            yield return new WaitForSeconds(1f); 
        }
    }
}

 

예시 코드1에서 yeild return new WairForSecnonds(1f); 의 역할은 코루틴을 1초 동안 중지시키는 것이다.

실제 시간으로 정확히 1초라고 할 수는 없다. (유니티는 프레임 단위로 작동하기 때문에 코드는 대략 1초를 맞춰줄 뿐)

코루틴은 개발자가 지정한 시간 간격으로 반복적인 작업을 수행할 수 있다. 

 

IEnumerator

IEnumerator 인터페이스는

Current, MoveNext() 메서드, Reset() 메서드 총 3개의 멤버로 이루어져 있다.

그 중 Enumerator는 Current와 MoveNext() 를 반드시 구현해야 한다.

유니티의 DelayedCallManager등록해 다음 단계에 실행하는 방식으로 구현한다.

 

Yield return 관련 함수들

yield return null : 다음 프레임까지 대기

yield return new WaitForSeconds(float) : 입력한 초(sec) 만큼 대기

 

TimeScale 이 0일 때 코루틴을 실행하기 위한 방법

 = yield return new WaitForSecondsRealtime(float) : Timescale영향없는 실제 시간 기준 초 대기

 

yield return new WaitFixedUpdate() : 다음 프레임의 FixedUpdate 까지 대기

yield return new WaitForEndOfFrame() : 모든 렌더링 작업이 끝날 때까지 대기

 

<중첩 코루틴>

yield return startCoroutiune(string) : 입력한 다른 코루틴이 끝날 때까지 대기

중첩 코루틴은 성능 측면에서 비용이 발생하지만, 다른 코루틴을 대기할 수 있는 유용한 방식이므로 복잡한 프로그램이 아닌 경우 사용하기 좋다.

 

yield return new www(string) : 입력한 웹 통신 작업이 끝날 때까지 대기

yield break : 코루틴 종료

 

코루틴의 종료

코루틴은 StopCoroutineStopAllCoroutines를 이용해 종료할 수 있다.

코루틴을 소유하고 있는 게임오브젝트를 정지하거나 파괴하는 경우에도 종료된다.

단, 컴포넌트에서 .enabled를 false로 하는 경우 꺼지지 않는다.

(유니티 엔진 상에서 컴포넌트가 꺼졌어도 코루틴은 계속 작동하는 상태이다.)

왜냐하면, 코루틴의 소유자는 게임오브젝트이기 때문에. 게임 오브젝트가 살아있다면 코루틴은 사라지지 않는다.

 

 

 

댓글