입력 평활화
완벽하게 매끄러운 움직임과 카메라를 얻기 위해서는 입력 신호를 정확하게 적용해야 합니다. 다음 섹션에서는 마우스에서 얻은 데이터를 기반으로 카메라 룩 회전에 대해 설명합니다.
입력 얻기
마우스 델타에서 다음을 사용하여 획득합니다:
UnityEngine.Input.GetAxis("Mouse X")
UnityEngine.Input.GetAxisRaw("Mouse X")
UnityEngine.InputSystem.Mouse.current.delta.ReadValue()
위의 모든 메소드들은 후처리 없이 마우스에서 폴링 된 위치 델타를 반환합니다. 마우스 폴링 속도(공통 125Hz, 게임용 마우스는 보통 1000Hz)에 따라 마우스와 함께 이동할 때 Mouse X
값을 얻게 됩니다:
보시다시피, 각 케이스마다 다른 결과가 나옵니다. 거의 모든 케이스에서 카메라 회전에 직접 전파하면 매끄럽지 않아 보입니다. 샘플 프로젝트에서 직접 테스트할 수 있습니다.
평활화
완벽하게 매끄럽게 보이기 위해서는 두 가지 가능한 해결책이 있습니다:
- 마우스 폴링, 엔진 업데이트 속도 및 모니터 리프레시 속도를 조정해야 합니다(예: 360Hz 마우스 폴링, 360FPS 엔진 업데이트 속도, 360Hz 모니터 리프레시 속도). 현실적이지 않은 해결책입니다.
- 입력 평활화 - 입력 지연 시간이 몇 밀리초씩 증가하는 대신 거의 완벽하게 매끄러운 결과를 제공합니다(고급 게임 설정에서도 그 차이가 두드러집니다).
KCC는 유틸리티 스크립트인 SmoothValue
그 변형인 SmoothFloat
, SmoothVector2
, SmoothVector3
를 제공하고 있습니다.
다음 코드는 SmoothVector2
를 사용하여 지난 10밀리초 동안의 값으로부터 매끄러운 마우스 위치 델타를 계산하는 방법을 보여줍니다.
C#
public class PlayerInput : MonoBehaviour
{
// Creates a SmoothVector2 with 128 samples.
private SmoothVector2 _mouseDeltaValues = new SmoothVector2(128);
private void Update()
{
// Read mouse position delta.
Vector2 mouseDelta = Mouse.current.delta.ReadValue();
// Add new value for current frame with delta time since last frame.
_mouseDeltaValues.AddValue(Time.frameCount, Time.unscaledDeltaTime, mouseDelta);
// Calculate smooth mouse delta based on values in last 10 milliseconds.
Vector2 smoothMouseDelta = _mouseDeltaValues.CalculateSmoothValue(0.01, Time.unscaledDeltaTime);
}
}
다음 이미지는 마우스 델타가 다양한 마우스 폴링 속도, 엔진 업데이트 속도 및 스무딩 윈도우와 함께 누적 룩 회전(약 90°)으로 전파되는 것을 보여줍니다:
보라색
- 스무딩 미적용.하늘색
- 10ms 스무딩 윈도우.녹색
- 스무딩 윈도우 20ms.노란색
- 30ms 스무딩 윈도우.파란색
- 40ms 스무딩 윈도우.
일반적으로 125Hz 마우스를 사용하는 일반 사용자의 경우 10-20ms 스무딩 윈도우가 평활도의 이득과 응답성의 손실 사이에서 좋은 균형을 이룹니다.
올바른 게임 하드웨어(500+Hz 마우스, 120+Hz 모니터)를 사용하는 사용자의 경우 엔진 업데이트 속도가 높은 3-5ms 평활 창을 사용하지 않는 것이 좋습니다.
다음 이미지는 90°의 누적 후 룩 회전에 대한 세부 정보를 보여줍니다.
평활화를 적용하면 입력 지연(+3.6ms 입력 지연, 10ms 평활화 윈도우 사용)에 평활화 윈도우 길이가 30~50% 추가됨을 알 수 있습니다.
⚠️ 모든 그래프는 InputSmoothing
씬과 레코더를 사용하여 샘플 프로젝트에 생성되었습니다.