기존 입력 시스템의 한계
: 언리얼 엔진 4까지 기본적으로 사용되던 입력 시스템은 InputAxis를 Project Settings >> Input에서 설정하고, 이를 바인딩하는 방식이었다.
주요 한계점
- 확장성 부족 : 입력 디바이스가 늘어나면 상황에 맞는 처리 코드가 복잡해짐.
- 컨텍스트 기반 입력 처리 불가능 : 상황에 따라 입력 행동을 다르게 하고 싶어도 동적으로 바꾸기 쉽지 않음.
- 멀티플레이어에 불편함 : 입력 세팅이 전역으로 되어 있어, 플레이어마다 입력을 독립적으로 설정하기 힘듦.
- 설정/데이터 기반 시스템 부족 : 대부분 코드 기반으로 처리되어 디자이너 친화적이지 않고, 입력 데이터를 에셋으로 관리할 수 없음.
- 다양한 디바이스와의 일관성 있는 입력 처리
- 디자이너가 직관적으로 구성 가능한 입력 매핑
- 동적 컨텍스트 전환(메뉴 / 게임 / UI)
- 멀티플레이어를 고려한 독립적인 입력 관리
- 데이터 에셋 기반 구성 -> 블루프린트 친화
- 유저의 "의도"를 추상화한 객체 - 예: "이동", "점프", "공격"
- 실제 키와는 분리된 추상 레이어로 직접적인 키와의 연결은 하지 않음
- 재매핑과 확장이 용이함
Input Mapping Context(IMC)
- 키와 IA의 매핑 테이블로 입력 매핑을 상황에 맞게 묶은 에셋
- 상황별로 다른 IMC 사용이 가능함
- 동적으로 교체할 수 있음
- Modifier: 입력 값을 가공 - 예: 감도 조절, Deadzone 설정
- Trigger: 눌림 상태 감지 - 예: 즉시, 누르고 있는 중, 더블 탭
상태에 따른 행동 제어
State Machine
- 플레이어의 상태에 따라 다른 행동을 할 필요가 있음.
- 플레이어가 주먹만 들고 있는 경우에는 공격 시에 주먹을 휘두르고, 총을 들고 있는 경우에는 총을 발사하고, 칼을 들고 있는 경우에는 칼을 휘두르는 식의 행동을 제어할 필요가 있다.
상태 정의 예시
enum class EBattleState
{
None, // 무기 없이 주먹으로 싸우는 경우
Knife, // 칼을 들고 있는 경우
Pistol // 권총을 들고 있는 경우
};
입력과 상호작용의 기본적인 구조화
플레이어 입력 (마우스 좌클릭)
↓
InputAction 생성 (Attack Action)
↓
ContextManager 확인 (현재 상황?)
↓
StateMachine 확인 (지금 가능한가?)
↓
실행 결정
├─ 가능: 공격 로직 실행 + 애니메이션 재생
└─ 불가: 메시지 출력
책임 분리
- InputAction : 의도 표현 - 무슨 동작을 하고 싶은가?
- ContextManager : 의미 해석 - 지금 그게 무슨 동작을 의미하는가?
- StateMachine : 가능성 판단 - 지금 그걸 할 수 있나?
1. 단일 책임 원칙 (SRP)
- 각 컴포넌트는 하나의 책임만 가짐
- Context 관리와 State 관리 분리
2. 개방-폐쇄 원칙 (OCP)
- 새로운 Context 추가 시 기존 코드 수정 불필요
- 새로운 State 추가 가능
3. 의존성 역전 원칙 (DIP)
- 구체적인 키 입력이 아닌 추상적인 Input Action에 의존
- 캐릭터는 State Machine의 인터페이스에만 의존
출처: 팀스파르타 내일배움캠프