특정 일을 여러 프레임으로 나누어서 진행하고 싶을 때, 이전의 상태를 기억하거나 현재 상태를 일시정지 시키고 이후에 다시 진행하는 방법이 필요하다. 이때 사용하는 것이 Coroutine
이다.
Coroutine을 구현하기 위해서는 IEnumerable이라는 인터페이스를 상속받아 GetEnumerator()
를 구현해야 한다.
class CoroutineTest : IEnumerable
{
public IEnumerator GetEnumerator()
{
//구현
}
}
함수이름이 GetEnumerator일 필요는 없다. IEnumerator만 반환하면 된다.
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을 사용할 수 있다.
Coroutine을 사용하면 특정코드를 비동기적으로 실행할 수 있다고 했는데 위 내용들로는 비동기적이라는 느낌을 받기 힘들다.
특정시간동안 기다린 후 남은 로직을 처리하는 기능을 구현하기 위해 WaitForSeconds()
를 사용한다. 아래코드는 Before의 로직을 수행하고 seconds
동안 진행상황을 저장하고 다른 로직을 수행하다가 시간이 지나면 After를 수행한다.
public IEnumerator GetEnumerator(float seconds)
{
// Before
yield return new WaitForSeconds(seconds);
// After
}
특정한 Coroutine을 실행하거나 이미 실행한 Coroutine을 중단하기 위해 다음과 같은 함수를 사용할 수 있다.
Coroutine은 비동기적인 구현이 필요할 때 사용한다. 예를들면, 게임서버를 구현할 때 클라이언트와 서버 사이의 DB저장이나 통신사이의 걸리는 시간을 활용하거나 상태를 동기화하기 위한 로직을 구현할 수 있다.