향상된 입력 시스템

이 페이지는 작업 중입니다.

언리얼 엔진 5는 향상된 입력 시스템을 도입하여 게임이 사용자 입력을 처리하는 데 도움을 줍니다. 새티스팩토리는 이 시스템을 확장하여 게임의 설정 메뉴에서 모드 키 할당을 자동으로 감지하고 기본 게임의 컨텍스트와 자동으로 통합할 수 있도록 합니다.

언리얼 엔진 문서는 시스템에 대한 좋은 개요를 제공하며, 먼저 해당 페이지를 읽는 것이 좋습니다. 하지만 새티스팩토리의 버전과 올바르게 접촉하기 위해 몇 가지 추가 단계가 필요합니다.

소개

향상된 입력 시스템은 언리얼의 기존 입력 시스템과 달리 데이터를 기반으로 합니다. 플레이어가 취할 수 있는 행동은 입력 액션 데이터 애셋에 정의되며, 입력 매핑 컨텍스트 데이터 애셋은 액션을 상황에 따라 그룹화하고 어떻게 발동되는지에 대한 정보를 제공합니다.

게임 플레이 중에 여러 입력 매핑 컨텍스트가 동적으로 추가되거나 제거되어 플레이어의 입력을 처리하고 실제 키보드 및 마우스 입력에 따라 어떤 입력 액션을 실행할지 결정합니다.

예를 들어, 기본 게임에는 걷거나 기차를 운전하는 제어가 있습니다. 앞으로 걷고 기차의 속도를 조절하는 것은 일반적으로 W 키에 할당되어 있습니다. 그렇다면 플레이어가 W를 누를 때 게임은 어떻게 해야 할까요? 향상된 입력 시스템은 어떤 매핑 컨텍스트가 활성화되어 있는지와 그 우선 순위를 확인하여 결정합니다. 걷기와 기차 속도 조절을 위한 별도의 입력 액션이 존재합니다. 걷는 행동은 MC_PlayerMovement 매핑 컨텍스트에 포함되어 있고, 기차 속도를 조절하는 행동은 MC_Trains 에 포함되어 있습니다. MC_Trains 컨텍스트는 플레이어가 기차에 탑승할 때만 적용되며, 기차에서 내릴 때 제거됩니다.

플레이어가 W를 누르면 향상된 입력 시스템은 우선 순위에 따라 컨텍스트를 확인합니다. MC_Trains 가 활성화되어 있으면 속도 조절 액션이 실행되고, MC_PlayerMovement 가 활성화되어 있으면 걷기 액션이 대신 실행됩니다.

실제 게임에서는 훨씬 더 많은 컨텍스트와 액션이 작용하며, 플레이어 이동 컨텍스트가 차량에 탑승하는 동안 실제로 제거될 수 있습니다. 어쨌든 이 예제가 시스템이 어떻게 작동하는지에 대한 아이디어를 제공하길 바랍니다.

조직

향상된 입력 시스템의 기존 구조는 컨텍스트와 함께 입력 액션을 애셋을 폴더에 저장하는 데 적합합니다. 기본 게임의 입력 액션과 컨텍스트는 대부분 /FactoryGame/Inputs//FactoryGame/Interface/UI/Inputs/ 에 저장됩니다. 모드가 자신의 컨텍스트를 어떻게 구성해야 하는지에 대한 영감을 얻으려면 이러한 폴더를 살펴보십시오.

입력 액션

입력 액션 애셋은 블루프린트를 통해 생성할 수 있습니다. 고급 애셋 생성 > 입력 > 입력 액션 을 콘텐츠 브라우저 창에서 선택합니다. C‍+‍+에서 이를 생성하는 방법은 언리얼 문서에 설명되어 있습니다.

입력 액션은 어떤 키에 할당되었는지에 대한 정의가 없다는 점을 유의하십시오. 그 정보는 그들이 있는 컨텍스트에 의해 설정됩니다.

