https://docs.unity3d.com/kr/2022.3/Manual/Coroutines.html

 

코루틴 - Unity 매뉴얼

코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니

docs.unity3d.com

 

Unity 공식 문서 코루틴 설명

코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있다.

실행을 일시 정지하고 제어를 Unity에 반환하지만, 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드이다.

 

 

Coroutine

Unity에서의 코루틴: 특정 지점에서 실행을 중단하고, 조건에 따라 실행을 재개하여 시간 지연이나 프레임 간 작업 처리 등을 가능하게 하는 동기적 메서드

 

 

코루틴은 비동기처럼 실행되지만, 메인스레드에서 작동하므로 멀티스레딩이 아니라는 점을 명심해야 한다

따라서 비동기적인 동작처럼 보이지만 동기적인 동작이다.

  • 코루틴에서 사용하는 yield return은 작업을 "중단"하기만 한다. 코루틴을 중단하는 동안 다른 작업이 실행되므로, 비동기처럼 보인다.
  • 코루틴이 대기(중단) 상태일 때, Update나 다른 코루틴 등이 실행되지만, 이는 동시 실행이 아니라 순차적으로 실행되는 것이다.

 

코루틴은 호출한 게임 오브젝트가 비활성화되거나 파괴되면 자동으로 중단된다.

 

yield를 통해 특정 시간 동안 실행을 중단하거나, 조건이 충족될 때까지 대기할 수 있다.

 

 

코루틴 사용 예제

Coroutine myCoroutine;

void Start() {
	// StartCoroutine: 코루틴 시작
	myCoroutine = StartCoroutine(MyCoroutine());
}

void StopCoroutine() {
	if(myCoroutine != null)
    	// StopCoroutine : 코루틴 중지
		StopCoroutine(myCoroutine);
}

// IEnumerator는 아래에서 따로 설명
IEnumerator MyCoroutine() {
	// 3초간 대기
	yield return new WaitForSeoconds(3f);
}

void StopCoroutine() {
	// 실행중인 모든 코루틴 중지
	StopAllCoroutines();
}

 

 

 

IEnumerator

IEnumerator는 C#에서 열거자(Enumerator)를 나타내는 인터페이스(I)이다.

컬렉션 같은 데이터의 집합에서 항목을 순차적으로 반환한다.

  • C#의 반복을 지원하는 컬렉션 다수는 IEnumerable과 IEnumerator를 상속받아 구현한다.

 

 

IEnumerator의 메서드

  • bool MoveNext() : 다음 요소로 이동, 이동 가능 여부(반복 가능 여부) 반환
  • object Current : 현재 항목 반환
  • void Reset() : 반복자의 위치를 초기 상태 위치로 되돌린다

 

 

IEnumerator는 데이터를 순회하거나, 중단과 재개가 가능한 코드 블록(Coroutine)을 정의하는 데에 사용된다

  • 코루틴을 구현할 때, IEnumerator를 반환하는 메서드를 사용
  • yield return을 사용해 실행 중단과 재개가 가능함 (IEnumerator는 한 개 이상의 yield문이 필요하다)

 

 

코루틴은 본질적으로 IEnumerator인터페이스를 활용해 동작한다

  • 코루틴 메서드를 실행할 때, 내부적으로 IEnumerator.MoveNext()를 호출해 다음 작업으로 진행하거나 대기 상태를 유지함
  • 코루틴을 구현할 때 반드시 IEnumerator 사용

 

 

내부적으로 IEnumerator를 사용하는 코루틴 작동 방식

  1. StartCoroutine 호출하면, 해당 코루틴 메서드는 IEnumerator 객체를 반환
  2. 매 프레임마다 IEnumerator.MoveNext()메서드 호출해 코루틴 실행
  3. yield를 만날 시, 실행이 중단. yield에 정의된 조건이 충족되면 다시 실행 재개
  4. 모든 작업이 끝나면 코루틴 종료

 

 

 

yield 사용 예시

yield의 사전적 뜻: 넘겨주다, 양도하다

  • 다른 코드에 제어를 넘긴다
  • 다른 코드에 (CPU)권한을 양도하다라는 뜻으로 이해할 수 있다.

 

다음 프레임까지 대기

yield return null;

 

 

지정한 시간동안 대기

yield return new WaitForSeconds(3f);

-> 3초 대기

 

 

다음 FixedUpdate주기까지 대기

yield return new WaitForFixedUpdate();

 

 

조건이 참이 될때까지 대기

yield return new WaitUntil(Func<bool>);

 

 

조건이 참인 동안 대기

yield return new WaitWhile(Func<bool>);