본문 바로가기
Unity

코루틴

by imagineer_jinny 2021. 7. 13.

코루틴: 처리와 처리 사이에 대기 시간 삽입 가능,
여러 처리를 순차적으로 처리하는 것이 아니라 동시에 병렬로 처리할 수 있도록 함

ex. Fade in, out 기능을 구현하고 싶을 때

이렇게 하면 너무 빨라서 서서히 Fade in 처럼 안보임.
이럴 때 해결책은 중간에 대기시간을 넣어주는 것임.
알파값을 빼주고 대기하고 빼주고 대기하는 식으로 구현해야 함!

즉, 코루틴은 대기시간을 삽입할 수 있는 유니티 기능임
(C#에 없는 유니티에만 있는 고유 기능이기 때문에 문법을 신경 쓸 필요는 없음)

코루틴 특징 1: 코드 중간에 대기시간 삽입 가능

A 처리를 하고 yield문을 만난 순간 앵커 박고 명시되어 있는 시간 만큼 코드 밖으로 빠져 나가서 쉬다가
마지막 yield문으로 돌아와서 그 다음 코드 실행.

StartCoroutine안에 함수 또는 스트링 문자열로 함수 이름 넣을 수 있음.

ex.
StartCoroutine(FadeIn());
: 성능은 좋지만 나중에 인위적으로 멈출 수 없음

StartCoroutine("FadeIn");
: 코루틴 시작한 후 인위적으로 멈출 수 있음

위 그림처럼 "스트링" 형태로 쓰면 StopCoroutine 사용 가능!


코루틴 특징 2: 비동기 방식을 구현하는 방법 중 하나(병렬처리 구현 가능)

이 상태에서 코루틴을 두개 돌리면 어떻게 될까?


실행결과


비동기(Async)
끝나는 시점 안알려주니까 A가 시작되자마자 B 시작, B 시작되자마자 C 시작
즉, A가 끝나는 시점에 B가 시작되는 게 아님.
끝나는 시점을 안 알려주면 어떤 시점에 여러 작업이 동시에 처리(빨간색)되는
multi-thread 프로그래밍을 구현할 수 있음.


코루틴도 마찬가지.
끝나는 시점을 안 알려준다?
HelloUnity 코루틴이 끝나는 것을 기다리지 않고 HelloUnity 코루틴이 시작하고
바로 HiCSharp 코루틴이 시작됨.
마찬가지로 HiCSharp이라는 코루틴이 시작될 때 바로 Debug.Log("End"); 실행
따라서 총 소요시간은 8초가 아니라 5초가 걸림


코루틴은 무한 루프를 돌더라도 중간에 대기 시간이 있기 때문에 심각하게 터지진 않음


비슷한 이유로 9번째라인에서 10번째 라인으로 넘어갈 수 있는 이유는
무한루프일지라도 코루틴 덕분에 대기 시간이 있기 때문임.


대기시간 지정 안하고 null로 주면 대충 1/60초(한 프레임) 쉬게 된다!

'Unity' 카테고리의 다른 글

프롭 + 데미지 시스템 , Instantiate(), Tag & Layer , Physics  (0) 2021.07.15
회전 포신, 포탄 만들기  (0) 2021.07.15
UI / 오디오 / 최종빌드  (0) 2021.07.13
싱글톤  (0) 2021.07.13
인스턴스화  (0) 2021.07.12

댓글