코루틴(Coroutine)에 대해

옙권·2025년 3월 11일

코루틴(Coroutine)은 시간에 걸쳐 실행되는 작업을 처리할 수 있도록 해주는 기능이다.

일반적인 함수한 번 호출되면 즉시 실행을 완료하지만,

코루틴은 실행을 잠시 멈췄다이후 특정 조건이 충족되면 다시 실행한다.

코루틴의 특징

  1. 비동기적 작업 처리: 특정 시간동안 기다리거나 반복적인 작업을 수행할 때 사용됨.

  2. IEnumerator 반환 타입 사용: IEnumerator 타입을 반환해야 하고, 'yield return' 키워드를 사용해 실행을 일시 정지할 수 있음.

  3. StartCoroutine으로 실행: StartCoroutine(코루틴함수()) 형태로 호출해야 함.

4. 게임 오브젝트가 비활성화되면 중지: 코루틴을 실행하는 오브젝트가 비활성화되거나 제거되면 해당 코루틴도 자동으로 중지됨.

ex)

public class Coroutine : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(PrintNumbers()); // 코루틴 실행
    }

    IEnumerator PrintNumbers()
    {
        for (int i = 1; i <= 5; i++)
        {
            Debug.Log(i);
            yield return new WaitForSeconds(1f); // 1초 대기
        }
    }
}
  • Start()에서 StartCoroutine(PrintNumbers())를 호출하면 PrintNumbers()가 실행.

  • for 문이 루프 1부터 5까지 반복하며 Debug.Log(i) 실행.

  • IEnumerator 반환 타입 사용하고 yield return new WaitForSeconds(1f); 로 인해 각 숫자가 1초 간격으로 출력.

다양한 yield return 종류

1. yield return null

  • 다음 프레임까지 대기

2. yield return newWaitForSeconds(시간)

  • 지정된 시간(초)만큼 대기

3. yield return newWaitForSecondsRealTime

  • 실제시간(Real time)기준으로 대기
    (Time.timescale)의 영향을 받지 않는다

4. yield return new WaitForEndOfFrame();

  • 현재 프레임이 끝날 때까지 대기

5. yield return new WaitUntil(조건)

  • 조건이 참(true)이 될 때까지 대기

ex) yield return new WaitUntil(() => Time.time > 10f);
게임 내 시간이 10초를 초과할 때까지 대기

6. yield return new WaitWhile(조건)**

  • 조건이 거짓(false)이 될 때까지 대기

ex) yield return new WaitWhile(() => Input.GetKey(KeyCode.Space));
스페이스바가 눌려있는 동안 기다리기

7. yield break

  • 코루틴 실행을 즉시 종료

코루틴을 완전히 중지하고 싶다면
StopCoroutine() 또는 StopAllCoroutines() 사용하기

ex)

IEnumerator Coroutine()
{
    while (true)
    {
        Debug.Log("Running...");
        yield return new WaitForSeconds(1f); //1초 대기
    }
}

void Start()
{
    StartCoroutine("Coroutine");
    Invoke("StopMyCoroutine", 5f); // 5초 후에 중지
}

void StopCoroutine()
{
    StopCoroutine("Coroutine"); // 특정 코루틴 중지
    
    // StopAllCoroutines(); // 실행 중인 모든 코루틴 중지
}

코루틴의 장점과 단점

장점

  • 게임 내 애니메이션, 대기, 반복적인 작업 등을 쉽게 구현할 수 있음.
  • Update()보다 효율적이며, 불필요한 연산을 줄일 수 있음.
  • yield return을 활용해 코드가 직관적으로 작성됨.

단점

  • 구조화된 프로세스 관리어려울 수 있음 (많이 사용하면 코드가 복잡해짐).
  • 코루틴이 많아지면 성능에 영향을 줄 수 있음.
  • 예외 처리가 어렵고, 특정 상황에서 예기치 않은 동작이 발생할 수도 있음.

코루틴 사용 예시

bool isShoot = true;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && isShoot)   //스페이스바 누르면 쏘기
    {
        StartCoroutine(Shoot());
    }
}

IEnumerator Shoot()
{
    isShoot = false;
    Debug.Log("총알 발사!");
    yield return new WaitForSeconds(1f); // 1초 대기
    isShoot = true;
}

Q : 그럼 코루틴과 반복문은 서로 같나요?

A : 코루틴과 반복(for, while문등)은 비슷한 부분이 있지만 차이점이 있다.

반복문

  • 실행 방식 : 조건이 만족될 때까지 즉시 실행

  • 흐름 제어 : 한 번 시작하면 끝날 때까지 멈출 수 없음

  • 프레임 영향 : 한 프레임 내에서 반복 실행

  • 사용 목적 : 단순한 연산 반복

EX)

void PrintNumbers()
{
    for (int i = 1; i <= 5; i++)
    {
        Debug.Log(i);
    }
}
  • 실행하면 1, 2, 3, 4, 5가 즉시 출력.
  • 즉시 완료되므로 시간 간격을 두고 실행할 수 없다.

코루틴

  • 실행 방식 : 일정 시간 동안 실행을 멈췄다가 다시 실행 가능

  • 흐름 제어 : yield return으로 중단 및 재개 가능

  • 프레임 영향 : 여러 프레임에 걸쳐 실행 가능

  • 사용 목적 : 시간 지연, 애니메이션, 비동기 처리

EX)

IEnumerator PrintNumbersCoroutine()
{
    for (int i = 1; i <= 5; i++)
    {
        Debug.Log(i);
        yield return new WaitForSeconds(1f); // 1초 대기
    }
    
    void Start()
    {
    StartCoroutine(PrintNumbersCoroutine());
    }
}
  • 실행하면 1초마다 1, 2, 3, 4, 5가 출력.
  • yield return을 사용해서 반복 실행을 멈췄다가 다시 실행할 수 있다.
  • 여러 프레임에 걸쳐 실행되므로 애니메이션, 시간 간격을 두는 작업 등에 유용하다.

코루틴을 써야 하는 경우

  • 반복 작업이 일정 시간 간격을 가져야 할 때

  • 비동기 작업(네트워크 요청, 데이터 로딩 등)을 처리할 때

  • 애니메이션이나 이펙트를 부드럽게 실행할 때

  • 프레임마다 상태를 업데이트해야 할 때

즉시 실행할 반복 작업이면 for나 while,
시간이 걸리는 반복 작업이면 코루틴

0개의 댓글