1. Yield 키워드란?
C#과 Unity에서 yield 키워드는 코루틴과 함께 사용하여 고급 제어 흐름과 비동기 실행을 가능하게 합니다. yield 키워드를 사용하면 메서드가 호출자에게 값을 반환하되 메서드를 완전히 종료하지 않고도 반환할 수 있습니다. 반환 키워드를 코루틴에 사용하면 코루틴 실행을 일시 중지하고 호출 메서드에 제어권을 반환하여 코루틴이 계속되기 전에 다른 코드가 실행될 수 있도록 할 수 있습니다.
2. Yield 키워드와 함께 사용되는 다양한 코루틴 문법
다음은 Unity 코루틴에 사용되는 가장 일반적인 yield 문 몇 가지입니다:
yield return null;: 이 문은 코루틴을 한 프레임 동안 일시 중지하여 계속하기 전에 다른 코드를 실행할 수 있도록 합니다. 이는 프레임 단위로 업데이트해야 하는 애니메이션이나 기타 동작에 유용합니다.
yield return new WaitForSeconds(time);: 이 문은 코루틴을 계속하기 전에 지정된 시간(초) 동안 일시 중지합니다. 동작을 지연시키거나 시간 제한이 있는 동작을 만들 때 유용합니다.
yield return new WaitForFixedUpdate();: 이 문은 고정된 속도(기본적으로 초당 50회)로 발생하는 다음 물리 업데이트가 있을 때까지 코루틴을 일시 중지합니다. 이는 충돌 감지나 움직임과 같이 물리 계산에 의존하는 동작에 유용합니다.
yield return new WaitForEndOfFrame();: 이 문은 다른 모든 렌더링과 애니메이션이 완료된 후 현재 프레임이 끝날 때까지 코루틴을 일시 중지합니다. 현재 프레임에 대한 다른 모든 코드 실행이 끝난 후 업데이트해야 하는 동작에 유용합니다.
yield return StartCoroutine(otherCoroutine);: 이 문은 새 코루틴을 시작하고 새 코루틴이 실행을 마칠 때까지 현재 코루틴을 일시 중지합니다. 여러 코루틴을 순차적으로 실행해야 하는 복잡한 동작을 만들 때 유용합니다.
다음은 yield 키워드를 사용하여 실행을 일시 중지하는 코루틴의 예시입니다:
IEnumerator ExampleCoroutine()
{
Debug.Log("Coroutine started");
yield return null;
Debug.Log("Coroutine resumed");
yield return new WaitForSeconds(2.0f);
Debug.Log("Two seconds have passed");
yield return new WaitForFixedUpdate();
Debug.Log("Fixed update");
yield return new WaitForEndOfFrame();
Debug.Log("End of frame");
yield return StartCoroutine(AnotherCoroutine());
Debug.Log("Coroutine finished");
}
IEnumerator AnotherCoroutine()
{
Debug.Log("Another coroutine started");
yield return new WaitForSeconds(1.0f);
Debug.Log("Another coroutine finished");
}
이 예제에서 ExampleCoroutine() 메서드는 메시지를 콘솔에 기록하고, 한 프레임 동안 산출하고, 다른 메시지를 콘솔에 기록하고, 2초 동안 산출하고, 다른 메시지를 기록하고, 다음 고정 업데이트를 기다린 다음, 다른 메시지를 기록하고, 프레임이 끝날 때까지 기다린 다음, 새 코루틴(AnotherCoroutine()을 시작하고, 마지막으로 코루틴이 완료되었음을 나타내는 메시지를 로깅합니다.
이 코루틴에서 StartCoroutine() 메서드가 호출되면 비동기적으로 실행되므로 각 반환 문에서 코루틴이 일시 중지되는 동안 나머지 코드가 계속 실행될 수 있습니다. 반환 문을 사용하면 코루틴 실행을 정밀하게 제어할 수 있으며, 여러 프레임에 걸쳐 있거나 비동기 실행이 필요한 복잡한 동작을 생성하는 데 사용할 수 있습니다.
'공부 > C#' 카테고리의 다른 글
오일러 각(EulerAngles)이란? (0) | 2023.03.06 |
---|---|
짐벌락(gimbal lock)이란? (0) | 2023.03.06 |
코루틴(coroutines)이란? (0) | 2023.03.06 |
이벤트(event)란? (0) | 2023.03.06 |
델리게이트(Delegate)란? (0) | 2023.03.05 |