This document is about: FUSION 2
SWITCH TO

입력 평활화

완벽하게 매끄러운 움직임과 카메라를 얻기 위해서는 입력 신호를 정확하게 적용해야 합니다. 다음 섹션에서는 마우스에서 얻은 데이터를 기반으로 카메라 룩 회전에 대해 설명합니다.

입력 얻기

마우스 델타에서 다음을 사용하여 획득합니다:

  • UnityEngine.Input.GetAxis("Mouse X")
  • UnityEngine.Input.GetAxisRaw("Mouse X")
  • UnityEngine.InputSystem.Mouse.current.delta.ReadValue()

위의 모든 메소드들은 후처리 없이 마우스에서 폴링 된 위치 델타를 반환합니다. 마우스 폴링 속도(공통 125Hz, 게임용 마우스는 보통 1000Hz)에 따라 마우스와 함께 이동할 때 Mouse X 값을 얻게 됩니다:

mouse input with 125hz polling and 120 fps
125Hz 폴링 및 120 FPS의 마우스 입력.
mouse input with 125hz polling and 360 fps
125Hz 폴링 및 360 FPS의 마우스 입력
mouse input with 1000hz polling and 120 fps
1000Hz 폴링 및 120 FPS의 마우스 입력.
mouse input with 1000hz polling and 360 fps
1000Hz 폴링 및 360 FPS의 마우스 입력.

보시다시피, 각 케이스마다 다른 결과가 나옵니다. 거의 모든 케이스에서 카메라 회전에 직접 전파하면 매끄럽지 않아 보입니다. 샘플 프로젝트에서 직접 테스트할 수 있습니다.

평활화

완벽하게 매끄럽게 보이기 위해서는 두 가지 가능한 해결책이 있습니다:

  1. 마우스 폴링, 엔진 업데이트 속도 및 모니터 리프레시 속도를 조정해야 합니다(예: 360Hz 마우스 폴링, 360FPS 엔진 업데이트 속도, 360Hz 모니터 리프레시 속도). 현실적이지 않은 해결책입니다.
  2. 입력 평활화 - 입력 지연 시간이 몇 밀리초씩 증가하는 대신 거의 완벽하게 매끄러운 결과를 제공합니다(고급 게임 설정에서도 그 차이가 두드러집니다).

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 마우스 폴링 및 120 fps의 누적된 룩 회전
125Hz 마우스 폴링 및 120 FPS의 누적된 룩 회전.
125hz 마우스 폴링 및 360 fps의 누적된 룩 회전
125Hz 마우스 폴링 및 360 FPS의 누적된 룩 회전.
1000hz 마우스 폴링 및 120 fps의 누적된 룩 회전
1000Hz 마우스 폴링 및 120 FPS의 누적된 룩 회전.
1000hz 마우스 폴링 및 360 fps의 누적된 룩 회전
1000Hz 마우스 폴링 및 360 FPS의 누적된 룩 회전

일반적으로 125Hz 마우스를 사용하는 일반 사용자의 경우 10-20ms 스무딩 윈도우가 평활도의 이득과 응답성의 손실 사이에서 좋은 균형을 이룹니다. 올바른 게임 하드웨어(500+Hz 마우스, 120+Hz 모니터)를 사용하는 사용자의 경우 엔진 업데이트 속도가 높은 3-5ms 평활 창을 사용하지 않는 것이 좋습니다.

다음 이미지는 90°의 누적 후 룩 회전에 대한 세부 정보를 보여줍니다.

90°의 누적 후 룩 회전
90°의 누적 후 룩 회전.

평활화를 적용하면 입력 지연(+3.6ms 입력 지연, 10ms 평활화 윈도우 사용)에 평활화 윈도우 길이가 30~50% 추가됨을 알 수 있습니다.

⚠️ 모든 그래프는 InputSmoothing 씬과 레코더를 사용하여 샘플 프로젝트에 생성되었습니다.

Back to top