내일배움캠프 TIL

내일배움캠프 28일차 TIL "코루틴(Coroutine)"

Jooglorystar 2024. 10. 23. 21:00

 

코루틴(coroutine)은 작업을 여러 프레임에 분산시킬 수 있는 메서드이다.

일반적인 메서드들은 프레임에 한번 호출되면 끝나지만, 코루틴은 실행을 잠시 멈추고 다음프레임에 계속 이어서 호출 될 수 있다.

그러나 이게 코루틴이 비동기적으로 실행된다는 의미는 아니다. 코루틴의 작업은 메인 스레드에서 진행되지만, 마치 비동기로 진행되는 것처럼 실행될 뿐이다.

 

다음은 코루틴을 사용한 예시코드이다.

 

public class BlinkCoroutine : MonoBehaviour
{
    private SpriteRenderer spriteRenderer;

    private Coroutine coroutine;

    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }
    
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (coroutine == null)
        {
            coroutine = StartCoroutine(Blink());
        }
    }

    private IEnumerator Blink()
    {
        while (true)
        {
            spriteRenderer.enabled = false;
            yield return null;

            spriteRenderer.enabled = true;
            yield return null;
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (coroutine != null)
        {
            StopCoroutine(coroutine);
            coroutine = null;
            spriteRenderer.enabled = true;
        }
    }
}

 

해당코드는 is trigger된 오브젝트 위에 올라가 있으면 스프라이트가 깜박이고, 내려오면 깜박임이 멈추는 코드이다.

 

코루틴을 시작할 때는 courutine = StartCoroutine(Blink()); 처럼 StartCoroutine(메서드) 형식으로 해당 코루틴을 시작할 수 있다.

StartCoroutine()에 매개변수가 되는 메서드는 IEnumerator를 반환해야한다.

반환은 위 코드처럼 yield return new WaitForSeconds(0.1f);이나 yield return null; 같은 식으로 올 수 있다.

이 외에도 여러 반환 방법이 있지만, 공통점은 return만큼 해당 코루틴을 종료한다는 뜻이다.

이를태면 yield return new WaitForSeconds(0.1f);에서는 0.1초동안 멈추고 다음 코드를 실행한다는 뜻이다.

yield return null;는 시간이 아닌 바로 다음 프레임을 불러온다. 

 

코루틴을 멈출 때는 StopCoroutine(courutine); 으로 멈출 수 있다. 예시코드에서는 OnTriggerExit2D했을 때, 코루틴을 멈추고 coroutine을 null로 초기화하는 것 까지 진행했다.