본문 바로가기
Unity 3D

Unity C# 문법 (8) 코루틴(Coroutine) 함수

by 연꿈술사 2023. 8. 12.

안녕하세요 연꿈술사 입니다.

오늘은 기초적인 함수는 아니지만 Unity 에서 게임을 제작하기에 있어 자주 사용하고 중요한 코루틴에 대해

알아보려고 합니다. 코루틴은 일반 함수처럼 시작점부터 끝점까지 연속적으로 실행되는 것과 달리 비동기적으로

실행되는 함수입니다.

특정 시점에서 일시 중시되었다가 나중에 다시 재개될 수 있도록 합니다. 일정시간 이후에 함수를 시작할 수도 있고,

어느 하나를 실행 하고 일정시간을 기다렸다가 이후에 써진 내용을 다시 재개할 수 있습니다.

 

함수를 예로 들어 설명해보겠습니다.

void Start()
    {
        StartCoroutine(MyCoroutine());
    }

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

        yield return new WaitForSeconds(2.0f);

        Debug.Log("코루틴 시작! 이 나온 후 2초 지남");

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

        Debug.Log("이전 로그 다음 프레임에 실행됨.");
    }

위의 예시를 보면 'MyCoroutine()'은 첫 로그를 실행 후 2초 동안 일시 중지 됩니다. 2초가 지나면 다시 재개되어 두 번째

로그를 출력하고, 그 다음 프레임에 세 번째 로그를 실행합니다.

코루틴 함수는 작성 시 IEnumerator와 함께 작성하고, yield return 값을 리턴하여 동작을 수행합니다.

 

다음으로는 yield return 값에 사용할 수 있는 값들에 대해 알아보겠습니다.

1. null : 코루틴이 다음 프레임까지 일시 중지됩니다.

2. WaitForSeconds(float seconds) : 지정된 시간(초) 동안 코루틴을 일시 중지합니다.

3. WaitForFixedUpdate() : 다음 FixedUpdate() 호출까지 코루틴을 일시 중지합니다.

4. StartCorountine() : 다른 코루틴이 완료될 때까지 기다립니다.

5. WaitUntil(Func<bool> predicate) : 주어진 조건이 참이 될 때까지 코루틴을 일시 중지합니다.

6. WaitWhile(Func<bool> predicate) : 주어진 조건이 거짓이 될 때까지 코루틴을 일시 중지합니다.

 

이외에도 다양한 리턴값이 있습니다.

 

그럼 게임을 만들 때 어떤 상황에 사용하는지도 알아보겠습니다. 막상 개념만 보고 게임에 적용해보려면 

어떻게 써야할 지 감이 오지 않습니다.

 

1. 반응지연

게임 내에서 플레이어가 특정 아이템을 사용 시 적이 5초동안 기절한다고 생각해봅시다. 여기서 WaitForSeconds 를

리턴받아 코루틴으로 적을 일정시간 동안 기절시키고, 일정시간 이후에 다시 복구시킬 수 있습니다.

아래는 예시입니다.

IEnumerator StunEnemy(Enemy enemy)
    {
        enemy.Stun();
        yield return new WaitForSeconds(5.0f);
        enemy.RecoverFromStun();
    }

2. 비동기 로딩

게임 내에서 큰 리소스나 레벨을 로드할 시에 화면이 멈춰있으면 답답한 느낌을 받게 됩니다. 이 때 화면이 멈춰있지 않도록 비동기적으로 소스를 로드하면서 진행률을 표시할 수 있습니다.

기초적으로 다루기엔 어려울 수 있어 로딩에 관한 구현 및 코루틴에 관한 글은 추후에 업로드 하겠습니다.

 

3. 애니메이션 순차재생

캐릭터가 도착지점에 도달했을 시에 순차적으로 여러 액션을 수행하는 애니메이션을 만들고 싶다면. 코루틴을 사용해

각 단계 사이에 지연을 만들어 자연스럽게 할 수 있습니다.

IEnumerator PlaySequenceAnimation(Character character)
    {
        character.PlayAnimation("RaiseHand");
        yield return new WaitForSeconds(1.0f);

        character.PlayAnimation("Jump");
        yield return new WaitForSeconds(2.0f);

        character.PlayAnimation("Land");
    }

 

이외에도 플레이어의 체력이 특정 수치까지 기다리고 이하가 되면 이벤트를 연출할 수 있도록 WaitUntil을 사용해 조건을 

걸 수도 있고, 우리가 어떻게 사용하느냐에 따라 다양하게 사용할 수 있습니다.

 

오늘은 코루틴에 대해 알아보았습니다. 많은 도움이 되셨길 바라며 다양한 Unity 관련 지식들을 매일 업로드하고 있으니

확인해보시기 바랍니다. 연꿈술사였습니다. 감사합니다.

댓글