unreal 공부(Enhanced Input System을 활용한 입력 매핑 구현하기)25.01.24

Virus·2025년 1월 24일

1. PlayerController란?

1️⃣ PlayerController의 역할
PlayerController는 플레이어가 입력한 키보드, 마우스, 게임패드 등의 데이터를 받아 이를 해석하고, 소유(Possess) 중인 Pawn 또는 Character에 명령을 전달하는 핵심 클래스입니다.

입력 처리 흐름
입력 장치에서 사용자의 신호가 들어옴 -> PlayerController가 입력을 해석 -> 해석된 명령이 Pawn이나 Character로 전달되어 동작 수행.
특히 멀티플레이 환경에서는 각 플레이어마다 고유한 PlayerController가 생성되며, 각기 다른 입력을 관리할 수 있습니다.

2️⃣ PlayerController의 주요 기능
입력 처리: Enhanced Input 시스템을 통해 키보드, 마우스, 게임패드 등의 이벤트를 처리합니다.

카메라 제어: 마우스 입력을 기반으로 시점 이동, 줌 인/아웃 같은 카메라 동작 구현.

UI와 상호작용: UMG(언리얼 모션 그래픽)를 활용하여 UI 버튼 클릭이나 드래그 이벤트를 처리.

Possess / UnPossess: 특정 Pawn에 빙의(Possess)하거나 해제(UnPossess)하여 다른 캐릭터로 전환 가능.

2. PlayerController 생성 및 적용

1️⃣ C++ PlayerController 클래스 생성
Tools → New C++ Class 메뉴에서 Player Controller를 부모 클래스로 선택.
클래스 이름은 SpartaPlayerController로 지정.
생성된 SpartaPlayerController.h와 SpartaPlayerController.cpp 파일은 PlayerController의 기본 골격만 포함.

2️⃣ GameMode에 PlayerController 적용
GameMode에 새로 만든 SpartaPlayerController를 등록하여 사용하려면 아래 작업이 필요:
GameMode 클래스에서 PlayerControllerClass 속성을 ASpartaPlayerController::StaticClass()로 설정.
이 설정을 통해 게임 시작 시 SpartaPlayerController가 자동으로 스폰되고 입력을 처리.

3️⃣ Blueprint와의 연동
SpartaPlayerController를 상속받은 블루프린트를 생성 (BP_SpartaPlayerController).
GameMode에서 BP_SpartaPlayerController를 기본 PlayerController로 지정하여 입력 이벤트를 블루프린트에서 직관적으로 처리 가능.

3. Enhanced Input System 이해

1️⃣ Enhanced Input System란?
Enhanced Input은 언리얼 엔진 5에서 도입된 입력 시스템으로, 기존보다 체계적인 입력 처리가 가능합니다.
주요 개념:
Input Action (IA): 이동, 점프, 공격 등 특정 동작을 추상화한 입력 단위.
Input Mapping Context (IMC): 여러 Input Action을 한데 모아 관리하는 매핑 설정.

2️⃣ Input Action 생성

Content Browser에서 Input → Input Action을 선택하여 입력 액션(IA)을 생성.

각각의 Input Action에 대해 다음 속성을 설정:
Value Type: 입력 값의 타입

  • Bool (참/거짓)
    • 단순 On/Off 토글 입력에 사용됩니다.
    • 예) 점프(스페이스바), 공격(마우스 왼쪽 버튼)
  • Axis1D (1차원 축 값)
    • 단일 축 (-1~1 범위)의 입력에 사용됩니다.
    • 예) 게임패드 트리거(가속 페달), 전진/후진(W/S)
  • Axis2D (2차원 축 값)
    • X, Y 두 축을 동시에 처리할 때 사용됩니다.
    • 예) 캐릭터 이동(WASD), 마우스 이동(가로+세로)
  • Axis3D (3차원 축 값)
    - X, Y, Z 세 축을 동시에 처리합니다.
    - 예) 비행 시뮬레이션에서 3축 제어
    Trigger: 입력이 활성화되는 조건 (예: 키를 누르는 순간, 떼는 순간 등).
  • Pressed Trigger: 키를 누르는 순간에만 작동.
  • Hold Trigger: 키를 일정 시간 눌렀을 때 작동.
  • Released Trigger: 키를 뗄 때 작동.
    Modifier: 입력 값을 수정하는 옵션 (예: 반전, 배율 조정 등).
  • Scale : 입력 값에 일정 배율을 곱해줌 (마우스 이동 속도 2배)
  • Invert : 입력 값을 반전 (상하 반전 카메라)
  • Deadzone : 일정 임계값보다 작은 입력은 무시 (게임패드 조이스틱 미세 떨림 방지)

3️⃣ Input Mapping Context 생성 및 설정

Content Browser에서 Input → Input Mapping Context를 생성.
IMC_Character 이름으로 저장하고, 이동, 점프, 카메라, 스프린트 관련 Input Action을 매핑.

이동 액션(IA_Move)은 W, A, S, D 키를 각각 축 값(Axis)으로 매핑하여 캐릭터를 전/후/좌/우로 이동할 수 있도록 설정했습니다.

