Skip to content

explain Coroutine

Yoo Hyeokjin edited this page Jun 27, 2023 · 2 revisions

Coroutine

설명

  • Coroutine은 시간의 경과에 따른 절차적 단계를 수행하는 로직을 구현하는 함수다.
  • 시간의 경과에 따른 절차적 단계 구현은 Update()함수에서도 가능하다. 즉 매 프레임마다 호출하는 것은 Update()로 구현하는 것이 바람직하다
  • 초당 호출, 또는 매 프레임마다 호출이 필요하지 않는 부분을 절차적 단계로 구현하는 것은 Coroutine으로 하는 것이 바람직하다.
  • yield return , StartCoroutine , StopCoroutine , IEnumerator을 사용해서 구현할 수 있다.

yield return

  • 일시적으로 CPU 권한을 다른 함수에 위임해서 return한다.
명령어 설명
yield return null 다음 프레임까지 대기 -> 한 프레임만 기다림
yield return new WWW(string) 웹 통신 작업이 끝날 때까지 기다림
yield return new WaitForSeconds(float) 지정된 초 만큼 대기 -> 내가 넣은 숫자만큼 대기
yield return new WaitForSecondsRealTime(float) Time.timescale 값에 영향을 받지 않고 지정된 시간 만큼 대기한다
yield return new WaitForFixedUpdate() FixedUpdate가 끝나면 제어권을 받음
yield return new WaitForEndOfFrame() 한 프레임의 연산이 다 끝나고 마지막에 제어권을 받음
yield return StartCoRoutine(string) 다른 코루틴이 끝날 때까지 기다림
yield return new AsyncOperation 비동기 작업이 끝날 때까지 기다림

StartCoroutine

  • Coroutine을 시작하는 함수이다.
명령어 설명
StartCoroutine(string MethodName, object = null) MethodName으로 Coroutine을 실행 시킬 수 있다. object는 전달인자다.
StartCoroutine(IEnumerator routine) IEnumerator로 이루어진 Coroutine을 실행시킨다.

StopCoroutine

  • Coroutine을 종료하는 함수이다.
명령어 설명
StopCoroutine(string MethodName) MethodName으로 Coroutine을 종료한다.
StopCoroutine(IEnumerator routine) IEnumerator로 이루어진 Coroutine을 종료시킨다.

IEnumerator

  • IEnumerator는 '열거자'라고 부른다.
  • 작업을 분할하여 수행하는 함수다.
  • yield return과 함께 사용해야 한다.
  • 일반적인 함수는 반환하는 즉시 함수를 끝내지만 열거자는 권한을 잠시 위임하기에 자신이 실행하고 있던 상태를 기억하는 것이다.
명령어 설명
IEnumerator.MoveNext() 마지막으로 실행되었던 Current부터 코드를 실행한다. 처음으로 사용한다면 처음부터 코드를 사용한다. 다음 요소로 이동한다면 true, 끝이라면 false를 반환한다.
IEnumerator.Current IEnumerator이 반환한 값을 알려준다. MoveNext()으로 마지막 return까지 도달하여도 Current는 처음으로 이동하지 않는다.
IEnumerator.Reset() 열거자의 첫 번째 요소 앞에 잇는 초기 위치로 설정한다.

사용법

  • yield return의 사용에 따라 천차만별로 사용할 수 있다.

  • 열거자 정의

IEnumerator GetNumberIEnumerator()
    {
        Debug.Log("IEnumerator : " + 1);
        yield return 1;
        Debug.Log("IEnumerator : " + 2);
        yield return 2;
        Debug.Log("IEnumerator : " + 3);
        yield return 3;
    }
  • 열거자 호출(StartCoroutine 사용)
void PrintNumber()
    {
        StartCoroutine(GetNumberIEnumerator());
    }
/******************** 출력 ********************/

IEnumerator : 1
IEnumerator : 2
IEnumerator : 3
  • 열거자 호출(MoveNext 사용 -> 이때 꼭 instance를 만들어야 한다.)
void PrintNumber()
    {
        IEnumerator getNumberIEnumerator = GetNumberIEnumerator();
        getNumberIEnumerator.MoveNext();
        Debug.Log(getNumberIEnumerator.Current);
        getNumberIEnumerator.MoveNext();
        Debug.Log(getNumberIEnumerator.Current);
        getNumberIEnumerator.MoveNext();
        Debug.Log(getNumberIEnumerator.Current);
    }
/******************** 출력 ********************/

IEnumerator : 1
1
IEnumerator : 2
2
IEnumerator : 3
3
Clone this wiki locally