[Unity] Coroutine

이정석·2023년 7월 4일
0

Unity

목록 보기
12/22

Coroutine

특정 일을 여러 프레임으로 나누어서 진행하고 싶을 때, 이전의 상태를 기억하거나 현재 상태를 일시정지 시키고 이후에 다시 진행하는 방법이 필요하다. 이때 사용하는 것이 Coroutine이다.

1. IEnumerable

Coroutine을 구현하기 위해서는 IEnumerable이라는 인터페이스를 상속받아 GetEnumerator()를 구현해야 한다.

    class CoroutineTest : IEnumerable
    {
        public IEnumerator GetEnumerator()
        {
        	//구현
        }
    }

함수이름이 GetEnumerator일 필요는 없다. IEnumerator만 반환하면 된다.

2. yield return

GetEnumerator함수에서 진행상황을 저장하기 위한 reutrn으로 yield return을 사용한다.

    class CoroutineTest : IEnumerable
    {
        public IEnumerator GetEnumerator()
        {
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;
        }
    }

위 코드에서 GetEnumerator()를 4번 호출하면 1, 2, 3, 4가 반환된다. 만약, 함수의 현재 상태를 저장하는 것이 아닌 로직을 끝내고 싶다면 yield break를 사용하면 된다. 또한, Return하는 값의 자료형은 원하는 type을 사용할 수 있다.

3. WaitForSeconds()

Coroutine을 사용하면 특정코드를 비동기적으로 실행할 수 있다고 했는데 위 내용들로는 비동기적이라는 느낌을 받기 힘들다.

  • 요청을 하고 응답을 받는 시간에 추가적인 행동이 가능한가?
  • 특정시간 동안 기다렸다가 이후에 진행상황을 이어할 수는 없나?

특정시간동안 기다린 후 남은 로직을 처리하는 기능을 구현하기 위해 WaitForSeconds()를 사용한다. 아래코드는 Before의 로직을 수행하고 seconds동안 진행상황을 저장하고 다른 로직을 수행하다가 시간이 지나면 After를 수행한다.

        public IEnumerator GetEnumerator(float seconds)
        {
        	// Before
            yield return new WaitForSeconds(seconds);
        	// After
        }

특정한 Coroutine을 실행하거나 이미 실행한 Coroutine을 중단하기 위해 다음과 같은 함수를 사용할 수 있다.

  • StartCoroutine(): 특정 Coroutine을 실행하는 함수로 여러 오버로딩이 구현되어 있다. 예를 들면 함수이름과 value를 인수로 넘길 수 있다. 반환값은 Coroutine Object이다.
  • StopCoroutine(): 특정 Coroutine을 중단하는 함수로 중단하고자 하는 Coroutine을 인수로 넘기면 된다.

Coroutine은 비동기적인 구현이 필요할 때 사용한다. 예를들면, 게임서버를 구현할 때 클라이언트와 서버 사이의 DB저장이나 통신사이의 걸리는 시간을 활용하거나 상태를 동기화하기 위한 로직을 구현할 수 있다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글