Unity 물리 이동이 끊겨 보일 때, 보간이 메우는 시간
화면과 물리는 같은 횟수로 갱신되지 않습니다
캐릭터가 일정한 속도로 움직여도 추적 카메라에서는 미세하게 끊겨 보일 수 있습니다. Unity의 물리 계산은 고정 시간 간격을 기준으로 진행되고, 화면은 렌더 프레임마다 갱신됩니다. 화면 갱신이 더 빠르면 새로운 물리 위치가 없는 프레임도 생깁니다. Unity 6.0 문서는 이런 차이가 Rigidbody의 떨림으로 드러날 수 있다고 설명합니다.
예를 들어 물리 간격을 0.02초로 설정하면 초당 50번의 물리 스텝에 해당합니다. 이것이 화면도 반드시 초당 50프레임으로 그려진다는 뜻은 아닙니다. 따라서 화면상의 부드러움과 물리 계산의 주기를 따로 살펴야 합니다.
고정 간격은 실행 시각이 항상 같다는 뜻이 아닙니다
공식 Fixed updates 문서에 따르면 고정 업데이트도 프레임 안에서 실행됩니다. 렌더링이 빠를 때는 한 프레임에 FixedUpdate가 없을 수 있고, 느릴 때는 누적된 여러 스텝을 처리할 수 있습니다. 실제 실행 시각이 벽시계처럼 균등하게 배치되는 구조로 생각하면 호출 로그를 잘못 해석하기 쉽습니다.
디버깅할 때는 Update와 FixedUpdate의 횟수를 구분해 기록하는 방법이 유용합니다. 한 화면 프레임에서 물리가 여러 번 진행됐다는 사실과 물리 간격 설정값이 바뀌었다는 사실은 다릅니다. 화면이 느려지는 원인을 찾을 때도 이 둘을 구별해야 합니다.
Interpolate는 과거 두 위치 사이를 채웁니다
Rigidbody의 Interpolate는 이전 두 물리 업데이트의 위치와 회전을 이용해 현재 화면에 표시할 자세를 계산합니다. 두 점이 필요하므로 표시가 물리 업데이트 한 번만큼 늦어집니다. 이 지연을 받아들이는 대신 속도가 변하거나 다른 물체의 영향을 받는 움직임을 더 자연스럽게 보여줄 수 있습니다.
Extrapolate는 현재 속도를 바탕으로 다음 자세를 예측합니다. 앞으로 가해질 힘이나 충돌 결과를 미리 알 수 없어서 충돌 경계 밖까지 표시했다가 다음 계산 뒤 되돌아오는 모습이 생길 수 있습니다. 등속 이동 장면과 충돌이 잦은 장면에서 결과를 따로 비교할 이유입니다.
같은 장면에서 하나씩 비교합니다
시험 장면으로는 바닥 위를 움직이는 Rigidbody와 이를 따라가는 카메라, 진행 방향을 막는 벽을 준비할 수 있습니다. 먼저 None 상태를 관찰하고 Interpolate, Extrapolate 순서로 바꾸되 물리 간격과 이동 조건은 유지합니다. 직선 구간의 떨림뿐 아니라 벽 앞에서 표시가 튀는지, 급회전 시 어떤 차이가 생기는지 확인합니다.
그다음 카메라를 고정한 상태와 추적하는 상태를 나누어 봅니다. 물체 자체의 표시 문제인지 카메라 갱신과 함께 드러나는 문제인지 좁히는 데 도움이 됩니다. 이 절차는 재현 실험 제안이며 실행 결과를 보고한 것은 아닙니다.
보간은 물리 스텝 사이의 표시를 다듬는 기능입니다. 충돌 계산을 더 자주 수행하는 설정과 혼동하지 않아야 합니다. 모든 Rigidbody에 일괄 적용하기보다 떨림이 실제로 보이는 대상부터 비교하고, 입력에 대한 반응과 시각적 부드러움을 함께 판단하는 것이 좋습니다.


댓글
이 글에 대한 생각을 남겨 주세요.