fullstack

[Unity3D] Coroutine

Unity

- Delay 만들기


일정 주기마다 실행되는 함수를 만들고 싶을때, 다음과 같이 만들 수 있다.


1
2
3
4
5
6
7
8
9
10
11
float accTime = 0;
float delay = 1;
 
void Update() {
    accTime += Time.deltaTime;
    if(accTime > delay)
    {
        func();
        accTime = 0;
    }
}



이는 Update문 안에서 accTime을 매 프레임마다 더해주고 accTime과 delay를 비교해서 처리하게되는데 Coroutine을 사용하면 더 간단하고 좋은 성능으로 만들 수 있다.


1
2
3
4
5
6
IEnumerator delay()
{
    yield return new WaitForSeconds(1f);
    func();
    StartCoroutine(delay());
}





- Coroutine


일반 함수는 호출하면 반환값을 반환하기 전에 실행이 완료되어 시간의 경과와 함께 일련의 이벤트에는 사용할 수 없다. 이는 Coroutine을 사용하면 편리하게 구현할 수 있다.

Coroutine은 실행을 중지하여 Unity에 제어권을 돌려주고, 계속할 때는 다음 프레임에서 중지한 곳부터 실행을 계속할 수 있는 기능이다.

즉 Coroutine을 사용하면 시간을 두거나 순차적으로 기능을 실행할 때 매우 유용하다.


가장 기본적인 Coroutine함수는 다음과 같다.


1
2
3
4
5
6
IEnumerator func()
{
    // event.
    yield return null;
    // event2.
}



Coroutine은 StartCoroutine 함수를 사용하여 실행하며, IEnumerator 형식을 반환값으로 가지고 yield return 구문을 포함하고 있어야 한다.

yield return 구문에는 일정시간은 기다리는 new WaitForSeconds(float) 이 가장 많이 쓰이며 다른 Coroutine이 끝날 때가지 대기하거나 웹 통신 작업이 끝날 때까지 대기하는 등 다양한 구문이 있다.


 yield return null

  다음 프레임까지 대기

 yield return new WaitForSeconds(float)

  지정된 초만큼 대기

 yield return new WaitForFixedUpdate()

  다음 물리 프레임까지 대기

 yield return new WaitForEndOfFrame()

  모든 렌더링 작업이 끝날 때까지 대기

 yield return StartCoroutine(string)

  다른 코루틴이 끝날 때까지 대기

 yield return new WWW(string)

  웹 통신 작업이 끝날 때까지 대기

 yield return new AsyncOperation

  비동기 작업이 끝날 때까지 대기(씬로딩)