1. Enhanced Input System이란?
- UE5에서는 이전 버전에서 사용하던 전역 Project Settings -> Input 시스템을 대체하거나 확장하기 위해 Enhanced Input 시스템이 제공된다.
- Enhanced Input은 입력 설정을 IMC(Input Mapping Context)와 IA(Input Action)이라는 개념으로 나누어 관리한다.
2. Input Action (IA)
2-1. 개념
- Input Action은 캐릭터의 이동, 점프, 발사, 줌 등과 같이 특정 동작을 추상화한 단위이다.
- 예를 들어 WASD 이동을 담당하는 IA_Move, 스페이스바 점프를 담당하는 IA_Jump, 마우스 회전을 담당하는 IA_Look 등을 만들 수 있다.
2-2. 생성 방법
Content Browser > 우클릭 > Input > Input Action을 선택하여 생성한다.
2-3. 속성 설명
Value Type
Input Action이 입력 동작을 발생시킬 때, 어떤 유형의 값을 제공할지 결정하는 옵션이다.
bool
단순 On/Off 토글 입력에 사용된다.
- 예) 점프, 공격
Axis1D (1차원 축 값)
단일 축 (-1 ~ 1 범위)의 입력에 사용된다.
- 예) 가속 페달, 전진, 후진
Axis2D(2차원 축 값)
X, Y 두 축을 동시에 처리할 때 사용된다.
- 예) 캐릭터 이동(WASD), 마우스 이동
Axis3D(3차원 축 값)
X, Y, Z 세축을 동시에 처리한다.
- 예) 비행 시뮬레이션에서 3축 제어
Trigger
트리거는 입력이 활성화되는 특정 조건을 말한다.
Pressed Trigger: 키를 누르는 순간에만 작동
Hold Trigger: 키를 일정 시간 눌렀을 때 작동
Released Triger: 키를 뗄 때 작동
Modifier
모디파이어는 입력 값을 수정하거나 변환하기 위한 설정이다.
Scale: 입력 값에 일정 배율을 곱해 줌 (마우스 이동 속도 2배)
Invert: 입력 값을 반전 (상하 반전 카메라)
Deadzone: 일정 임계값보다 작은 입력은 무시 (게임 패드 조이스틱 미세 떨림 방지)
3. IA 직접 만들어 보기
3-1. IA_Move
- 이동은 일반적으로 앞/뒤, 왼/오 두 방향을 동시에 처리하므로, Value Type은 Axis2D로 설정한다.
- IA_Move는 항상 활성화된 상태에서 WASD 입력만으로 동작해야 하므로 트리거나 모디파이어가 필요없다.
3-2. IA_Jump
- 스페이스바를 누르면 점프하는 간단한 방식이므로, Value Type을 bool로 설정한다.
- 점프 동작은 단순히 On/Off로 동작하기 때문에 키가 눌렸는지 여부만 중요하며, 추가적인 수치나 축 값이 필요없다.
3-3. IA_Look(시점 회전)
- 마우스 입력은 항상 X축과 Y축 움직임을 동시에 포함한다.
- 따라서 ValueType을 Axis2D로 설정한다.
3-4. IA_Sprint
- 스프린트 또한 단순히 Shift 키 값으로 속도를 늘리거나 줄이고를 설정해 주므로, Value Type을 Bool로 설정하고 저장한다.
4. Input Mapping Context 설정하기
4-1. IMC란?
- IMC는 여러 개의 IA들을 한데 모아놓은 매핑 설정 파일이다.
- 예를 들어 "플레이어 기본 이동, 점프, 시점 전환"을 하나의 IMC에 넣고, "UI 전용 입력"을 다른 IMC로 분리하는 식으로 관리할 수 있다.
- 게임 진행 중 특정 상황에서 IMC를 활성하거나 비활성하여 입력을 제어할 수 있다.
4-2. IMC 생성 방법
Content Browser > 우클릭 > Input > Input Mapping Context를 선택한다.
5. IMC 매핑
5-1. 이동
W
- Swizzle을 통해 W 키를 누르면 입력 값이 X축에 맞춰 정렬된다.
- 전진은 X축 + 1 방향이므로 추가적인 변환은 필요 없다.
Swizzle Input Axis Values란?
입력 축을 변환하거나 재구성하는 기능이다.
언리얼 엔진의 입력 시스템에는 입력 데이터를 X, Y, Z 축 중 하나로 매핑한다.
Swizzle은 이 입력 값이 올바른 축에 맞지 않을 경우, 특정 축으로 재배치하거나 변환할 수 있게 도와준다.
S
- S 키의 입력 값도 Swizzle을 통해 X축으로 정렬된다.
- 후진은 전진의 반대 방향이므로 Negate를 사용해 입력 값을 뒤집는다.
A
- A 키를 누르면 입력 값이 Swizzle을 통해 Y축(좌우 방향)에 맞춰 정렬된다.
- A 키는 오른쪽 D 이동의 반대 방향이므로 Negate를 사용해 Y축의 값을 반전한다.
D
- D 키의 입력 값도 Swizzle을 통해 Y 축으로 정렬된다.
- D 키는 Y축의 +1 방향에 매핑되므로 추가 변환이 필요 없다.
5-2. 점프
- 점프는 스페이스바를 눌렀을 때 On/Off 형태로 동작한다.
- 별도의 트리거나 모디파이어가 필요 없으므로, 기본 상태로 둔다.
5-3. 시선 이동
- 마우스 움직임을 통해 Yaw(좌우 회전)와 Pitch(상하 회전) 값을 동시에 전달받는다.
- Axis2D로 지정한 X축, Y축 값을 게임 내 좌표계에 맞춰 회전에 반영한다.
- 기본적으로 마우스 Y축 움직임은 위로 움직임(양수), 아래로 움직임(음수)로 전달된다.
- 하지만 카메라의 상하 회전은 위로 움직임(음수), 아래로 움직임(양수)로 작동하는 경우가 많다.
- 따라서 Y축 값을 Negate Modifier를 통해 반전해야 한다.
5-4. 스프린트
- 스프린트는 왼쪽 Shift 키를 눌렀을 때 On/Off 형태로 동작한다.
- 트리거나 모디파이어는 필요 없다.
6. PlayerController에서 IMC 활성화 하기
6-1. PlayerController.h
IMC, IA 관련 전방 선언을 해 준다.
방금 만든 IA와 IMC를 C++ 멤버 변수로 선언하고, 언리얼 에디터에서 이를 지정할 수 있도록 리플렉션 처리한다.
6-2. PlayerController.cpp
cpp 파일에서 생성자를 구현해 준다.
6-3. 빌드
빌드한 뒤, 에디터를 재시작하고 BP_PlayerController를 열어 확인해 보면 위에서 선언한 변수가 노출되어 있는 것을 볼 수 있다.
위와 같이 해당하는 에셋을 할당한 후, 저장한다.
7. IMC 활성화 코드 작성
UE5에서 Enhanced Input System은 Local Player Subsystem을 통해 Input Mapping Context를 활성화하거나 비활성화한다.
Local Player Subsystem이란?
게임이 실행되면 언리얼은 각 플레이어를 표현하기 위해 Local Player 객체를 생성한다.
싱글 플레이어 상황에서는 하나의 Local Player 생성
로컬 멀티플레이라면 플레이어 수만큼 Local Player가 생성된다.
UEnhancedInputLocalPlayerSubsystem
UEnhancedInputLocalPlayerSubsystem은 Local Player에 부착되어 해당 플레이어가 사용할 IMC를 관리한다.
이를 통해 플레이 중 동적으로 다른 IMC를 추가/제거하여 입력 모드를 전환할 수 있다
예) 전투 중 (IMC_Character) -> UI 창 열림 (IMC_UI)
PlayerController 클래스에서 BeginPlay() 함수를 오버라이드 하여 BP에서 지정해 둔 IMC를 활성화하는 코드를 추가하자.
PlayerController.cpp
Enhanced Input System의 Local Player Subsystem을 사용하기 위해 포함한다.
GetLocalPlayer()
- 현재 PlayerController가 관리하는 Local Player를 반환한다.
GetSubsystem<UEnhancedInputLocalPlayerSubsystem>()
- 해당 Local Player에 부착된 Enhanced Input Subsystem을 반환한다.
- 이를 통해 AddMappingContext나, RemoveMappingContext 등을 호출하여 입력 매핑을 동적으로 제어할 수 있다.
AddMappingContext(활성화 활 IMC, 우선 순위)
- 주어진 IMC를 Subsystem에 추가하여 입력 매핑을 활성화한다.
- 이 함수를 여러 번 호출해 여러 IMC를 활성화 할 수 있다.
- 우선순위를 달리 부여해, 특정 IMC가 다른 IMC보다 우선순위가 높도록 설정할 수 있다.
이를 통해 IMC가 활성화 되었으며, 다음에는 각 IA에 대한 동작 구현을 할 것이다.
'Unreal' 카테고리의 다른 글
TSubclassOf vs TSoftClassPtr (0) | 2025.02.13 |
---|---|
액션 바인딩 추가 및 캐릭터 동작 구현 (0) | 2025.02.12 |
Player Controller (0) | 2025.02.12 |
Pawn과 Character 클래스 이해하기 (0) | 2025.02.06 |
GameMode 이해하기 (0) | 2025.02.06 |