유니티

[유니티] Coroutine 작동 방식 및 yield의 역할

유니티 게임 개발 2025. 3. 5. 22:32

StartCoroutine 개념

StartCoroutine은 Unity에서 코루틴(Coroutine)을 시작하는 데 사용된다. 코루틴은 특정 작업을 비동기적*으로 수행할 수 있는 방법을 제공하며, 이로 인해 게임 로직의 흐름을 중단하지 않고도 시간이 오래 걸리는 작업을 처리할 수 있다.

 

*비동기란 특정 작업이 완료 되지 않고, 다른 작업을 동시에 진행할 수 있는 방식을 말한다.

yield 개념

yield는 코루틴 내에서 특정 조건을 기다릴 때 사용된다. yield는 Unity 엔진에게 코루틴을 잠시 중지하고 지정된 조건을 기다리게 하며, 조건이 만족되면 다음 코드를 실행하게 한다.

 

StartCoroutine과 yield 사용 예시

using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    // 3초 후에 메시지를 출력하는 코루틴 함수
    private IEnumerator Start()
    {
        Debug.Log("코루틴 시작!");

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

        // 3초가 지난 후에 실행되는 코드
        Debug.Log("3초가 경과했습니다.");
    }

    // 버튼 클릭 시 호출되는 함수
    public void StartMyCoroutine()
    {
        StartCoroutine(MyCoroutine());
    }

    private IEnumerator MyCoroutine()
    {
        Debug.Log("코루틴 시작!");

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

        // 2초 뒤에 실행되는 코드
        Debug.Log("2초 후에 작업 실행!");
    }
}
 

위 코드 설명

  • StartCoroutine(MyCoroutine()) : StartCoroutine을 사용해 MyCoroutine을 시작한다.
  • yield return new WaitForSeconds(3f) : 3초 동안 대기하는 동안, Unity의 실행 흐름은 멈추지 않고 다른 작업을 계속 처리합니다. 3초 후에 코드가 다시 실행된다.
  • Debug.Log : 각 시점에서의 상태를 로그로 출력하여, 코루틴의 흐름을 확인할 수 있다.

yield return null을 사용한 예시

yield return null은 코루틴 내에서 한 프레임을 기다리라는 의미이다. 이 코드를 사용하면 매 프레임마다 특정 작업을 실행할 수 있다.

private IEnumerator UpdatePositionOverTime()
{
    float elapsedTime = 0f;
    float moveTime = 5f; // 5초 동안 이동

    while (elapsedTime < moveTime)
    {
        elapsedTime += Time.deltaTime; // 시간 경과
        transform.position = Vector3.Lerp(transform.position, new Vector3(10f, 0f, 0f), elapsedTime / moveTime);

        yield return null; // 다음 프레임까지 대기
    }

    Debug.Log("위치 이동 완료!");
}
 

위 코드 설명

  • 이 코루틴은 5초 동안 객체를 이동시킨다.
  • yield return null을 사용하여 매 프레임마다 객체의 위치를 조금씩 변경한다.
  • Vector3.Lerp는 두 점 사이를 부드럽게 보간(lerp)하여 객체를 이동시킨다.