코루틴 정의 및 LifeCycle에서의 순서
코루틴
IEnumerator 반환 타입과 바디 어딘가에 포함된 yield 반환문으로 선언하는 메소드이다.
yield return null 라인은 실행이 일시 정지되고 다음 프레임 에서 다시 시작되는 지점이다.
코루틴을 실행하려면 StartCoroutine 함수를 사용해야한다.
작업을 다수의 프레임에 분산할 수 있다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드라고 합니다.
시간의 흐름에 따른 이벤트의 시퀀스나 절차상의 애니메이션을 포함하기 위해 메서드 콜을 사용하고자 하는 상황에서 코루틴을 사용합니다.
** 하지만 코루틴은 스레드가 아니란 점을 명심하자.
- 코루틴의 동기 작업은 여전히 메인 스레드에서 실행된다.
- 메인 스레드에 소요되는 CPU 시간을 줄이려면 다른 스크립트 코드에서와 마찬가지로 코루틴의 작업 차단을 방지하는것이 중요하다.
& Unity 내에서 다중 스레드 코드를 사용하려면 C# Job System(잡시스템)을 사용하면 좋습니다.
코루틴은 HTTP전송, 에셋 로드, 파일 I/O 완료 등을 기다리는 것과 같이 긴 비동기 작업을 처리해야 하는 경우 코루틴을 사용하는것이 가장 좋다고 합니다.
코루틴 유용하게 사용하기
코루틴은 Update 메서드를 호출하여 작업을 자주 반복할 필요가 없는 경우에 정말 유용하게 사용 될 수 있습니다.
특히 WaitForSeconds를 이용하게되면 원하는 시간에 맞춰 실행시킬 수 있기때문에
매 프레임 실행되는 Update를 사용하는것보다 게임 플레이에 눈에 띄는 영향없이 수행되는 검사 수를 줄일 수 있습니다.
코루틴 정지
코루틴을 중지하려면 StopCoroutine 및 StopAllCoroutine을 사용하면 된다.
또한 GameObject를 비활성화 하기 위해 SetActive를 false로 설정한 경우에도 코루틴이 중지된다고 합니다.
테스트를 해보니 SetActive(false)와 Destroy 모두 코루틴을 정지시키는것을 확인할 수 있었습니다.
단, 플레이중 스크립트를 끄는것으로는 코루틴을 멈출 수가 없었습니다.
일반적으로 코루틴 업데이트는 Update 함수가 반환된 후 실행됩니다.
코루틴은 주어진 YieldInstruction이 완료될 때까지 실행을 중단(양보) 할 수 있는 함수입니다.
코루틴의 LifeCycle에서의 순서
1. yield 코루틴은 모든 Update 함수가 다음 프레임에 호출된 후 계속됩니다.
2. yield WaitForSeconds 지정한 시간이 지난 후, 모든 Update 함수가 프레임에 호출된 후 계속된다.
3. yield WaitForFixedUpdate 모든 FixedUpdate가 모든 스크립트에 호출된 후 계속된다.
(FixedUpdate 전에 코루닡이 양보하면 현재 프레임의 FixedUpate 이후에 재개된다.)
4. yield WWW WWW 다운로드가 완료된 후 계속된다.
5. yield StartCoroutine 코루틴을 연결하고 MyFunc 코루틴이 먼저 완료되기를 기다린다.
공식 문서 _ 코루틴
https://docs.unity3d.com/kr/current/Manual/Coroutines.html