키 대신 게임 속 행동부터 정하기

새 Input System에서는 키보드의 특정 키를 바로 읽기보다 이동, 점프, 상호작용처럼 게임 안에서 의미가 있는 행동을 먼저 정합니다. 행동 하나에 키보드, 게임패드, 터치를 각각 연결해 두면 플랫폼을 늘릴 때 입력 코드를 다시 짤 일이 줄어듭니다.

Unity는 액션 기반 작업 방식을 권장합니다. 이 글은 1인용 프로토타입에서 PlayerInput이 해당 플레이어의 액션을 관리하는 한 가지 패턴만 사용합니다. 로컬 멀티플레이어에서는 PlayerInput마다 별도의 액션 복사본을 관리하므로 원본 InputActionReference를 섞어 쓰지 않습니다.

처음 연결할 것

처음에는 Action Asset 하나와 의도한 PlayerInput 하나만 연결하세요. 1인용 씬에 실수로 두 번째 입력 처리 오브젝트가 들어가면 같은 행동이 중복 호출될 수 있습니다. 여러 PlayerInput 자체는 로컬 멀티플레이어에서 정상적인 구조입니다.

  1. Package Manager에서 Input System 패키지를 설치하고 Project Settings의 Active Input Handling에서 새 backend가 켜졌는지 확인한 뒤, 변경 안내가 나오면 Editor를 다시 시작합니다.
  2. Input Actions 에셋에 Gameplay 맵을 만들고 Move의 Action Type은 Value, Control Type은 Vector2로 지정합니다. Move의 바인딩 추가(+) 메뉴에서 Add Up/Down/Left/Right Composite를 선택한 뒤 각 Path에 Up=W, Down=S, Left=A, Right=D를 연결합니다. 화살표 키를 쓰려면 같은 네 방향에 해당 키를 지정하세요. 일반 Add Binding으로 키 하나를 Move에 바로 연결하는 것과는 다릅니다.
  3. Jump의 Action Type은 Button으로 지정하고 일반 Add Binding으로 Space 키를 연결합니다. Auto-Save가 꺼져 있다면 Save Asset으로 저장합니다. 플레이어 오브젝트에 PlayerInput을 추가하고 액션 에셋과 Default Action Map을 Gameplay로 지정합니다.
  4. 코드에서는 원본 에셋이 아니라 PlayerInput.actions에서 이 플레이어의 Move 액션을 가져옵니다. 아래 예제는 Move만 읽으므로 Space를 연결했다고 점프 동작까지 구현되는 것은 아닙니다.
using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class MoveProbe : MonoBehaviour
{
    private InputAction move;

    private void Awake()
    {
        PlayerInput playerInput = GetComponent<PlayerInput>();
        move = playerInput.actions.FindAction("Gameplay/Move", true);
    }

    private void Update()
    {
        Vector2 direction = move.ReadValue<Vector2>();
        transform.Translate(new Vector3(direction.x, 0f, direction.y) * Time.deltaTime);
    }
}

입력이 안 들어올 때 볼 네 곳

초기 설정 문제는 코드 문법보다 연결 상태에서 더 자주 생깁니다. Default Action Map이 지정됐는지, Gameplay 맵이 활성화됐는지, Game 뷰에 포커스가 있는지, 1인용 씬에 의도치 않은 두 번째 PlayerInput이 있는지 차례대로 보세요.

프로토타입은 장치 상태를 직접 읽어도 괜찮습니다. 다만 키 재설정이나 여러 장치를 지원할 게임이라면 처음부터 Action 중심으로 잡아 두는 게 관리하기 쉽습니다.

검증 범위

공식 문서 대조

검증일

Unity 6과 Input System 공식 문서를 대조했습니다. 별도 프로젝트에서 직접 재현한 결과는 아닙니다.