본문 바로가기
C#

5. yield return 에 대해 ( 활용 02 )

by Oz Driver 2025. 3. 9.

이전 글에서는 yield return을 사용하여 이동 애니메이션, 타이머, 이벤트 대기 같은 기능을 구현하는 방법을 알아보았습니다. 이번 글에서는 yield return을 활용하여 2D 스프라이트 애니메이션을 구현하는 방법을 다루겠습니다.

 

 

yield return을 사용한 스프라이트 애니메이션

2D 게임에서는 특정 시간 간격마다 스프라이트를 변경하는 방식으로 애니메이션을 구현합니다. 코루틴을 사용하면 별도의 업데이트 로직 없이 자연스럽게 애니메이션을 처리할 수 있습니다. 아래는 yield return을 사용하여 스프라이트 애니메이션을 실행하는 예제입니다.

IEnumerator PlaySpriteAnimation(SpriteRenderer renderer, Sprite[] frames, float frameTime)
{
    int index = 0;
    while (true)
    {
        renderer.sprite = frames[index];
        index = (index + 1) % frames.Length;
        yield return new WaitForSeconds(frameTime);
    }
}

 

이 코루틴을 실행하면 frames 배열에 있는 스프라이트가 frameTime 간격으로 변경되면서 애니메이션 효과가 나타납니다.

 

 

사용 예제

이 코루틴을 StartCoroutine()을 통해 실행하면 캐릭터의 애니메이션을 쉽게 적용할 수 있습니다.

void Start()
{
    SpriteRenderer sr = GetComponent<SpriteRenderer>();
    Sprite[] aniFrames = { frame1, frame2, frame3, frame4 };
    StartCoroutine(PlaySpriteAnimation(sr, aniFrames, 0.1f));
}

 

이제 animationFrames 배열에 등록된 스프라이트들이 0.1초 간격으로 반복되면서 애니메이션이 실행됩니다.

 

 

StopCoroutine() 을 활용한 애니메이션 중지

애니메이션이 필요 없을 때 코루틴을 중지할 수도 있습니다.

void StopAnimation()
{
    StopCoroutine("PlaySpriteAnimation");
}

 

또는, 코루틴의 참조를 저장하고 이를 중지할 수도 있습니다.

Coroutine animCoroutine;
void StartAnimation()
{
    animCoroutine = 
    StartCoroutine(PlaySpriteAnimation(sr, aniFrames, 0.1f));
}

void StopAnimation()
{
    if (animCoroutine != null)
        StopCoroutine(animCoroutine);
}

 

 

 

최적화된 WaitForSeconds 사용 방법

위 코드에서는 yield return new WaitForSeconds(frameTime) 을 매번 생성하기 때문에 GC(Garbage Collection) 부담이 생길 수 있습니다. 이를 방지하려면 WaitForSeconds 객체를 미리 생성해서 재사용할 수 있습니다.

IEnumerator PlaySpriteAnimationOptimized(SpriteRenderer renderer, Sprite[] frames, float frameTime)
{
    int index = 0;
    
    // 미리 생성하여 재사용
    WaitForSeconds wait = new WaitForSeconds(frameTime); 
    
    while (true)
    {
        renderer.sprite = frames[index];
        index = (index + 1) % frames.Length;
        yield return wait; // 생성 비용 절감
    }
}

 

이제 new WaitForSeconds(frameTime);이 반복해서 생성되지 않기 때문에 불필요한 메모리 할당을 줄일 수 있습니다. 이 부분은 최적화 주제에서 더 자세히 다룰 예정입니다.

 

 

마무리 

yield return을 활용하면 2D 스프라이트 애니메이션을 프레임 간격으로 자연스럽게 변경할 수 있다. WaitForSeconds()를 이용하면 별도의 Update() 로직 없이 일정한 속도로 애니메이션을 실행할 수 있다. StopCoroutine()을 사용하면 애니메이션을 필요할 때 중지할 수 있다. WaitForSeconds의 최적화 방법도 존재하며, 이는 나중에 더 자세히 다룰 예정이다.

 

이번 글에서는 yield return을 활용하여 2D 스프라이트 애니메이션을 구현하는 방법을 다루었습니다.

다음 글에서는 코루틴을 중지하는 다양한 방법과 yield break;의 활용법을 살펴보겠습니다!