입력을 '키'가 아니라 '행동'으로 생각하기
지난 장에서는 플레이어 캐릭터가 Player Controller를 통해 조작을 받는다고 배웠습니다. 이번 장에서는 그 조작을 더 구체적으로 연결합니다. 키보드의 W를 누르면 앞으로 이동하고, 마우스를 움직이면 카메라가 돌고, Space를 누르면 점프하는 흐름입니다.
언리얼 엔진 5에서는 이런 입력을 주로 Enhanced Input 시스템으로 다룹니다. 이름은 조금 어렵지만 핵심은 단순합니다. 특정 키를 바로 기능에 연결하지 않고, 먼저 "플레이어가 하려는 행동"을 만든 뒤 그 행동에 키를 배정합니다.
예를 들어 이렇게 나눕니다.
IA_Move: 이동이라는 행동IA_Look: 시점 회전이라는 행동IA_Jump: 점프라는 행동IA_Flashlight: 플래시라이트 켜기/끄기라는 행동
여기서 IA는 보통 Input Action의 줄임말로 사용합니다. Input Action은 "이동", "점프", "상호작용"처럼 게임 안에서 일어날 행동을 뜻합니다.
그리고 이 행동에 실제 키를 배정하는 곳이 Input Mapping Context입니다. 보통 IMC_Default, IMC_Player 같은 이름을 씁니다. IMC는 Input Mapping Context의 줄임말입니다. 쉽게 말해 "현재 플레이어가 사용할 조작표"입니다.
정리하면 다음과 같습니다.
| 요소 | 역할 | 예시 |
|---|---|---|
| Input Action | 게임 속 행동을 정의 | 이동, 점프, 공격, 상호작용 |
| Input Mapping Context | 행동에 키나 버튼을 배정 | W/A/S/D는 이동, Space는 점프 |
| Character Blueprint | 입력을 받아 실제 기능 실행 | 이동시키기, 점프시키기, 라이트 켜기 |
이 구조를 사용하면 나중에 키를 바꾸거나 게임패드 조작을 추가할 때 훨씬 편합니다. 점프 기능을 다시 만들 필요 없이, IA_Jump에 연결된 키만 바꾸면 되기 때문입니다.
AI 생성 이미지
Third Person 템플릿의 입력 구조 확인하기
이 책에서는 Third Person 템플릿으로 시작했습니다. 이 템플릿에는 이미 기본 입력이 만들어져 있을 가능성이 높습니다. 먼저 기존 구조를 확인해 봅시다.
Content Browser에서 다음 이름을 검색해 보세요.
IA_MoveIA_LookIA_JumpIMC_DefaultBP_ThirdPersonCharacter
버전에 따라 폴더 위치는 조금 다를 수 있습니다. 보통 Input, ThirdPerson/Input, Blueprints 같은 폴더 안에 있습니다. 찾기 어렵다면 Content Browser의 검색창에 IA_ 또는 IMC_를 입력해 보세요.
IA_Move를 열면 입력 값의 종류를 볼 수 있습니다. 이동은 앞뒤와 좌우가 모두 필요하므로 보통 Axis2D 값을 사용합니다. Axis2D는 X와 Y 두 방향 값을 가진 입력입니다. 예를 들어 W는 앞으로, D는 오른쪽으로 움직이는 값이 됩니다.
IA_Jump는 누름과 뗌만 알면 되므로 Boolean 값을 사용합니다. Boolean은 참/거짓, 즉 켜짐/꺼짐처럼 두 가지 상태만 가진 값입니다.
대략 이렇게 이해하면 됩니다.
| Input Action | 값 타입 | 의미 |
|---|---|---|
IA_Move | Axis2D | 앞뒤, 좌우 이동 |
IA_Look | Axis2D | 마우스 또는 오른쪽 스틱으로 시점 회전 |
IA_Jump | Boolean | 점프 버튼을 눌렀는지 여부 |
이제 IMC_Default를 열어 보세요. 여기에는 IA_Move, IA_Look, IA_Jump가 어떤 키와 연결되어 있는지 들어 있습니다. 예를 들어 IA_Jump에는 Space Bar가 연결되어 있을 수 있습니다. 게임패드가 함께 설정되어 있다면 Gamepad Face Button Bottom 같은 버튼도 볼 수 있습니다.
중요한 점은 IA_Jump 자체가 Space Bar가 아니라는 것입니다. IA_Jump는 점프 행동이고, Space Bar는 그 행동을 실행하는 키입니다.
이동, 시점 회전, 점프가 캐릭터로 전달되는 흐름
이제 입력이 실제로 캐릭터를 움직이는 흐름을 보겠습니다. BP_ThirdPersonCharacter를 열고 Event Graph를 확인합니다.
먼저 이동 입력은 보통 다음 흐름을 가집니다.
IA_Move이벤트가 실행됩니다.입력 값에서 X, Y 값을 꺼냅니다.
캐릭터의 현재 방향을 기준으로 앞쪽과 오른쪽 방향을 계산합니다.
Add Movement Input노드로 캐릭터를 움직입니다.
Add Movement Input은 Character에게 "이 방향으로 움직여라"라고 알려 주는 노드입니다. 실제 속도나 바닥 판정은 지난 장에서 본 Character Movement 컴포넌트가 처리합니다.
시점 회전은 보통 IA_Look에서 시작합니다.
마우스 움직임 또는 게임패드 오른쪽 스틱 값이 들어옵니다.
좌우 값은
Add Controller Yaw Input으로 연결됩니다.위아래 값은
Add Controller Pitch Input으로 연결됩니다.
Yaw는 좌우 회전, Pitch는 위아래 회전입니다. 말은 어렵지만 카메라를 돌릴 때 매일 쓰는 움직임입니다.
점프는 더 단순합니다.
IA_Jump의Started실행 핀 →JumpIA_Jump의Completed실행 핀 →Stop Jumping
Started는 버튼을 누르기 시작한 순간입니다. Completed는 입력이 끝난 순간입니다. 그래서 Space Bar를 누르면 점프하고, 손을 떼면 점프 입력이 끝납니다.
여기서 초보자가 자주 헷갈리는 부분이 있습니다. Input Action 이벤트에는 Started, Triggered, Completed, Canceled 같은 실행 핀이 있습니다. 처음에는 전부 외우지 않아도 됩니다.
한 번 누르는 행동:
Started사용누르고 있는 동안 계속 처리할 행동:
Triggered사용손을 뗐을 때 처리할 행동:
Completed사용
점프는 Started에 연결하면 자연스럽고, 이동과 시점 회전은 계속 값이 들어와야 하므로 Triggered를 많이 사용합니다.
Mapping Context가 캐릭터에 추가되어야 입력이 작동한다
Input Action과 Input Mapping Context를 만들었다고 해서 입력이 바로 작동하지는 않습니다. 게임이 시작될 때 플레이어에게 "이 조작표를 사용하라"고 알려 주어야 합니다. 이 과정이 Add Mapping Context입니다.
Third Person 템플릿에는 이 설정이 이미 들어 있을 수 있습니다. 그래도 구조를 이해해 두면 나중에 입력이 안 될 때 빠르게 고칠 수 있습니다.
BP_ThirdPersonCharacter의 Event BeginPlay 근처를 확인해 보세요. 보통 다음과 비슷한 흐름이 있습니다.
Event BeginPlayGet ControllerCast To PlayerControllerGet Enhanced Input Local Player SubsystemAdd Mapping ContextMapping Context에
IMC_Default지정
Enhanced Input Local Player Subsystem은 현재 로컬 플레이어의 입력 설정을 관리하는 곳입니다. 혼자 실행하는 일반적인 학습 프로젝트에서는 "내 플레이어의 입력 관리자" 정도로 이해하면 충분합니다.
Add Mapping Context 노드에는 보통 Mapping Context와 Priority 값이 있습니다. Mapping Context에는 IMC_Default를 넣습니다. Priority는 여러 조작표가 동시에 있을 때 어느 쪽을 우선할지 정하는 값입니다. 지금은 0으로 두어도 괜찮습니다.
예를 들어 평소에는 IMC_Default를 쓰고, 메뉴를 열었을 때는 IMC_Menu를 더 높은 우선순위로 추가할 수 있습니다. 하지만 첫 프로젝트에서는 하나의 기본 조작표만 사용해도 충분합니다.
키보드 키 바꾸기와 게임패드 입력 추가하기
이제 키를 바꾸는 방법을 익혀 봅시다. 예를 들어 점프 키를 Space Bar뿐 아니라 게임패드의 아래쪽 얼굴 버튼에도 연결해 보겠습니다.
Content Browser에서
IMC_Default를 엽니다.IA_Jump항목을 찾습니다.기존
Space Bar매핑은 그대로 둡니다.같은
IA_Jump아래에 새 매핑을 추가합니다.키 선택 칸에서
Gamepad Face Button Bottom을 선택합니다.저장합니다.
이제 키보드에서는 Space Bar로 점프하고, 게임패드에서는 아래쪽 얼굴 버튼으로 점프할 수 있습니다. 기능은 하나인데 입력 장치만 늘어난 것입니다.
이동도 같은 방식입니다. IA_Move에는 키보드의 W/A/S/D와 게임패드의 왼쪽 스틱을 함께 연결할 수 있습니다. 다만 키보드의 W, A, S, D는 각각 하나의 키라서 2D 방향 값으로 바꾸기 위한 Modifier가 붙어 있을 수 있습니다.
Modifier는 입력 값을 살짝 바꿔 주는 설정입니다. 예를 들어 S는 앞으로가 아니라 뒤로 가야 하므로 값을 음수로 바꿔야 합니다. 이런 변환에 Negate, Swizzle Input Axis Values 같은 Modifier가 사용됩니다. 처음에는 이름을 다 외우기보다, 기존 템플릿의 IA_Move 매핑을 복사해서 새 키에 적용하는 방식이 안전합니다.
키를 바꿀 때는 한 번에 많이 바꾸지 마세요. 하나 바꾸고 Play로 테스트한 뒤 다음 키를 바꾸는 습관이 좋습니다. 입력 문제는 작은 설정 하나 때문에 생기는 경우가 많습니다.
플래시라이트 입력 액션 만들기
이제 새 기능을 하나 추가해 보겠습니다. 어두운 구역에서 사용할 수 있는 플래시라이트를 만들고, F 키로 켜고 끄겠습니다. 나중에 동굴, 밤 스테이지, 숨은 아이템 찾기 같은 장면에 응용할 수 있습니다.
먼저 Input Action을 만듭니다.
Content Browser에서
Input폴더를 엽니다. 없다면 새로 만들어도 됩니다.빈 공간에서 우클릭합니다.
Input항목에서Input Action을 선택합니다.이름을
IA_Flashlight로 지정합니다.IA_Flashlight를 열고 값 타입을Boolean으로 둡니다.저장합니다.
플래시라이트는 누름 여부만 알면 되므로 Boolean이면 충분합니다.
다음으로 IMC_Default에 키를 연결합니다.
IMC_Default를 엽니다.새 매핑을 추가합니다.
Input Action에
IA_Flashlight를 지정합니다.키는
F로 지정합니다.게임패드도 쓰고 싶다면
Gamepad D-Pad Up또는 원하는 버튼을 추가합니다.저장합니다.
이제 행동과 키가 연결되었습니다. 하지만 아직 실제 라이트는 없습니다. 캐릭터에 라이트 컴포넌트를 추가해야 합니다.
BP_ThirdPersonCharacter를 열고 Components 패널에서 다음을 진행합니다.
FollowCamera를 선택합니다.Add버튼을 눌러Spot Light를 추가합니다.이름을
Flashlight로 바꿉니다.Flashlight가FollowCamera아래에 붙어 있는지 확인합니다.Details 패널에서
Visible을 꺼 둡니다.밝기는
Intensity, 범위는Attenuation Radius, 퍼지는 각도는Outer Cone Angle로 조절합니다.
Spot Light는 원뿔 모양으로 빛을 쏘는 조명입니다. 손전등처럼 한 방향을 비추기에 좋습니다. FollowCamera 아래에 붙이면 카메라가 보는 방향을 따라 빛도 움직입니다. 3인칭 게임에서는 캐릭터 손에 붙일 수도 있지만, 처음에는 카메라에 붙이는 방식이 테스트하기 쉽습니다.
F 키로 플래시라이트 켜고 끄기
이제 블루프린트에서 입력을 받아 라이트를 켜고 끄겠습니다.
BP_ThirdPersonCharacter의 Event Graph로 이동합니다. 빈 공간에서 우클릭하고 IA_Flashlight를 검색합니다. Enhanced Input Action 이벤트가 나오면 추가합니다.
다음 흐름을 만듭니다.
IA_Flashlight이벤트 추가Started실행 핀 사용Flashlight컴포넌트를 그래프로 드래그Toggle Visibility노드에 연결
Toggle Visibility는 보이면 끄고, 꺼져 있으면 켜는 노드입니다. 플래시라이트처럼 켜기/끄기 기능에 잘 맞습니다.
조금 더 명확하게 만들고 싶다면 Boolean 변수를 사용할 수도 있습니다.
bFlashlightOn변수를 만들고 Boolean으로 설정합니다.IA_Flashlight의Started에서bFlashlightOn값을 반대로 바꿉니다.바뀐 값을
Set Visibility의New Visibility에 연결합니다.
처음에는 Toggle Visibility 방식이 더 간단합니다. 나중에 UI에 "라이트 켜짐" 아이콘을 표시하거나 배터리 시스템을 만들고 싶다면 bFlashlightOn 변수를 사용하는 방식이 확장하기 좋습니다.
Play를 눌러 테스트해 보세요. F 키를 누를 때마다 라이트가 켜졌다 꺼져야 합니다. 너무 밝다면 Intensity를 낮추고, 너무 좁다면 Outer Cone Angle을 넓혀 보세요.
자주 막히는 부분 확인하기
입력이 작동하지 않을 때는 당황하지 말고 아래 순서대로 확인하면 됩니다.
첫째, Input Action이 Mapping Context에 들어 있는지 확인합니다. IA_Flashlight를 만들었더라도 IMC_Default에 추가하지 않으면 F 키는 아무 일도 하지 않습니다.
둘째, Mapping Context가 게임 시작 때 추가되는지 확인합니다. Add Mapping Context가 빠져 있거나, 다른 Mapping Context를 넣었다면 입력 이벤트가 실행되지 않습니다. Enhanced Input에서 가장 자주 발생하는 문제입니다. 입력 액션과 매핑 컨텍스트를 만들고 BeginPlay에서 Add Mapping Context로 등록하는 흐름은 기본 절차로 기억해 두면 좋습니다.1
셋째, 캐릭터가 실제 플레이어에게 Possess되어 있는지 확인합니다. Possess는 Controller가 Pawn이나 Character를 조종하게 되는 상태입니다. Third Person 템플릿은 보통 자동으로 되어 있지만, 직접 캐릭터를 바꾸었다면 Details 패널의 Auto Possess Player나 GameMode 설정을 확인해야 합니다.
넷째, 입력 이벤트를 잘못된 블루프린트에 만든 것은 아닌지 확인합니다. 지금 실습에서는 BP_ThirdPersonCharacter가 플레이어 캐릭터이므로 여기에 입력 이벤트를 만듭니다. 다른 Actor 블루프린트에 만들면 자동으로 실행되지 않을 수 있습니다.
다섯째, Started와 Triggered를 혼동하지 않았는지 봅니다. 플래시라이트 토글을 Triggered에 연결하면 키를 누르는 동안 여러 번 켜졌다 꺼질 수 있습니다. 켜기/끄기처럼 한 번만 실행할 기능은 Started에 연결하는 편이 안전합니다.
마지막으로 저장을 확인합니다. IA_Flashlight, IMC_Default, BP_ThirdPersonCharacter를 수정한 뒤 저장하지 않으면 테스트 결과가 예상과 다를 수 있습니다. 작업 후에는 Ctrl+S, 필요하면 Save All을 눌러 주세요.
입력 구조를 깔끔하게 유지하기
Enhanced Input을 제대로 익히면 기능을 추가할 때 프로젝트가 덜 복잡해집니다. 앞으로 만들 아이템 줍기, 문 열기, NPC와 대화하기, 공격하기, 달리기 같은 기능도 같은 방식으로 확장할 수 있습니다.
기억할 흐름은 하나입니다.
먼저 행동을 만든다:
Input Action그 행동에 키를 배정한다:
Input Mapping Context게임 시작 때 조작표를 추가한다:
Add Mapping Context캐릭터 블루프린트에서 행동 이벤트를 받아 기능을 실행한다
이번 장에서 만든 IA_Flashlight는 작은 기능이지만 중요한 연습입니다. 이제 우리는 단순히 템플릿 캐릭터를 움직이는 단계에서 벗어나, 원하는 조작을 직접 설계하고 추가할 수 있게 되었습니다. 다음 장에서는 이 입력 흐름을 활용해 아이템과 상호작용을 만들겠습니다. 플레이어가 가까이 다가가고, 키를 누르고, 아이템이 반응하는 구조로 이어집니다.
참고
1Creating a simple Input Action/Input Mapping Context in Unreal 5
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.