프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

 

 

 

유니티에서 보통 오브젝트를 움직이거나 서서히 변화를 주기 위해서 프레임 단위마다 실행되는 Update() 함수에 코드를 작성한다.

Update는 프레임마다 실행되는 만큼 대부분의 작업을 의존하게되면 프레임 드롭같이 최적화 문제가 발생한다.

 

간단한 루틴 작업이라면 Coroutine으로 대체할 수 있다.

Coroutine은 Update와는 독립적인 서브 루틴으로 IEnumerator 형식의 함수로 선언한다.

코루틴 함수는 진행되면서 맞닥뜨리는 yield return 행마다 실행을 중지하고, 다음 프레임부터 중지한 다음 시점부터 다시 실행한다.

 

기본적으로는 바로 다음 프레임에 다음 구문이 다시 실행되기 때문에 Update와 다르지 않지만,  WaitForSeconds 함수를 이용해 지연 후 구문을 다시 진행시킬 수 있다.

 

이를 이용해 오브젝트를 position.x 값이 0 이상이 되도록 움직이는 코드를 코루틴으로 구현해보자.

 

 

StartCoroutine(moveUnit()); 을 실행시키면 해당 코루틴이 실행된다.

 

오브젝트의 x위치값이 0보다 작다면 while문이 실행된다.

오브젝트를 이동시키고 만나게 되는 yield return new WaitForSeconds(0.1f);은 코루틴의 다음 구문의 진행까지 0.1초간 대기한다.

 

0.1초 후 다음 구문이 실행되어 아직 x 위치 값이 0 보다 작다면 다시 while문이 진행되고,

yield return new WaitForSeconds(0.1f);의 실행이 반복된다.

만약 x 위치 값이 0 이상이라면 while문을 탈출하고 코루틴 함수 moveUnit()은 종료된다.

0.1초마다 시간이 오브젝트의 이동이 진행되기 때문에 Update를 대체하여 이동을 구현할 수 있다.

 

만약 이동이 부드럽지 않다면 대기시간을 0.1초보다 더 짧게한다면 더 부드러운 이동을 구현할 수 있다.

 

 

위와 같이 오브젝트의 이동은 부드러운 이동 표현을 위해 거의 짧은 시간에 여러 번 실행해 주어야 한다.

하지만 코루틴을 매 프레임마다 업데이트해줄 필요가 없는 작업에 적용한다면 실행 횟수를 비약적으로 감소시킬 수 있는 최적화 방법이다.

 

 

 

참조

https://docs.unity3d.com/kr/530/Manual/Coroutines.html

 

유니티 - 매뉴얼: 코루틴(Coroutine)

게임 오브젝트 생성 및 삭제 특수 폴더와 스크립트 컴파일 순서 코루틴(Coroutine) 함수를 호출하면 반환값을 반환하기 전에 실행 완료됩니다. 즉, 함수에서 수행되는 작업은 하나의 프레임에서 수

docs.unity3d.com

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함