_1_Swizzle Input Axis Values란?
Swizzle Input Axis Values는 입력 데이터를 엔진 좌표계(X, Y, Z 축)로 올바르게 변환하거나 재배치하는 기능입니다.
아래는 각 키에 대한 Swizzle 설정입니다:
W 키 (전진)
X축 +1 방향으로 정렬되며, 추가 변환 없이 그대로 사용됩니다.
S 키 (후진)
X축 방향으로 정렬되지만, 전진(W)의 반대이므로 Negate Modifier를 통해 값을 뒤집어 X축 -1로 설정했습니다.
A 키 (왼쪽 이동)
Y축 +1 방향으로 정렬됩니다.
오른쪽 이동(D)의 반대 방향이므로, Negate Modifier를 사용해 값을 반전(Y축 -1)시켰습니다.
D 키 (오른쪽 이동)
Y축 +1로 설정하며 추가 변환은 필요 없습니다.

2 점프(IA_Jump) 키 매핑
점프 액션은 스페이스바 키를 눌렀을 때 On/Off로 동작하는 단순한 형태입니다.
Value Type은 Bool로 설정하여 키 입력이 활성화(Pressed)될 때만 동작하도록 했습니다.
트리거나 모디파이어는 필요하지 않으므로 기본값으로 두었습니다.

3 시점 회전(IA_Look) 키 매핑
시점 회전 액션은 마우스의 X축(좌우 회전, Yaw)과 Y축(상하 회전, Pitch)을 동시에 처리하도록 설정했습니다.
Value Type을 Axis2D로 지정하여 두 축의 데이터를 동시에 받아옵니다.
세부 설정
X축 (Yaw, 좌우 회전)
마우스 좌우 움직임은 엔진의 좌표계와 방향이 일치합니다.
오른쪽 → 양수(+)
왼쪽 → 음수(-)
따라서 추가 변환은 필요 없습니다.
Y축 (Pitch, 상하 회전)
기본적으로 마우스 Y축 움직임은:
위로 → 양수(+)
아래로 → 음수(-)
하지만 엔진의 카메라 좌표계는 상하 회전을 반대로 처리하므로, Negate Modifier를 사용해 값을 반전시켰습니다.
위로 → 음수(-) → 카메라 위로 이동
아래로 → 양수(+) → 카메라 아래로 이동

4 스프린트(IA_Sprint) 키 매핑
스프린트 액션은 왼쪽 Shift 키를 눌렀을 때 On/Off로 동작하도록 설정했습니다.
Value Type은 Bool로 설정했으며, 키 입력이 활성화되면 스프린트 상태로 전환됩니다.
트리거나 모디파이어 없이 기본 상태로 설정하고 저장했습니다.

4. Enhanced Input System과 PlayerController 연동

1️⃣ PlayerController에서 IMC 활성화
ASpartaPlayerController 클래스에서 입력 매핑 컨텍스트(IMC)를 활성화하는 코드를 작성.
UEnhancedInputLocalPlayerSubsystem을 사용하여 IMC를 관리.
AddMappingContext()를 호출해 IMC_Character를 활성화.
게임 중 다른 IMC로 전환할 수도 있음.

2️⃣ C++ 코드 작성 후 에디터에서 연결
ASpartaPlayerController에 IMC 및 IA를 변수로 선언하여, 에디터에서 쉽게 설정 가능.
블루프린트 BP_SpartaPlayerController에서 InputMappingContext에 IMC_Character를 할당.
각 Input Action 변수에 IA_Move, IA_Jump, IA_Look, IA_Sprint를 할당.

3️⃣ 입력 동작 테스트
블루프린트에서 IA_Move, IA_Jump 등의 Enhanced Action Event를 검색하여 연결.
예:
IA_Move: Print String 노드를 연결해 이동 키가 눌릴 때마다 문자열 출력.
IA_Jump: 스페이스바 입력 시 특정 메시지 출력.
게임 실행 후 WASD, 스페이스바, 마우스 이동 등을 테스트하며 정상 동작 여부 확인.

5. 오늘의 배움과 느낀 점

1️⃣ PlayerController의 중요성
PlayerController는 입력을 처리하고 이를 캐릭터로 전달하는 핵심 클래스입니다.
입력 처리와 캐릭터 로직을 분리하여 코드를 체계적으로 관리할 수 있다는 점이 큰 장점입니다.

2️⃣ Enhanced Input System의 편리함
Enhanced Input System을 통해 입력을 추상화하고 관리하는 방식이 매우 직관적이고 유연하다는 것을 배웠습니다.
특히 IMC를 통해 다양한 상황에서 입력 매핑을 동적으로 변경할 수 있다는 점이 인상적이었습니다.

3️⃣ 블루프린트와 C++의 연동
C++에서 설정한 IMC와 IA를 블루프린트에서 직관적으로 연결하고, 이를 이벤트 그래프로 처리하는 과정이 매우 효율적이었습니다.
코드와 블루프린트를 조합한 하이브리드 워크플로우가 엔진의 강력한 기능을 잘 보여주는 사례라고 느꼈습니다.

0개의 댓글