Coroutine
유니티는 한번에 하나의 일만을 수행하는 단일 쓰레드 방식.
Update 함수는 매 프레임 실행되기 때문에 보통 주기적으로 수행해줘야 할 일들을 Update 문에 작성하게 되는데,
Update는 무조건 매 프레임 실행되기 때문에, 해당 일이 수행될 필요가 없을때도 항상 체크해주게 된다.
코루틴은 실행시 잠시 유니티에서 제어권을 갖고와서 yield 문을 만날 때까지 수행되고,
yield 문을 만나면 코루틴은 다시 제어권을 유니티에 돌려준 후, 다음 프레임에 다시 제어권을 갖고와 yield 문 이후 부터 수행한다.
코루틴 실행 ->
유니티에서 제어권 갖고와 yield문 만날때 까지 실행 (이때 유니티의 프레임은 멈춰있다) ->
제어권 유니티에 반납, 1 프레임 흐름 (다음 Update까지 대기) ->
제어권은 다시 코루틴에게, 또다시 yield문 만날때까지 실행 ... 코루틴 함수 블럭 끝날때까지 반복
중첩된 코루틴 함수가 있을때, 내부 코루틴 함수에서 yield return시,
내부 코루틴을 호출한 외부 코루틴 함수로 리턴되는 것이 아닌 유니티로 yield return 된다.
다음과 같이 두개의 코루틴 함수가 있을때 StartCoroutine(Coroutine1())으로 코루틴1 함수 부터 실행되면
IEnumerator Coroutine1()
{
yield return StartCoroutine(Coroutine2());
}
IEnumerator Coroutine2()
{
for (int i = 1; i <= 3; i++)
{
print(i);
yield return null;
}
}
Coroutine1 실행 ->
Coroutine2 실행 ->
1 출력 -> 유니티에 제어권 돌려준후 1 프레임 흐름 -> 코루틴에 제어권 돌아옴 ->
2 출력 -> 유니티에 제어권 돌려준후 1 프레임 흐름 -> 코루틴에 제어권 돌아옴 ->
3 출력 -> 유니티에 제어권 돌려준후 1 프레임 흐름 -> 코루틴에 제어권 돌아옴 ->
Coroutine2 함수 블럭 끝에 도달, 종료 ->
Coroutine1 으로 돌아와 yield return