향상된 입력
향상된 입력(Enhanced Input)은 에픽게임즈에서 만든 자체 플러그인으로, 패럿에서 사용됩니다. 언리얼 엔진 5 최신 버전을 사용 중이라면 기본적으로 활성화되어 있을 것입니다. 편집(Edit) > 플러그인(Plugins)으로 이동하여 체크박스 선택을 통해 해당 플러그인이 활성화되어 있는지 확인할 수 있습니다.
향상된 입력은 언리얼 엔진의 디폴트 입력 시스템을 대체하며, 복잡한 입력 처리 또는 런타임 컨트롤 리매핑에 대한 표준입니다. 에픽게임즈의 공식 문서에는 입력 에셋을 구성하는 방법과 함께 이 시스템에 대한 개요가 잘 정리되어 있습니다.
핵심 개념
공식 문서를 다시 한번 요약하자면, 향상된 입력에서 이해해야 할 핵심 개념은 다음과 같습니다.
입력 액션(Input Actions)
입력 매핑 컨텍스트(Input Mapping Contexts, IMC)
입력 모디파이어(Input Modifiers)
입력 트리거(Input Triggers)
Unity의 새로운 입력 시스템을 사용해 봤다면 이러한 개념이 익숙할 것입니다.
입력 액션은 게임의 특정 컨텍스트에서 '게임에서 수행될 액션'이라고 생각하면 이해하기 쉽습니다. 예를 들어, 캐릭터가 자동차를 타고 있다면 '가속' 또는 '브레이크' 액션이 필요할 수 있습니다.
입력 매핑 컨텍스트에도 이 예시가 적용됩니다. 플레이어가 차에 타거나 내릴 때, 특정 키나 게임패드 버튼의 기능을 변경하고 싶을 수 있습니다.
입력 트리거는 모든 트리거 조건이 충족될 때까지 액션이 실행되지 않도록 합니다. 예를 들어, 플레이어가 일정 시간 동안 버튼을 누르고 있으면 동작이 트리거되도록 할 수 있습니다.
입력 모디파이어는 입력 자체의 값을 변경합니다. 데드 존(Dead Zones)은 원시 입력값을 완화하는 데 흔히 사용되는 입력 모디파이어입니다. 향상된 입력을 사용하면 몇 가지 구성만으로 이러한 문제가 모두 해결됩니다.
패럿의 예를 살펴보겠습니다. Content/Input/Gameplay 아래에 Actions 폴더와 IMC_Gameplay 에셋 파일이 있습니다. Actions 폴더에서 IA_Jump 에셋을 찾습니다.
여기서 값 타입은 이 작업의 출력 타입을 나타내는 디지털(부울)(Digital (bool))입니다. 트리거에는 다음과 같은 타입이 있습니다.
Pressed
Released
이 입력 액션을 보면 어떤 키나 버튼이 매핑되든 누르면 트리거되어야 하고 출력 상태는 부울임을 알 수 있습니다. 버튼을 놓으면 액션 종료가 트리거됩니다. 여기서 또 하나 중요한 점은 트리거와 모디파이어 모두 입력 매핑 컨텍스트에 의해 오버라이드될 수 있다는 것입니다. 게임플레이 입력 매핑 컨텍스트를 살펴보고 실제로 모디파이어 오버라이드가 어떻게 이루어지는지 확인해 보겠습니다.
IA_MoveAxis에는 트리거가 설정되어 있지 않으므로 이 경우 게임패드 왼쪽 썸스틱의 X축 값은 변경이 탐지되는 즉시 읽힙니다. 원시 입력값을 완화하기 위해 데드 존 모디파이어를 사용하여 입력 상한과 하한을 설정합니다.
IMC에서 오버라이드를 제공하지 않는 예로는 점프 매핑이 있습니다.
여기서는 트리거가 입력 액션 자체에서 발생하므로 매핑에 트리거를 정의할 필요가 없습니다. 세팅도 액션에서 상속되지만, 이 내용은 리매핑 섹션에서 다룰 예정이므로 지금은 무시해도 됩니다.
향상된 입력 이벤트 리스너
이제 에셋을 구성했으니, 런타임에 사용하기 위한 추가 구성이 필요합니다. 패럿에서는 향상된 입력 로컬 플레이어 서브시스템(Enhanced Input Local Player Subsystem)에 바인딩하여 BP_ParrotPlayerController에서 이벤트 리스너를 구성합니다. BeginPlay 노드에서 IMC_Gameplay에 대한 매핑 컨텍스트를 추가합니다.
이 경우 우선순위 파라미터가 중요합니다. 입력 매핑 컨텍스트는 우선순위에 따라 평가되므로 컨텍스트를 레이어링할 때 이를 염두에 두어야 합니다. 지금은 게임플레이 컨텍스트만 사용하겠습니다.
나중에 런타임 입력 리매핑을 위해 필요하므로, 여기서 사용자 세팅 노티파이(Notify User Settings) 파라미터가 true로 설정되어 있는지 확인하세요.
매핑 컨텍스트가 준비되었으므로 이제 원하는 액션에 향상된 입력 이벤트 노드를 추가하기만 하면 됩니다. 다음은 점프의 예시입니다.
이 액션은 플레이어가 버튼을 누르면 시작되고 플레이어가 버튼을 놓으면 완료됩니다. BP_ParrotPlayerController의 나머지 입력 액션을 살펴보면 다른 입력 타입이 처리되는 방식을 확인할 수 있습니다. 원한다면 C++로 입력 이벤트를 바인딩할 수도 있는데, 이에 대한 내용은 공식 문서에서 다루고 있습니다.
런타임 입력 리매핑
향상된 입력에는 입력 액션에 바인딩된 키를 런타임에 리매핑하는 기능이 있습니다. 이 기능은 작동하긴 하지만 아직 실험단계이므로 이 기능을 포함하여 출시할 때는 주의하는 것이 좋습니다. 패럿에는 플레이어가 키를 리매핑할 수 있는 키 바인딩 화면이 있습니다. 이를 구현하기 위해 향상된 입력 기능을 에픽게임즈의 범용 UI 플러그인과 결합하여 화면의 위젯에 올바른 메타데이터를 제공합니다. 범용 UI 구성은 유저 인터페이스 문서에서 다루고 있으니, 해당 섹션을 읽은 다음 진행하시기를 바랍니다. 해당 플러그인을 구성하면 플랫폼별 UI 엘리먼트를 표시할 수도 있습니다.
먼저 프로젝트 세팅에서 향상된 입력에 대한 사용자 세팅(User Settings)을 활성화합니다. 이 세팅은 편집(Edit) > 프로젝트 세팅(Project Settings) > 엔진(Engine) > 향상된 입력(Enhanced Input)에 있습니다. 세팅을 다음과 같이 설정합니다.
다음으로, 입력 액션 에셋으로 이동하여 플레이어 매핑 가능 키 세팅(Player Mappable Key Settings)을 조정합니다. 이름(Name) 필드는 모든 입력 액션에 걸쳐 고유해야 합니다. 표시명(Display Name) 및 카테고리(Category)는 패럿에서 현지화됩니다.
IMC에서 키를 정의할 때 플레이어 매핑 가능 키 세팅을 오버라이드할 수도 있습니다. 게임플레이 IMC의 점프 액션의 경우, 이 세팅을 'Inherit Settings from Action'으로 설정해 두었으므로 별도로 변경할 필요는 없습니다.
플레이어 컨트롤러 블루프린트에 입력 매핑 컨텍스트를 추가할 때 사용자 세팅 노티파이(Notify User Settings) 파라미터가 true로 설정되어 있는지 확인합니다.
다음 파트에서는 향상된 입력 액션을 범용 UI와 연결하는 방법에 대해 설명합니다. 패럿의 입력 리매핑에 필요한 사항을 다루기는 하겠지만, 이 문서는 공식 범용 UI 퀵스타트 가이드에 대한 보완 자료입니다.
다음 단계로 Content/Input/UI 아래에 새로운 IMC: IMC_UI_Generic을 생성했습니다.
각 입력 액션에 플레이어 매핑 가능 키 세팅 필드를 설정하고 적절한 UI 메타데이터 데이터 에셋을 가리키도록 해야 합니다. 다음은 일반적인 수락(Accept) 입력 액션 및 메타데이터 에셋 자체에 대한 예시입니다.
이러한 IMC 및 입력 액션은 범용 UI가 UI 내비게이션에 의해 호출된 액션을 파악하는 데 필요합니다. 일반적인 수락(Accept) 및 뒤로 가기(Back) 입력 액션이 대표적인 예인데, 이러한 액션은 플레이어가 UI 화면을 탐색할 때 항상 호출해야 하기 때문입니다. 이러한 매핑은 CommonUIInputData의 서브클래스인 범용 UI 전용 데이터 블루프린트에서 정의합니다.
그런 다음, 편집(Edit) > 프로젝트 세팅(Project Settings) > 일반 입력 세팅(Common Input Settings)에서 입력 데이터를 일반 입력 데이터 블루프린트로 설정합니다.
중요한 필드를 설정했으니 위젯 화면 설정으로 넘어갈 수 있습니다. 스태틱 화면에는 기본 패럿 화면을, 그 외의 화면에는 활성화 가능한 화면을 사용하여 시작합니다. 스태틱 화면은 UI 내비게이션에 대해 걱정할 필요가 없는 HUD와 같은 화면입니다. 활성화 가능한 화면의 예로는 일시정지 메뉴를 들 수 있는데, 이 메뉴는 뒤로 가기 버튼이 눌린 시점을 알아야 하고 게임 레이아웃의 메뉴 레이어에 존재하기 때문입니다.
화면 계층구조는 유저 인터페이스 문서에서 다루고 있지만, 참조할 수 있도록 여기서도 반복해서 다룹니다.
BP 화면의 클래스 디폴트에서 선택적 입력 매핑 컨텍스트를 설정합니다. 이 입력 매핑 컨텍스트는 위젯을 활성화/비활성화할 때 적용되며 클래스별로 오버라이드할 수 있습니다.
UParrotActivatableScreen에는 뒤로 가기 액션을 처리하기 위한 구현이 포함되어 있습니다. 이를 사용하는 파생 블루프린트의 이벤트 그래프에서 IA_UI_GenericBack 이벤트 리스너를 정의합니다. 또한, 디테일(Details) 패널에서 백 핸들러 여부(Is Back Handler) 체크박스도 활성화해야 합니다.
다양한 화면 위젯에서 뒤로 가기 패턴이 사용되는 방식을 확인하려면 C++ 클래스 및 BP의 코멘트를 참조하세요.
베이스 클래스에 대해 설명했으니 이제 키 바인딩 화면을 살펴보겠습니다. WBP_KeyBindingsScreen은 Content/UI/Widgets/Screens 아래에 있습니다. 이벤트 그래프를 직접 검토하여 사용자 세팅(User Settings) 및 키 프로파일(Key Profile)을 쿼리하여 향상된 입력에서 플레이어 키 매핑(Player Key Mapping) 타입을 가져오는 방법을 확인해 보는 것이 좋습니다. 이 데이터는 WBP_InputSelectorBox 위젯을 추가하고 채우는 데 사용됩니다. WBP_InputSelectorBox 위젯 안에는 두 개의 W_ParrotInputSelector 위젯이 있습니다.
하나는 게임패드 입력에 사용되고 다른 하나는 키보드 입력에 사용됩니다. 패럿 입력 선택기(Parrot Input Selector)는 내장된 입력 선택기 위젯에서 영감을 받아 만든 커스텀 위젯입니다. 이 두 위젯은 모두 선택 스테이트로 진입하여 입력을 기다린 다음 디스플레이를 업데이트합니다.
마우스 및 키보드의 경우, 향상된 입력 서브시스템에서 반환된 텍스트로 작업하고 디스플레이를 업데이트합니다.
게임패드 구현은 범용 UI에 의존하여 컨트롤러별 이미지를 쿼리합니다. 이 경우에는
Content/Input/UI/Platform아래CommonInput_Gamepad_Xbox라는 Xbox 이미지용 이미지를 구성합니다. 이 클래스는UCommonInputBaseControllerData에서 파생됩니다.
이 클래스에서 파생하여 입력 키를 이미지가 있는 브러시에 매핑할 수 있습니다. 다음으로, 편집(Edit) > 프로젝트 세팅(Project Settings) > 일반 입력 세팅(Common Input Settings)에서 컨트롤러 데이터를 구성한 후 플랫폼으로 이동합니다.
해당 데이터가 연결되면 나머지 작업은 위젯에서 이루어집니다. UParrotInputSelector 및 WBP_InputSelectorBox의 코드와 코멘트를 살펴보면 정확히 어떻게 향상된 입력 및 범용 UI 서브시스템을 사용하여 리매핑 기능이 작동하는지 정확히 알 수 있을 것입니다.
마지막으로 강조해야 할 중요한 기능은 매핑된 키가 저장되는 방식입니다. 이 저장 작업은 WBP_KeyBindingsScreen의 SaveKeyMappings에서 수행됩니다. 이 함수는 모든 선택기 박스 위젯에 걸쳐 반복작업한 다음, 사용자 세팅에 내장된 Apply Settings 및 Save Settings 함수를 사용합니다. Save Settings는 세이브 게임 파일인 EnhancedInputUserSettings.sav를 디스크에 기록합니다. 이 파일은 Project Directory > Parrot > Saved-SaveGames 아래에 있습니다.
모든 것이 제대로 구성되었다면 키 바인딩 화면이 작동할 것입니다!
오른쪽 하단에 키가 리매핑될 때 업데이트되는 액션 위젯이 있는 것을 볼 수 있을 것입니다. 이 위젯은 WBP_ParrotGamepadActionWidget이며 Content/UI/Widgets/Common 아래에 있습니다. 이 위젯은 앞서 생성한 일반 입력 데이터를 사용하여 입력 액션에 따라 플랫폼별 아이콘을 표시하도록 빌드된 범용 UI의 UCommonActionWidget 클래스를 적극 활용합니다. 범용 UI를 활용하면 게임의 향상된 입력 액션을 참조하는 새 위젯을 필요에 따라 쉽게 생성할 수 있습니다.