핵심 정리
Input Action Asset
-> Action Map
-> Action
PlayerInput
-> 어떤 액션 자산을 현재 플레이어에 연결할지 관리구조 이해
구조 개요: Action, Action Map, Asset
Input System은 키보드 키 하나를 바로 읽는 방식보다 "의도된 행동(Action)"을 중심으로 입력을 다룹니다. Jump, Move, Look, Interact처럼 게임 의미를 먼저 정의하고, 그 행동에 여러 장치를 바인딩합니다. Input Action Asset은 전체 입력 설계의 컨테이너이고, Action Map은 상황별 묶음입니다. 예를 들어 Gameplay, UI, Vehicle, PhotoMode처럼 맥락에 따라 map을 나누면 활성화와 비활성화가 쉬워집니다. Action은 실제 입력 행동 단위로, 값형(Vector2 이동), 버튼형(점프), 패스스루형(mouse delta)처럼 쓰임이 다르고 callback을 통해 started, performed, canceled 흐름을 받을 수 있습니다.
PlayerInput의 역할
PlayerInput은 이 구조를 씬 오브젝트와 연결해 주는 실전용 컴포넌트입니다. 한 플레이어의 액션 자산, control scheme, 이벤트 전달 방식을 묶어 관리할 수 있어서 규모가 커질수록 편해집니다. 이벤트 전달 방식은 Unity Events, Send Messages, C# callback 중 선택할 수 있으며, 팀 내 규칙을 미리 정해 두면 혼란을 줄일 수 있습니다.
어떻게 설계하면 좋은가
먼저 장치보다 행동 vocabulary를 정하는 것이 좋습니다. Move, Look, Jump, Interact, Pause처럼 게임이 요구하는 행동을 먼저 정하고, 그다음 장치를 붙이면 키보드와 패드 대응이 훨씬 쉬워집니다. Action Map은 기술적 구분보다 플레이 상태 구분으로 나누는 편이 좋습니다. Gameplay, UI, Vehicle, Dialogue처럼 상태별로 나누면 어떤 입력이 현재 유효한지 즉시 보입니다. 액션 자산을 너무 잘게 쪼개는 것도, 모든 것을 하나의 map에 넣는 것도 둘 다 불편합니다. "같이 켜고 끄는 입력 묶음인가"를 기준으로 map 경계를 잡는 편이 실전적입니다. 결국 Input System에서 가장 중요한 것은 API가 아니라 가독성으로, 디자이너와 프로그래머가 입력 구성을 함께 볼 수 있어야 하고 장면 상태에 따라 활성 map이 무엇인지 쉽게 추론돼야 합니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 전체 입력 정의 컨테이너 필요 | Input Action Asset |
| Gameplay·UI·Vehicle 입력 분리 | Action Map 분할 |
| 게임 행동 하나 정의 | Action (값형/버튼형/패스스루형) |
| 씬 오브젝트에 액션 자산 연결 | PlayerInput 컴포넌트 |
| 특정 상태에서 입력 차단 | 해당 Action Map 비활성화 |
| 비교 | 더 잘 맞는 쪽 | 이유 |
|---|---|---|
| Action Map 분리 vs 액션 전부 한곳에 몰기 | 상태별 Map 분리 | 현재 유효 입력을 추론하기 쉬움 |
PlayerInput 사용 vs 수동 enable/disable | 팀 규모가 크면 PlayerInput | 제어 지점과 이벤트 전달 규칙을 통일하기 쉬움 |
| 값형 액션 vs 버튼형 액션 | Move, Look / Jump, Interact | 읽는 방식과 callback 해석이 다름 |
주의할 점
Action Map 없이 모든 입력을 하나로 묶으면 UI와 Gameplay 입력이 서로 간섭합니다.
// ❌ 단일 Action Map — UI 포커스 중에도 Gameplay 입력 동작
// AllActions Map: Move, Jump, Attack, Confirm, Cancel, Pause...
// ✅ 상태별 Map 분리 후 활성화 전환
playerInput.SwitchCurrentActionMap("Gameplay"); // 게임 중
playerInput.SwitchCurrentActionMap("UI"); // 메뉴/인벤토리 중
playerInput.SwitchCurrentActionMap("Dialogue"); // 대화 중// ❌ 같은 Action Map에 UI Confirm과 Gameplay Attack을 같이 둠
Enter 키 입력
→ 메뉴에선 Confirm
→ 게임에선 Attack
→ 포커스 상태에 따라 예상 못 한 동작 발생참고 링크
3 sources