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

Reset 

인스펙터 창에서 리셋을 눌러줄 때 실행된다.  객체가 가지고 있는 속성 값이 제일 먼저 반영

Awake

스크립트가 실행될 때 처음에 한번 호출 된다. 모든 오브젝트가 씬안에서 초기화된 후 

호출되기 때문에 GameObject.Find 를 통해 해당 오브젝트를 찾을 수 있다.

Awake함수는 항상 Start 함수 이전에 호출 되므로 초기화 순서를 제어해줄 때 필요하다.

(Coroutine은 사용불가)

OnEnable

오브젝트가 SetActive(True) -인스펙터뷰에서 활성화되었을 때 호출된다. 

비활성화 이후 활성화할 때 다시 실행된다.

Start

다른 스크립트의 Awake가 모두 실행된 후 호출된다. 


Update

이 이벤트는 씬 안의 모든 활성화된 게임오브젝트의 모든 컴포넌트에 대해 프레임당 한번 씩 Update 이벤트가 불리게 된다.

오브젝트가 SetActive 메소드에 의해 비활성화되면 활성화되기 전까지 Update 이벤트가 호출되지 않는다.

하지만 update 이벤트가 모든 컴포넌트에 대해 매프레임마다 불려지는것이 보장되지는 않는다.

즉 A라는 오브젝트의 Update 함수가 B라는 오브젝트의 Update 함수가 불리기 전에 호출되는지 확인할 방법은 없다.

FixedUpdate

이 이벤트 호출은 고정된 시간 간격을 기반으로 규칙적으로 표준화되어 나타난다. (0.02 초 (1초의 50번)이 디폴트값이다.)

이 함수 호출 이후 필요한 모든 물리 계산이 수행된다.

따라서 Rigidbody의 Addforce와 같은 물리연산의 영향을 받는 것들은 업데이트보다는 이 함수를 호출하는 것이 적합하다.

LateUpdate

Update와 마찬가지로 매 프레임 호출된다. 하지만 LateUpdate는 언제나 Update와 FixedUpdate가 호출된 이후에 호출된다. 

현재 프레임에서 모든 오브젝트에 LateUpdate가 호출되었을 때는 이미 Update와 FixedUpdate가 호출되었다는 것을 의미한다.

1인칭 카메라를 구현하는 경우, 현재 프레임에서 항상 오브젝트의 마지막 위치를 따라가도록 움직임을 구현할 때

LateUpdate의 이런 속성을 유용하게 활용할 수 있다.


OnDisable  

게임 오브젝트가 SetActive(false)되어 비활성화 되었을 때 호출된다. (Coroutine는 사용할 수 없다.)

OnDestory 

오브젝트가 Destroy되어 씬안에서 영영 없어지기전에 마지막 프레임 업데이트가 모두 끈난후 실행된다.

OnApplicationQuit 

응용프로그램 종료 전에 모든 오브젝트에서 호출된다.


씬에서 여러 오브젝트들이 함께 포함된 경우, 같은 순서레벨을 갖는 실행함수들 사이에서는 컴포넌트들마다 어느쪽이 먼저 실행되는지 예측할 수 없다. 
따라서 그 순서를 명확히 제어해 줄 필요가 있을 경우(Edit > Project Settings > Script Execution Order) 수동으로 순서를 조작해야 한다.

unity 실체 처리 흐름도 (http://unity-michi.com/post-453/)



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

[코루틴] Coroutine  (0) 2018.06.06

+ Recent posts