Coroutine

코루틴은 메인 게임 루프에서 병렬이나 비동기로 실행되는 것처럼 보이는 측면을 고려할 떄 스레드(thread)처럼 동작한다고 할 수 있다. 
즉 코루틴을 실행시키면 백그라운드에서 실행되는 것처럼 보인다.
코루틴을 실행하면 일반적인 함수처럼 이전 동작이 멈추거나 코루틴 함수가 완료될 때까지 기다리고 있지 않는다.
이런 특징으로 인해 코루틴은 비동기처럼 보이는 동작을 만들 때 훌륭한 도구이다.


yield

모든 코루틴은 IEnumerator 형식을 반환해야 하는데, 최소한 하나의 yield문을 포함하고 있어야 하고 StartCoroutine으로
실행되어야 한다. yield문은 조건이 충족될 때까지 코루틴의 실행을 미루는 특별한 구문이다.
yield return new WaitforSeconds(sec)와 같은 식으로 sec초 만큼 실행을 멈추었다가 시간이 지나면 다음 줄의 실행을
계속하도록 할 수 있다. 반대로 yield return null 과 같은 식으로 구현하면 현재 프레임에서 실행을 멈추었다가
다음 프레임에서 이후의 코드를 실행하도록 한다. -유니티 C# 스크립팅 마스터하기


yield return object; 

object <- 이 대상을 IEnumerator 객체의 current 값과 비교한다.


코루틴 메서드 실행 도중 yield 문을 만나면 실행이 정지하며  다른 코드에 실행을 양보한다.
current 에 있는 object 값을 가져와 타입을 체크한 후 해당 메시지의 대기동작 만큼 기다린다.
(일정 시간 동안의 다른 코드의 실행이 끝나면 다시 해당 지점으로 돌아와 실행을 계속한다.)
MoveNext 를 통해 다음 yield 구문으로 넘어간다. 만약 존재하지 않으면 코루틴 종료

위 그림과 같은 동작을 코드로 나타냄



MonoBehaviour.StopCoroutine

코루틴 실행을 중지하기 위해서는 다음과 같은 방법이 있다.

  • public void StopCoroutine(string methodName);

  • public void StopCoroutine(IEnumerator routine);
  • public void StopCoroutine(Coroutine routine);
  • public void StopAllCoroutines(); // 현재 클래스에서 실행한 모든 코루틴 종료

코루틴이 반복될 때 (타이머 설정과 같이) 종료지점이 내부에 포함되어 있지 않은 경우, 

무한 루프가 되기 때문에 중지가 필요한 시점에서 StopCoroutine()으로 해당 코루틴을 종료한다고 말해줘야 한다.

하지만 IEnumerator 참조명으로 코루틴이 실행된 경우 또는 파라미터가 포함되어 있는 경우에는 StopCoroutine() 사용이 불가하다.

어떤 코루틴을 중지할 것인지 정보가 명확하지 않기 때문이다.

그럴경우 중지가 예정된 코루틴 개체에 대한 IEnumerator 타입의 참조 변수를 선언하여 StopCoroutine(참조 변수) 해줘야 한다.


유니티 공식 API Link: StopCoroutine  


 간단한 타이머 코루틴 예시

new WaitforSeonds 는 디바이스 환경에 종속적이므로 프레임 구간마다 예상하는 정확한 시간을 보장해주지 않는다. 

모든 클라이언트에게 공평한 환경을 제공해주기 위해선 Time.deltaTime 를 사용하여 일정 시간 경과 이후 yield return null로 턴을 마치는 루프문을 작성하는게 좋다.

여기서는 WaitforSecondsRealtime를 사용하였다.


lerp 와 자주 쓰이는 코루틴 방식


'UnityEngine > Editor 시스템' 카테고리의 다른 글

Unity 실행 순서  (0) 2018.06.05

+ Recent posts