Input System 으로 플레이어 만들기

1 minute read

Player

Input System을 활용해서 간단한 플레이어를 만들어 본다.

구현할 기능은 Move, Sprint

디바이스는 키보드, Invoke C Sharp Events로 작업한다.

Move

Input Action에서 WASD의 입력을 받아서 플레이어 이동으로 처리한다.

Input Action - Move

Input Action에서 WASD키를 조합하여 Move 액션을 만든다.

스크립트에서 PlayerInput의 onActionTriggered 이벤트에 OnActionTriggered 함수를 리스너로 등록하고, OnActionTriggered 함수 안에서 각 액션에 대한 처리를 한다.

private PlayerInput playerInput;
private Vector2 moveInput;

private void Awake()
{
	...
    playerInput = GetComponent<PlayerInput>();
    playerInput.onActionTriggered += OnActionTriggered;
    ...
}

...


private void OnActionTriggered(InputAction.CallbackContext context)
{
    if (context.action.name == "Move" && context.performed)
    {
        OnMove(context);
    }
}

...

public void OnMove(InputAction.CallbackContext context)
{
    moveInput = context.ReadValue<Vector2>();
}

WASD 키 입력에 따라서 moveInput의 값이 수시로 업데이트되고 플레이어의 움직임을 관리하는 함수에서 moveInput 값을 사용해서 처리한다.

확실한 입력이 있을 때 만 처리하기 위해서 performed 인 경우를 체크한다.

Sprint

달리기를 위한 기능으로 눌린 상태에서 더 빠르게 움직이도록 한다.

Input Action - Sprint

Left Shift 키와 바인딩하여 누르고 있을 때 달리고 떼면 다시 걷도록 한다. 이 입력을 위해서 Press And Release로 키 입력을 받는다.

private void OnActionTriggered(InputAction.CallbackContext context)
{
	...
    
    if (context.action.name == "Sprint" && context.performed)
    {
        OnSprint(context);
    }

    ...
}

public void OnSprint(InputAction.CallbackContext context)
{
    isSprint = context.ReadValue<float>() == 1;
    currentSpeed = isSprint ? moveSpeed * 2f : moveSpeed;
    Debug.Log("On Sprint");
}

눌림 상태는 float 값으로 들어오며 눌리면 1 떼면 0으로 콜백이 들어온다.

이 값을 달리는 상태를 변경하는 플래그로 사용해서 처리한다.

간단하게 조작 로직을 구현해서 본다.

용량 문제로 Player - Move&Sprint 애니메이션 이미지는 원문에서 확인한다.

</figure> </p>