[Unity] 함수 생명주기 LifeCycle, 터널링 현상과 카메라 떨림 버그 해결 방법(FixedUpdate / LateUpdate)

728x90

유니티 함수 생명주기 - Awake / Start / Update / FixedUpdate / LateUpdate

Update() 함수

Update() 함수는 프레임마다 호출하는 함수로, 시간 및 횟수 불규칙하다. 왜나하면 PC 성능/사양에 따라 갱신 여부(t)가 달라질 수 있기 때문인데 시스템이 빠른 곳에서는 0.01초만에 갱신될 수도 있고, 0.03초만에 갱신될 수도 있다.

 

터널링(Tunneling) 현상 발생 원인

이러한 경우 터널링 현상이 발생할 수 있는데 예를 들어 bullet을 벽을 향해 쏘는데 frame이 씹혀서 통과하는 경우가 종종 발생한다. 이는 t값이 Time.deltaTime의 값을 받기 때문인데 원래 Udpate에서는 t 가 Time.deltaTime으로 적용되 시간이 계속 증가해 Frame 불안정하기 때문이다.

 

FixedUpdate() 함수를 사용해 터널링 버그 해결

FixedUpdate 함수는 지정시간마다 호출하는 함수로 실제 시간은 달라질 수 있어도 내부적으로 고정 시간으로 처리 판단하기 때문에 횟수 일정하다. FixedUpdate()는 물리 엔진에서만 고정된 시간을 계산하기 위해 유니티에서만 제공하는 특수 함수로, FixedDeltaTime이 기본 0.02로 적용되어 내부적으로 함수를 갱신하게 된다. 

 

예를 들어 물체의 이동 공식에 적용을 했을 때, P = P0 + vt에서 t를 0.02로 바꿔서 계산하기 때문에 Frame 안정화되어 위의 터널링 버그를 방지할 수 있다. 애니메이션 같은 경우는 시간 단위로 체크가 필요하니 FixedUpdate를 주로 사용한다.

추가적으로 FIxedDeltaTime은 수정이 가능하다.

 

LateUpdate() 함수를 사용해 카메라 떨림 버그 해결

LateUpdate() 는 마지막 결과물만 화면에 잡고 싶을 때 사용한다.

주로 카메라 스크립트에 많이 사용하는데 캐릭터를 따라다니는 카메라 기능을 적용할 때 캐릭터 이동 및 물리 효과가 끝났을 때를 그린다. 즉, 여러 요인을 고려해서 프레임 안에 움직여야 할 오브젝트들이 다 움직인 후 최종 화면을 구현한다는 의미로 해석하면 된다.

 

만약 카메라의 위치를 계산하는 로직을 Update 함수에서 구현했다면 Player의 움직임이 완료되기 전에 카메라가 이동하면서 떨리는 버그가 발생한다. 따라서 카메라의 위치 계산은 이동 및 회전을 마친 후에 실행해야 한다. 이런 경우 함수를 LateUpdate()에서 갱신해주면 해결 가능하다.  

728x90