"액션 설명" 텍스트는 사용자가 설정 메뉴에서 할당 위에 마우스를 올릴 때 나타납니다. "입력 소비"는 특별한 이유가 없다면 false로 설정해야 하며, 이는 관련 컨텍스트에 액션이 더 높은 우선 순위를 가질 경우 이 키에 대한 다른 할당이 작동하지 않도록 방지합니다.

표준 '키 누르기’는 일반적으로 Digital (bool)의 값 타입을 가지며, 눌림해제됨에 대한 트리거가 있으며 한계치는 0.5입니다. 기본 게임의 입력 액션을 살펴보면 다른 예제를 확인할 수 있습니다.

입력 매핑 컨텍스트

새티스팩토리는 일부 언리얼 입력란 대신 입력 매핑 컨텍스트에 추가 기능을 추가합니다.

입력 매핑 컨텍스트는 FGInputMappingContext 유형이어야 하며 InputMappingContext 가 아닙니다. 블루프린트에서 이를 생성하려면 고급 애셋 생성 > 기타 > 데이터 애셋 을 사용하고 FGInputMappingContext 를 검색해야 합니다. 또는 기존 매핑 컨텍스트를 복사하고 자신의 용도로 비워둘 수 있습니다. 예를 들어, 기본 게임에서 하나를 복사하거나 ExampleMod에서 복사할 수 있습니다. C‍+‍+에서 이를 생성하는 방법은 언리얼 문서에 설명되어 있지만, 앞서 언급한 새티스팩토리 전용 부모 클래스를 사용하도록 조정해야 합니다.

다시 말하지만, InputMappingContext 가 아닌 FGInputMappingContext 를 사용하고 있는지 확인하십시오!

입력 매핑 컨텍스트는 매핑 필드에 모든 관련 입력 액션을 제공해야 하며, 각 액션에 대한 기본 키를 할당할 수 있는 곳이기도 합니다. 나열한 각 입력 액션에 대해 다음을 수행해야 합니다:

  • "플레이어 매핑 가능 여부"를 활성화하십시오(사용자가 재할당하는 것을 막기 위함이 아니라면, 99%의 상황에서는 그래야 합니다).

  • "플레이어 매핑 가능 옵션"에서:

  • "이름"을 제공하십시오. 그렇지 않으면 할당이 사용자 편집 가능하지 않으며, 표시 이름을 찾으려 할 때 실패합니다.

  • "표시 이름"을 설정하십시오. 이는 사용자가 설정 메뉴에서 액션을 보거나 검색할 때 나타나는 텍스트입니다.

  • 참고: 여기서 "디스플레이 카테고리" 필드는 새티스팩토리에 의해 무시됩니다.

새티스팩토리는 (두 번째) "매핑" 범주에서 입력 매핑 컨텍스트에 맞춤 입력란을 추가합니다.

  • "Display Name"은 설정 메뉴에서 액션이 그룹화되는 섹션 제목의 이름입니다. 이는 일반적으로 모드의 사용자 친화적인 이름이어야 합니다.

  • "Menu Priority"는 범주의 재정렬을 허용하는 것으로 보이지만, 모든 기본 게임 컨텍스트에 대해 0.0이며 테스트되지 않았습니다.

  • "Parent Context"는 아래에서 자세히 설명합니다.

입력 액션이 컨텍스트에 추가되고 컨텍스트가 적절하게 형식화되면 설정 메뉴에 나타납니다. 액션이나 컨텍스트를 다른 곳에 등록할 필요는 없습니다.

모드에 상대적으로 적은 수의 키 할당이 있는 경우, 모드에는 아마도 하나 또는 두 개의 컨텍스트만 있을 것입니다: 플레이어가 정상적으로 이동할 때 적용되는 하나와 사용자 인터페이스에 있을 때 적용되는 하나입니다.

부모 컨텍스트

부모 컨텍스트는 모드에서 사용할 수 있는 새티스팩토리의 기능입니다. 기본 게임과 함께 제공되는 기존 컨텍스트에 자신의 액션을 추가할 수는 없지만, 대신 자신의 컨텍스트에 대한 부모 컨텍스트를 지정할 수 있습니다. 게임에서 부모로 지정한 컨텍스트가 적용되면, 우리의 컨텍스트도 적용되며, 부모 컨텍스트가 제거되면 그 반대도 마찬가지입니다.

