본문 바로가기
유니티 최고/유니티 개념

유니티(Unity) 코루틴(Coroutine) 이란 & 사용해보기

by Lee_story_.. 2023. 5. 30.
728x90

이번엔 코루틴이란 개념에 대해 정리/사용해보겠습니다. 


코루틴이란?

함수를 시간에 따른 지연처리를 하기 위해 사용하는 기능으로 유니티에서 제공하는 주요한 기능입니다. 

특정 상황에 대해서 검사 작동하는 함수, Udate함수를 사용해야 할 것 같다고 생각될 때  사용할 수 있습니다. 


만약 어떠한 함수를 5초마다 실행 시킨다고 하였을때 update문을 이용할 것이고아래 처럼 코드를 구성 할 수 있습니다. 

 float Timenow = 0;

    void Update()
    {
        Timenow += Time.deltaTime;
        if (Timenow > 5.0f)
        {
            Timenow = 0;
            ///함수 실행!
        }
    }

 

함수 자체는 문제가 없습니다. 다만 Update문이 만약 1초에 60,80,100 번 반복된다고 했을때Update문 아래에 있는 코드들 또한 그만큼 반복하여 낭비를 발생 시킬수 있습니다.

 

이러한 낭비를 막아보고자 코루틴을 사용합니다!  (대다수)

 

 

5초마다 반복하는 함수를 표현해 보자면 아래처럼 표현 가능합니다. 

void Start()
    {
        StartCoroutine(Check());
    }
...
 IEnumerator Check()
    {
        while (true)
        {
            yield return new WaitForSeconds(5f);
            print("실행?");
        }
    }

 

여기서 Update문에 아래처럼 코드를 추가해 준다면

print("실행안함-----------------");

이런식으로 작업이 처리됩니다. 

  >>> 이 부분에서 무언가 알아채신점 있나요?

 

 

Update문과 코루틴이 따로 작동한다. >> 비동기식 작업 방식이란 것을 알 수 있습니다!

[하지만] 코루틴은 동기식 방식을 따릅니다.

 

 

작업을 동기식으로 처리하나,

비동기식 작업을 구현하기 위해 유니티에서 구현해 놓은 기능이 바로 코루틴 입니다

 

 

그렇기에 비동기식 작업에 대한 설계시에 코루틴을 사용하기도 합니다. 

 

 

동기식..? 비동기식?

더보기

동기식 이란 작업의 처리 순서에 따라 순차적으로 처리하는방식!

 

비동기식은 여러 작업이 동시에 처리되는 방식!

   하나 또는 여러개의 스레드를 나누어  여러 작업을 한꺼번에 처리하는 방식으로

 

유니티는 함수들이 동기식으로 작동되나 코루틴을 이용하면 여러 함수가 동시에 작동되는것 처럼 만들어 낼 수 있다

 

 

 


다음은 코드의 구성입니다.

 

구성은 아래처럼 나눌 수 있을것 같습니다!

StartCoroutine(함수이름()); // 실행부
......

IEnumerator 함수이름()  // 코루틴 함수 선언부
    {
		yield return // 리턴값 + 조건;  // 리턴부
    }
    
    ...
    StopCoroutine(함수이름());// 정지부

 

 

실행은 간단하게 StartCoroutine을 통해 실행됩니다. 종료 또한 StopCoroutine을 통해 통제할 수 있습니다.

 

아래처럼 함수 이름을 String 으로 받아 처리할 수도 있습니다!

StartCoroutine(Check(5f));
==StartCoroutine("Check", 5f);

StopCoroutine(Check(5f))
==StopCoroutine("Check");

 

 

이제 

선언부와 리턴부를 살펴 보겠습니다.

 

 


먼저 선언부 >> IEnumerator를 통해 함수를 선언합니다. 

 

 

IEnumerator....?

더보기

반복 가능한 컬렉션을 나타내는 개체에 대한 열거자(iterator)를 정의를 정의하는 변수로

yield return을 통해 함수를 일시중단, 재개 할 수 있기에 사용한다고 합니다!

 

함수 선언시에는 일반적인 함수 선언과 다르지 않습니다.

 IEnumerator Check(bool check, float time)
    {
         yield return new WaitForSeconds(time);
         print("실행?");
       
    }

여러 인수를 추가 하여 실행 시킬수도 있고, 이름 생성규칙 또한 다른점이 없기에 

IEnumerator로 선언된 함수라고 생각하시면 될 것 같습니다.

 

 

 

 


이제 제일 중요한 리턴부

 

IEnumerator함수의 리턴값은 yield return 으로 고정되어 있는데 이것을 이용하여 다양하게 사용할 수 있습니다. 

 

 

 

다양한 리턴값들이 있지만 주요리턴값으로는 아래처럼 프레임/ 시간에 따라 제어할 수 있도록하는 리턴값

 

yield return null;  => 프레임 단위 실행
yield return new WaitForSeconds( 2.0f ); = >> 2초뒤 (유니티 시간)
yield return new WaitForSecondsRealtime( flaot );) =>> 2초뒤 실제 시간

 

 

그리고 다른 작업들과 연계하여 작업간의 순서를 정해줄 리턴값들이 있습니다. 

 

yield return StartCoRoutine(OtherCoroutine())  == >> 다른 코루틴 완료시 까지 대기
yield return new WWW(stirng)   == >> 네트워크 요청이 완료 될 때까지 대기 
yield return AsyncOperation  == >> 비동기 작업이 끝날때까지 대기

 

그리고 단순 종료 리턴값!

 

yield break;  == >> 종료

마지막으로 주의할점

 

1. 코루틴을 사용하되 Update 문 내부에서 Start를 시켜줄때, 

제대로 된 조건없이 무작정 실행하면 에디터가 터져버립니다.

 

2. return을 기준으로 윗부분은 조건 이전에 실행되고 밑부분은 조건 이후에 실행됩니다.

    IEnumerator Check(float time)
    {
        print("실행");
        yield return new WaitForSeconds(time);
        print("실행2초후");    
    }

 

3. 코루틴이 비동기식 작업 방법을 모방하여 사용되긴 하지만 동기식으로 작동 된다는 점을 생각해 주시면될 것 같습니다.

 

 

 


여기까지가 끝!

 

코루틴의 개념과 사용법, 구조에 대해서 알아보았습니다!

더 추가될 내용이 생기면 바로 추가하러 돌아오겠습니다.

 

 

 

 

틀린점이 있다면 댓 달아주세요!

 

 

댓글