본문 바로가기

Programming/Unity3D

Coroutin -1-

코루틴이 좋다는건 모두 아는데...

왜 좋은지????어떤게 동작하는지?????궁금하다가 결국 공부공부~~

유니티에도 예약함수라는게 있다.

Awake,Start,Update,OnEnable,OnDisable,LateUpdate,FixedUpdate,OnRenderObject..등등

이중에 Update,OnEnable에서는 사용 불가능.

일반적인 의미로는 진입 지점이 여러개인 함수

서브루틴(SubRoutine)

- 진입 지점이 하나인 함수,함수 선언 부분에서 진입함.

- return구문으로 반환되면 다시 처음부터 집입해야함.

코루틴

- 진입 지점이 여러개인 함수

- yield return  구문으로 반환되고 다시 들어올수있음.

이라고는 되어있지만 뭔말인지????

 

 

이해만 된다면 난 신이 될수도.....

유니티에서 사용되는 코르틴이란 IEnumerator 인터페이스를 반환하는 함수.

IEnumerator 인터페이스란???

물건을 하나씩 넘겨주는데 사용.

받는 사람은 주는사람이 몇개를 가지고 있는지 모름

Current : 현재 물건

MoveNext : 다음것 내놔~~라고 적혀있지만....

이해할려면 코루틴 출동 -> ㅇㅋㅇㅋ -> 다시출동  ->  ㅇㅋㅇㅋ  -> 이제그만StopCoroutin~

뭐 이렇게 이해..

어떻게보면 Stop이 걸릴때까지 반복적으로 수행하는게 while문이나 for문이랑 비슷해 보이기도한다.하지만 다름다름

유니티에서 코루틴이란 스크립트와 엔진의 협동 관계.

주는사람( 스크립트 == 프로그래머)

-어떤것을 줄지 설계

받는사람 (유니티 엔진)

-받는 사람은 쿨하게 물건만 받으면됨

-물건을 받아서 분석.

-받는 물건 안에 언제 다시 받아오라는 지령이 있음

-더이상 물건이 없으면 끝~`..`;

CoRoutine3.png

코루틴이 실행 되는 과정

- 스크립트에서 코루틴의 사작

- Startcoroutine

- 이벤트 함수를  IEnumerator로 선언

- SendMessage로 코루틴 함수 호출

- 먼저 엔진이 물건을 하나 달라고 한다.(MoveNext)

-그래서 물건은 먼저 최소한 하나 준비해야함

- yield 구문이 최소한 하나 필요.

코루틴용 데이터

엔진이 수행하는 기능

yield return null

다음 프레임까지 대기

yield return new WaitForSeconds(float)

지정된 초 만큼 대기

yield return new WaitForFixedUpdate()

다음 물리 프레임까지 대기

yield return new WaitForEndOfFrame()

모든 렌더링작업이 끝날 때까지 대기

yield return StartCoRoutine(string)

다른 코루틴이 끝날 때까지 대기

yield return new WWW(string)

웹 통신 작업이 끝날 때까지 대기

yield return new AsyncOperation

비동기 작업이 끝날 때까지 대기 ( 씬로딩 )

코루틴이 좋은이유~~

일단 성능적인 측면

yield return new WaitForSeconds(10)이라고하면 코루틴이라는 친구는 유니티 엔진에게 이데이터를 보내고 쉽니다..농땡이.

그러면 유니티 엔진은 이를 기록해 두었다가 자기일을 하면서 10초동안 신경을 안씁니다.

그리고 10초가 지나면 그때서야 코루틴을 다시 불러서 일을 시킵니다.

이를 만약 DelayTime으로 작업한다면 10초동안 Time.deltaTime으로 매프레임 연산을 하면서 10초를 계산해야합니다.

Update가 1초에 100번이 돈다면 10초가될려면 1000번...즉 1000번을 연산한다는 얘기.

하지만 코루틴은 그런친구는 아니라는점..선능에 영향을 미칩니다.

그리고 가독성이 좋아서 보면 바로 알수있는 코드입니다..~~

일단 코르틴 1부는 여기까지 입니다.~~

추후 조금더 공부하면 다시 올리겠습니다.