컨텍스트를 사용 가능하게 하려면:

  • 매 번, 상호작용 위젯(예: 인벤토리)에서도 사용 가능하게 하려면 MC_PlayerController를 사용하십시오. 주의하십시오! 이 컨텍스트를 사용하면 나열된 액션에 대해 입력 소비가 활성화되어서는 안 되며, 그렇지 않으면 다른 키 할당이 작동하지 않게 됩니다.

  • 플레이어가 건물 및 보유 장비와 상호작용할 수 있는 상황은 MC_PlayerActions를 사용하십시오.

  • 플레이어가 건물 상호작용 위젯에 있는 상황은 MC_UserInterfaceBase를 사용하십시오.

  • 플레이어가 인벤토리에 있는 상황은 MC_Window를 사용하십시오.

  • 특정 조건에서, 예를 들어 빌드건이 특정 모드로 열려 있을 때, 기존 컨텍스트를 살펴보고 가장 적합한 것을 선택하십시오.

  • 더 구체적인 조건은 수동 매핑 컨텍스트 등록을 사용할 수 있습니다.

입력 액션에 대한 코드 응답

사용자 코드는 서브시스템과 같은 액터, 위젯 또는 단순 구성 스크립트(SCS) 훅을 통해 연결된 플레이어 캐릭터 또는 컨트롤러의 맞춤 액터 컴포넌트 중 하나에서 입력 작업에 응답하는 것이 좋습니다.

일부 액터(예: 서브시스템)에서는 Player Controller Instance > EnableInput을 호출해야 사용자 입력을 처리할 수 있습니다.

블루프린트

입력 액션에 응답하기 위한 블루프린트 이벤트 노드를 생성하려면, 블루프린트 액션 선택기에서 "컨텍스트에 따라"를 끄고 검색 결과에 나타나도록 해야 할 수 있습니다.

입력 액션의 이름을 입력하여 해당 이벤트 노드를 생성하십시오.

C‍+‍+

언리얼 문서는 C‍+‍+에서 입력 액션에 응답하는 방법을 설명합니다. 단, 플레이어 컨트롤러에 대한 제어가 있다고 가정하는데, 모더는 그렇지 않습니다. 다행히도 커피 스테인은 모드가 할당할 수 있는 AFGCharacterPlayer::OnPlayerInputInitialized 델리게이트를 생성했습니다. SetupPlayerInputComponent 가 호출될 때마다 델리게이트가 호출되어 맞춤 입력을 등록할 기회를 제공합니다.

게임 플레이 태그

입력 액션이 많을 경우, 게임 플레이 태그를 사용하여 이를 참조하는 것이 유용할 수 있습니다.

이를 사용하려면, C‍+‍+에서 TMap<FGameplayTag, UInputAction*> 를 포함하는 맞춤 GameInstanceModule 클래스를 생성하고, 이 새로운 클래스를 "실제" GameInstanceModule 블루프린트 자산의 부모로 사용하십시오:

// 포함된 부분 생략

UCLASS(Blueprintable)
class MYMOD_API UMyModGameInstanceModule : public UGameInstanceModule {
    GENERATED_BODY()
public:
    UPROPERTY(EditDefaultsOnly, Category = "Advanced | Input")
    TMap<UInputAction*, FGameplayTag> InputActionTagBindings;
};

추가 블루프린트 코드를 이 애셋에 추가하는 경우, super 함수 호출을 추가해야 합니다. 그런 다음 할당을 사용하려면 다음과 같이 합니다:

UGameInstance* GameInstance = GetWorld()->GetGameInstance(); // 사용하는 클래스에 따라 다를 수 있습니다.
UGameInstanceModuleManager* GameInstanceModuleManager = GameInstance->GetSubsystem<UGameInstanceModuleManager>();
UMyModGameInstanceModule* MyModGameInstanceModule = Cast<UMyModGameInstanceModule>(GameInstanceModuleManager ->FindModule(TEXT("MyMod")));
EnhancedInputComponent->BindAction(MyModGameInstanceModule->InputActionTagBindings[FGameplayTag::RequestGameplayTag(TEXT("Tag.Name"))], ETriggerEvent::Triggered, this, &Class::Function);

