본문 바로가기
Unity/Manual

Unity의 코루틴(Coroutine)에서 사용되는 yield return 구문 총 정리

by Dev_카페인 2024. 6. 16.
반응형

 

Unity의 코루틴(Coroutine)은 메서드의 실행을 여러 프레임에 걸쳐 나누어 실행할 수 있도록 합니다. 코루틴에서 사용되는 yield return 구문은 다양한 반환 타입을 지원합니다. 아래는 코루틴에서 사용할 수 있는 주요 반환 타입들을 정리한 것입니다.

1. null

yield return null;
  • 한 프레임 대기합니다.
  • 다음 프레임에서 코루틴이 다시 실행됩니다.

2. WaitForSeconds

yield return new WaitForSeconds(2f);
  • 지정한 시간(초)만큼 대기합니다.
  • 예: 2초 동안 대기합니다.

3. WaitForSecondsRealtime

yield return new WaitForSecondsRealtime(2f);
  • 실제 시간으로 지정한 시간만큼 대기합니다.
  • Time.timeScale의 영향을 받지 않습니다.

4. WaitForEndOfFrame

yield return new WaitForEndOfFrame();
  • 현재 프레임의 렌더링이 끝날 때까지 대기합니다.
  • 그 다음 프레임에서 코루틴이 다시 실행됩니다.

5. WaitForFixedUpdate

yield return new WaitForFixedUpdate();
  • 다음 물리 업데이트(FixedUpdate)까지 대기합니다.
  • FixedUpdate는 고정된 시간 간격으로 호출됩니다.

6. CustomYieldInstruction

public class WaitForSecondsCustom : CustomYieldInstruction
{
    private float waitTime;
    public WaitForSecondsCustom(float time)
    {
        waitTime = Time.time + time;
    }
    public override bool keepWaiting
    {
        get { return Time.time < waitTime; }
    }
}

// 사용 예:
yield return new WaitForSecondsCustom(2f);
  • CustomYieldInstruction을 상속하여 사용자 정의 조건을 설정할 수 있습니다.
  • keepWaiting 프로퍼티가 false를 반환할 때까지 대기합니다.

7. WaitUntil

yield return new WaitUntil(() => someCondition);
  • 특정 조건이 true가 될 때까지 대기합니다.
  • 조건은 델리게이트나 람다 표현식으로 전달됩니다.

8. WaitWhile

yield return new WaitWhile(() => someCondition);
  • 특정 조건이 false가 될 때까지 대기합니다.
  • 조건은 델리게이트나 람다 표현식으로 전달됩니다.

9. 다른 코루틴

yield return StartCoroutine(AnotherCoroutine());
  • 다른 코루틴의 완료를 대기합니다.
  • 예: StartCoroutine으로 시작된 다른 코루틴이 완료될 때까지 대기합니다.

10. AsyncOperation

AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("YourSceneName");
yield return asyncLoad;
  • 비동기 작업의 완료를 대기합니다.
  • 예: 씬 로드, 애셋 번들 로드 등.

예제: 다양한 반환 타입 사용

using UnityEngine;
using UnityEngine.SceneManagement;

public class CoroutineExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        // 한 프레임 대기
        yield return null;

        // 2초 대기
        yield return new WaitForSeconds(2f);

        // 2초 실제 시간 대기
        yield return new WaitForSecondsRealtime(2f);

        // 현재 프레임의 렌더링 끝까지 대기
        yield return new WaitForEndOfFrame();

        // 다음 FixedUpdate까지 대기
        yield return new WaitForFixedUpdate();

        // 사용자 정의 대기
        yield return new WaitForSecondsCustom(2f);

        // 특정 조건이 true가 될 때까지 대기
        yield return new WaitUntil(() => Time.time > 10f);

        // 특정 조건이 false가 될 때까지 대기
        yield return new WaitWhile(() => Time.time < 20f);

        // 다른 코루틴 완료 대기
        yield return StartCoroutine(AnotherCoroutine());

        // 비동기 씬 로드 완료 대기
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("YourSceneName");
        yield return asyncLoad;

        Debug.Log("Coroutine complete");
    }

    IEnumerator AnotherCoroutine()
    {
        yield return new WaitForSeconds(1f);
        Debug.Log("Another Coroutine complete");
    }
}

결론

위에서 설명한 다양한 yield return 타입을 사용하면 코루틴을 통해 복잡한 비동기 작업을 쉽게 구현할 수 있습니다. 각 타입은 특정 상황에서 유용하게 사용될 수 있으며, 이를 적절히 조합하여 다양한 비동기 로직을 구현할 수 있습니다.

반응형