Coroutine이란?
프로그램에서 순서는 일반적으로 불려지는 쪽이 부른는 쪽에 속하는 있는 것이 대부분이지만 어느 쪽도 종속 관계가 아니라 대등한 관계로 서로 호출하는 것이다.
예를 들면, 게임 프로그램에서 각 플레이어 루틴은 서로 코루틴된다. 복수 프로세스 간에서 한정된 형태의 통신을 행하는 프로그램을 순차 제어로 실현한 것으로 불 수도 있다.
동시 실행 루틴
- 호출 루틴과 피호출 루틴이 대등 관계를 유지하는 처리 절차. 부차적 프로그램의 수행이 완전히 끝나기 전에 제어가 호출 루틴으로 돌아가는 것이 동시 실행 과정이다. 그리고 제어가 부차적 프로그램을 돌아왔을 때는 중단된 부분부터 다시 수행이 계속된다.
- 주종 관계를 갖지 않고 서로 호출하는 둘 이상의 모듈들.
- 서브루틴의 제어 전달 개념과 유사한 것. 각 호출에서 초기화되는 서브루틴과는 달리, 호출 시 관련된 모든 정보를 보존하는 능력을 갖는다. 그리고 다음에 다시 시작할 때에는 이전에 실행했던 다음부터 실행할 수 있는 논리를 갖는다.
요약 : 진입하는 지점까지 여러 개를 가질 수 있는 함수를 의미합니다. 개념적으로만 본다면 서브루틴도 코루틴의 한 종류라고 볼 수 있다.
사용하는 이유
코루틴이 없어도 게임을 만드는데 지장은 없습니다. 하지만 유니티에서 코루틴을 활용하면 높은 성능을 내는, 읽기 쉬운 코드를 구현할 수 있습니다.
사용 방법
IEnumerator 함수이름 (파라미타)
{
yield return;
}
StartCoroutine(함수이름());
StartCoroutine("함수이름");
StartCoroutine( 함수이름( 매개변수1, 매개변수2 ) );
StartCoroutine( "함수이름", 매개변수 );
- 코루틴은 IEnumerator라는 반환형으로 시작해야 된다.
- yield retrun이 반드시 함수 내부에 존재해야한다.
yield return의 종류
- yield return null : 다음 프레임에 실행 됩니다.
- yield return new WaitForSeconds(float) : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됩니다.
- yield return new WaitForSecondsRealtime(flaot) : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨.
- WaitForSeconds와 하는 역할은 동일하지만 결정적으로 다른것이 있습니다. 유니티상의 시간은 임의로 느리게 하거나 빠르게 하는 것이 가능합니다. 이를 Time.timeScale을 통해서 조정을 할 수있습니다. 매트릭스에서 보던 총알이 느리게 날아오면서 그것을 피하는 모션을 구현해 본다면 이 값을 1보다 낮추게 되면 현재 시간의 진행보다 느려지게 되며 1보다 빠르게 변경하면 현재의 시간의 진행보다 빨라지게 됩니다. 하지만 WaitForSecondsRealtime는 이러한 ScaledTime의 영향을 받지 않고 현실 시간 기준으로만 동작을 하게 됩니다.
- 그외 : yield return + new WaitForFixedUpdate / WaitForEndOfFrame 등...
- yield break; : 코루틴을 끝냅니다.
장점
Invoke보다 좋은 장점은 성능이 뛰나며 파라미타를 전달하여 사용할 수 있었습니다.