입력 액션 정보 읽기

사용자에게 표시할 입력 액션에 할당된 키의 이름을 검색하려면, 플레이어 컨트롤러 인스턴스에서 FGInputLibrary 함수 Get Input Action Name as Text 를 호출하고, 그 액션의 매핑 컨텍스트에서 주어진 이름을 전달합니다. 이것은 자동으로 다중 키 할당을 처리하고 왼쪽 Alt + Q 와 같은 결합 형식으로 표시합니다. 매핑 컨텍스트가 호출 시 등록되지 않은 경우 UNKNOWN_KEY() 를 반환합니다.

입력 액션에 관련된 정확한 키 구조를 검색해야 하는 경우, 플레이어 컨트롤러 인스턴스에서 FGInputLibrary 함수 Get Current Mapping for Action 을 호출하고, 그 액션의 매핑 컨텍스트에서 주어진 이름을 전달합니다. 성공/실패 상태에 대한 부울 반환 값을 확인해야 합니다.

수동 매핑 컨텍스트 등록

컨텍스트를 등록하는 주요 방법은 일반적으로 부모 컨텍스트 시스템을 통해 이루어지지만, 컨텍스트 등록을 수동으로 관리하는 것도 가능합니다.

EnhancedInputLocalPlayerSubsystem에 대한 참조를 얻으려면 플레이어 컨트롤러 인스턴스에서 Get 노드를 사용하십시오. 그런 다음 AFGPlayerController::SetMappingContextBound 를 호출하여 컨텍스트가 적용되는 시점을 제어할 수 있습니다.

Add Mapping Context 또는 Remove Mapping Context를 사용해서는 안 됩니다. 이것은 새티스팩토리의 부모 컨텍스트 시스템과 상호작용하지 않기 때문에, 설명된 대로 컨텍스트를 확장할 수 없습니다.

연속 입력 액션

TODO: D4rk한테 물어봐서 Ctrl/Alt/Shift + 키 알아내기

사용자 인터페이스에서 입력 처리

때로는 모드된 사용자 인터페이스는 위젯이 활성화되어 있을 때 추가 액션을 할당해야 합니다. 이에 대한 예는 기본 게임의 작업대 UI입니다. 이 UI는 스페이스 바를 누르고 있을 때 제작 버튼을 누르는 것과 할당합니다.

위젯이 열려 있을 때 사용할 컨텍스트와 액션을 위한 컨텍스트를 생성하십시오. 모드된 인터페이스 위젯이 Widget Usable Base를 확장하는 한, 컨텍스트 관리는 자동으로 처리됩니다. 위젯의 mInputMappingContexts 입력란에 MC_UserInterfaceBase 컨텍스트와 맞춤 컨텍스트를 지정하고 mInputGateDelayOpen 을 활성화하십시오.

이에 대한 예는 ExampleMod의 Widget_InputExample 에서 찾을 수 있습니다.

Destruct 메서드를 오버라이드하는 경우, 위젯이 올바르게 입력 컨텍스트를 등록 해제하도록 부모 구현을 호출하는지 확인하십시오!

모드된 인터페이스가 Widget Usable base를 확장하지 않는 경우 수동으로 컨텍스트 등록을 관리해야 하거나, 서브시스템에서 입력을 처리해야 하거나, MC_PlayerController 부모 컨텍스트를 사용하여 컨텍스트를 항상 등록하고 추가 조건에 따라 입력을 처리할지 여부를 결정해야 합니다.

디버깅

불행히도 매우 유용한 showdebug enhancedinput 콘솔 명령어는 언리얼 문서에 설명된 대로 배포 빌드에서는 사용할 수 없습니다. 하지만 showdebug INPUT 명령어는 사용 가능하며, 적용된 매핑 컨텍스트와 같은 정보를 줄임없이 표시합니다.