// Copyright Epic Games, Inc. All Rights Reserved. #include "UI/LyraSimulatedInputWidget.h" #include "Engine/LocalPlayer.h" #include "EnhancedInputSubsystems.h" #include "EnhancedPlayerInput.h" #include "InputAction.h" #include "LyraLogChannels.h" #define LOCTEXT_NAMESPACE "LyraSimulatedInputWidget" ULyraSimulatedInputWidget::ULyraSimulatedInputWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { SetConsumePointerInput(true); } #if WITH_EDITOR const FText ULyraSimulatedInputWidget::GetPaletteCategory() { return LOCTEXT("PalleteCategory", "Input"); } #endif // WITH_EDITOR void ULyraSimulatedInputWidget::NativeConstruct() { // TODO: We should query the key the simulate whenever the user rebinds a key and after the PlayerController has // had it's input initalized. Doing it here will always result in the fallback key being used because // the PC does not have any keys mapped in enhanced input. QueryKeyToSimulate(); Super::NativeConstruct(); } FReply ULyraSimulatedInputWidget::NativeOnTouchEnded(const FGeometry& InGeometry, const FPointerEvent& InGestureEvent) { FlushSimulatedInput(); return Super::NativeOnTouchEnded(InGeometry, InGestureEvent); } UEnhancedInputLocalPlayerSubsystem* ULyraSimulatedInputWidget::GetEnhancedInputSubsystem() const { if (APlayerController* PC = GetOwningPlayer()) { if (ULocalPlayer* LP = GetOwningLocalPlayer()) { return LP->GetSubsystem(); } } return nullptr; } UEnhancedPlayerInput* ULyraSimulatedInputWidget::GetPlayerInput() const { if (UEnhancedInputLocalPlayerSubsystem* System = GetEnhancedInputSubsystem()) { return System->GetPlayerInput(); } return nullptr; } void ULyraSimulatedInputWidget::InputKeyValue(const FVector& Value) { if (UEnhancedPlayerInput* Input = GetPlayerInput()) { if(KeyToSimulate.IsValid()) { FInputKeyParams Params; Params.Delta = Value; Params.Key = KeyToSimulate; Params.NumSamples = 1; Params.DeltaTime = GetWorld()->GetDeltaSeconds(); Params.bIsGamepadOverride = KeyToSimulate.IsGamepadKey(); Input->InputKey(Params); } } else { UE_LOG(LogLyra, Error, TEXT("'%s' is attempting to simulate input but has no player input!"), *GetNameSafe(this)); } } void ULyraSimulatedInputWidget::InputKeyValue2D(const FVector2D& Value) { InputKeyValue(FVector(Value.X, Value.Y, 0.0)); } void ULyraSimulatedInputWidget::FlushSimulatedInput() { if (UEnhancedPlayerInput* Input = GetPlayerInput()) { Input->FlushPressedKeys(); } } void ULyraSimulatedInputWidget::QueryKeyToSimulate() { if (UEnhancedInputLocalPlayerSubsystem* System = GetEnhancedInputSubsystem()) { TArray Keys = System->QueryKeysMappedToAction(AssociatedAction); if(!Keys.IsEmpty() && Keys[0].IsValid()) { KeyToSimulate = Keys[0]; } else { KeyToSimulate = FallbackBindingKey; } } } #undef LOCTEXT_NAMESPACE