유니티에는 다양한 방법 으로 사용자 입력을 받을 수 있지만 비교적 최근 등장한 아래와 같은 New Input System 이 있다.
패키지 매니저에서 임의로 설치가 필요하며 적용하기 위한 다른 절차에 대한 설명은 다른 곳에도 잘 나와 있으니 생략한다.
New Input System 은 기존 Input System 과는 달리
Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")
을 사용하지 않고 PlayerInput 이라는 컴포넌트를 사용해서 받는다. PlayerInput 을 사용하다 보면 알겠지만 키보드에서 Analog 방식(-1 <= x <= 1) 값을 받기가 쉽지 않다.
키보드는 조이스틱과는 달리 입력의 정도가 없기 때문(정확한 이유는 모름)이라고 생각한다. 위 GIF 는 키보드로 입력을 받았을 때 나온 값이다. 세부 설정은 아래와 같다.
분명 Control Type = Vector 2, Mode = Analog 로 했지만 위에서 설명했던 이유로 인해 디지털화 된 값을 받을 수 밖에 없었다.
원하는 값을 받기 위해서 우리가 사용해야 할 함수는 Vector2.SmoothDamp 이다.
파라미터는 세 개만 신경쓰면 된다.
current : 현재 속도
target : 목표 속도
smoothTime : 목표 속도까지 걸리는 시간
current 를 계속 갱신하며 target 에 다가갈 수 있도록 코드를 짜면 된다.
public class PlayerController : MonoBehaviour
{
public Vector2 smoothInputVelocity;
public Vector2 moveVec;
public Vector2 curVec;
public float smoothRatio;
private void FixedUpdate()
{
curVec = Vector2.SmoothDamp(curVec, moveVec, ref smoothInputVelocity, smoothRatio, maxSpeed);
Debug.Log(curVec);
}
private void OnMove(InputValue value)
{
moveVec = value.Get<Vector2>();
}
}