Coroutine

Message Loop / Blocking / Multi thread

  • Unity Life Cycle
  • 초기화 => 게임로직 => 랜더링 => 정리 => 기타 이벤트 등 의 일련의 과정
  • 일반적인 함수를 호출하면 해당 함수 안의 로직을 다 수행해야만 실행이 끝남
  • 만약, 수행 로직의 시간이 10초 라면 10초 동안 메시지 루프의 다른 로직의 실행이 불가능 해짐
  • 이를 Blocking(블로킹) 이라고 함
  • 메세지 루프에 의한 블로킹을 해결하기 위해 병렬로 함수를 호출 하는 것이 Multi Thread(멀티스레드)
    private void Fade()
    {
      for(var f = 1f; f >= 0; f -=0.1f)
      {
          var c = GetComponent<Renderer>().material.color;
          c.a = f;
          GetComponent<Renderer>().material.color = c;
      }
    }
    

    => Alpha 값이 순식간에 반복 되어 0으로 변해버림

private IEnumerator Fade()
{
	for(var f = 1f; f >= 0; f -=0.1f)
	{
		var c = GetComponent<Renderer>().material.color;
		c.a = f;
		GetComponent<Renderer>().material.color = c;
		yield return null;
	}
}

=> yield 키워드를 만나면, 제어 권한을 유니티의 메인 Message Loop로 보냄

yield return null

  • ‘다음 프레임까지 해당 코루틴을 잠시 대기(정지)’하는 동안 Message Loop로 제어권을 넘겨 다른 작업을 처리한다.
  • Process가 Blocking 되지 않고 '멀티 쓰레드'처럼 비슷한 효과