http://theeye.pe.kr/archives/2725
. Coroutine 동작 과정
다음 그림은 Coroutine의 동작 과정이다. 그림만 봐도 동작의 흐름은 알 수 있다.
위의 그림을 보면 프로그램은 순차적으로 실행되다가 yield return 키워드를 만나게 되면 그 다음부분을 건너 뛰고 실행시키는 것을 알수 있다.
그리고 건너 뛴 부분은 다음 프레임에서 실행되게 되는데 ④번이 실행되는 시점은 사용한 키워드의 종류. 즉 IEnumerator 값에 따라 다르다.
StartCoroutine()함수의 인자로 들어가는 Corutine() 함수는 IEnumerator 타입을 반환하도록 함수를 만들어야 한다.
이 반환되는 IEnumerator값은 유니티 엔진에 보내는 일종의 명령이라 할 수 있으며 엔진은 이 명령에 따라 Coroutine을 깨워서 실행 시킨다.
2. Coroutine 수행 시점
함수가 호출되는 시점과 키워드는 다음과 같다.
null
- Update구문이 수행을 완료할 때까지 대기한다.
WaitForEndOfFrame
- 현재 프레임의 렌더링 작업이 끝날 때까지 대기한다.
WaitForFixedUpdate
- FixedUpdate구문의 수행이 완료될 떄까지 대기한다.
WaitForSeconds
- 지정한 초만큼 대기한다.
WWW
- 웹에서 데이터의 전송이 완료될 때까지 대기한다.
3. 장점
- 10초 후에 동작하는 내용이 있다면 Update()함수 내에서 Time.deltaTIme을 매 프레임마다 더해서 10초가 됐을때 수행하도록 해야하지만 Coroutine의 WaitForSeconds(10)을 사용하면 10초 동안 스크립트가 쉬게 되어 성능상 도움이 된다.
- 가독성이 증가며, 어떤 특정한 순서로 코드를 수행하고 싶을때 효과적이다.
4. 알아두어야 할 점
- 객체의 active가 false가 되면 Coroutine은 실행되지 않으며, 다시 true로 바꾸더라도 재실행되지 않는다.
- Coroutine() 함수에 yield 구문이 없으면 컴파일러는 에러를 발생시킨다.
- WaitForSeconds는 Time.timeScale의 영향을 받는다.
5. 어디서 사용하면 좋은가.
- AI같이 특정 시간을 대기했다가 동작하는 로직이 필요할 때 WaitForSeconds를 사용하면 좋다. WaitForSingleObject() 처럼 스레드를 아예 정지 시키는것이 아니라 다른 스크립트를 수행하다가 때가 되면 AI의 동작을 수행해 주기 때문에 아주 활용적이다.
- Update() 함수를 통해 매번 실행 시켜주기 부담 스러운 코드(예를 들면 그려진 상황을 화면에 갱신해주는 함수를 WaitForSeconds() 함수로 수행해주면 좋다.
- FSM 구현 시 상태의 enter -> excute -> exit를 구현 할때 활용적이다.
출처: https://chfhrqnfrhc.tistory.com/entry/StartCoroutine [비밀상자]
'Unity' 카테고리의 다른 글
[Unity] 로딩 화면 구현하기(Loading System) 스크랩 (0) | 2019.11.05 |
---|---|
[Unity] 공부할 때 자주보는 개발자 사이트 (0) | 2019.11.03 |
[Unity] 충돌체크하기 (0) | 2019.11.03 |
[Unity] 오브젝트의 회전에 대하여(Rotation, Quaternion, Euler) (0) | 2019.11.03 |
[Unity] Uncheck Toggle in code (0) | 2019.11.01 |