Unity

[Unity] C# Coroutine 알아보기

성엽이 2019. 11. 3. 18:06

http://theeye.pe.kr/archives/2725

 

Unity C# – Coroutine 알아보기

유니티에서 사용되는 코루틴(Coroutine)은 왜 필요한가? 유니티에서 화면의 변화를 일으키기 위해서는 Update() 함수 내에서 작업을 하게 됩니다. 이 Update() 함수는 매 프레임을 그릴때마다 호출되며 60fps의경우라면 초당 60번의 Update() 함수 호출이 발생하게 됩니다. 하나의 프레임 안에서 어떤 작업을 한다면 이 Update(…

theeye.pe.kr

. 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 [비밀상자]