스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.04.18 TIL - 코루틴(Coroutine)

테크러너 2024. 4. 19.

코루틴이란?

    //카드를 보드에 펼치기 위한 코루틴
    IEnumerator ThrowAboutCard()
    {
        //반복문과 지연을 활용하여 카드를 순차적으로 펼친다.
        for(int i = 0; i < cards.Count; i++) 
        {
            StartCoroutine(cards[i].GetComponent<Card>().Move());
            yield return new WaitForSeconds(0.1f);
        }
        yield return new WaitForSeconds(1f);
        //게임을 시작한다.
        GameManager.instance.bIsPlaying = true;
    }

저희 팀원이 작성하신 코드인데 이걸 코루틴이라고 하더라구요.

코루틴이 무엇인지 어떻게 사용하는지 찾아봤습니다.

주로 기술 문서를 참고했습니다▼

https://docs.unity3d.com/kr/2022.3/Manual/Coroutines.html

우선 코루틴은 루틴(함수)의 실행을 일시 중단하고 나중에 이어서 실행할 수 있습니다.

코루틴은 일반적인 함수와는 다르게 실행 중간에 멈출 수 있고, 그 상태를 보존한 채 다른 코드가 실행될 수 있습니다. 이는 여러 작업을 동시에 실행하면서도 각 작업 간의 상태를 쉽게 관리하고 제어할 수 있도록 도와줍니다.

코루틴은 HTTP 전송, 에셋 로드, 파일 I/O 완료 등을 기다리는 것과 같이 긴 비동기 작업을 처리해야 하는 경우 코루틴을 사용하는 것이 가장 좋습니다.

기술문서에 있던 내용인데요, "비동기"라는 단어가 있네요.

운영체제를 공부하시면 알게되는 단어입니다. 간단하게 설명하자면,

"동기"는 A가 작업을 진행하는 동안 B는 작업을 못하고 기다려야합니다.

"비동기"는 A와 B모두 동시에 작업이 가능합니다.

유니티에서의 대부분 로직은 동기 방식으로 작동됩니다.

그래서 비동기 작업이 필요한 경우 코루틴을 사용하게 되는 것입니다.

코루틴 시간 지연

맨 처음 첨부했던 코드를 보시면 아래와 같은 코드가 있는데 이는 시간을 지연시키는 코드입니다.

코루틴을 사용할 때 꼭 넣어주는 코드입니다.

yield return new WaitForSeconds(1f);

기본적으로 Unity는 yield다음 프레임에 코루틴을 다시 시작합니다. 시간 지연을 도입하려면 WaitForSeconds를 사용합니다.

쉽게 말해서 WaitForSeconds를 사용하여 괄호안의 시간(1f)동안 다른 함수는 실행되지 않습니다.

1f까지는 누구의 방해도 받지 않는 나만의 시간~~ 이라는 것입니다ㅎㅎ

코루틴 정지

StopCoroutineStopAllCoroutines을 사용하여 코루틴을 정지할 수 있습니다.

StopAllCoroutines 은 예전에 사용해본 기억이 있는데, 몬스터의 공격패턴을 코루틴 함수로 작성한 후 몬스터가 죽었을 때 공격이 더이상 이루어지지 않도록 사용해본적이 있습니다.

반응형

댓글