-
Notifications
You must be signed in to change notification settings - Fork 2
explain Coroutine
Yoo Hyeokjin edited this page Jun 27, 2023
·
2 revisions
- Coroutine은 시간의 경과에 따른 절차적 단계를 수행하는 로직을 구현하는 함수다.
- 시간의 경과에 따른 절차적 단계 구현은 Update()함수에서도 가능하다. 즉 매 프레임마다 호출하는 것은 Update()로 구현하는 것이 바람직하다
- 초당 호출, 또는 매 프레임마다 호출이 필요하지 않는 부분을 절차적 단계로 구현하는 것은 Coroutine으로 하는 것이 바람직하다.
- yield return , StartCoroutine , StopCoroutine , IEnumerator을 사용해서 구현할 수 있다.
- 일시적으로 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 | 비동기 작업이 끝날 때까지 기다림 |
- Coroutine을 시작하는 함수이다.
명령어 | 설명 |
---|---|
StartCoroutine(string MethodName, object = null) | MethodName으로 Coroutine을 실행 시킬 수 있다. object는 전달인자다. |
StartCoroutine(IEnumerator routine) | IEnumerator로 이루어진 Coroutine을 실행시킨다. |
- Coroutine을 종료하는 함수이다.
명령어 | 설명 |
---|---|
StopCoroutine(string MethodName) | MethodName으로 Coroutine을 종료한다. |
StopCoroutine(IEnumerator routine) | IEnumerator로 이루어진 Coroutine을 종료시킨다. |
- 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