The problem here is “CommonActivatableWidget”.
It sets the game input mode on activation.
Extending the class as they did in Lyra is a workaround for this.
h file:
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CommonActivatableWidget.h"
#include "LyraActivatableWidget.generated.h"
struct FUIInputConfig;
UENUM(BlueprintType)
enum class ELyraWidgetInputMode : uint8
{
Default,
GameAndMenu,
Game,
Menu
};
// An activatable widget that automatically drives the desired input config when activated
UCLASS(Abstract, Blueprintable)
class ULyraActivatableWidget : public UCommonActivatableWidget
{
GENERATED_BODY()
public:
ULyraActivatableWidget(const FObjectInitializer& ObjectInitializer);
public:
//~UCommonActivatableWidget interface
virtual TOptional<FUIInputConfig> GetDesiredInputConfig() const override;
//~End of UCommonActivatableWidget interface
#if WITH_EDITOR
virtual void ValidateCompiledWidgetTree(const UWidgetTree& BlueprintWidgetTree, class IWidgetCompilerLog& CompileLog) const override;
#endif
protected:
/** The desired input mode to use while this UI is activated, for example do you want key presses to still reach the game/player controller? */
UPROPERTY(EditDefaultsOnly, Category = Input)
ELyraWidgetInputMode InputConfig = ELyraWidgetInputMode::Default;
/** The desired mouse behavior when the game gets input. */
UPROPERTY(EditDefaultsOnly, Category = Input)
EMouseCaptureMode GameMouseCaptureMode = EMouseCaptureMode::CapturePermanently;
};
cpp file:
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LyraActivatableWidget.h"
#include "Editor/WidgetCompilerLog.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraActivatableWidget)
#define LOCTEXT_NAMESPACE "Lyra"
ULyraActivatableWidget::ULyraActivatableWidget(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
TOptional<FUIInputConfig> ULyraActivatableWidget::GetDesiredInputConfig() const
{
switch (InputConfig)
{
case ELyraWidgetInputMode::GameAndMenu:
return FUIInputConfig(ECommonInputMode::All, GameMouseCaptureMode);
case ELyraWidgetInputMode::Game:
return FUIInputConfig(ECommonInputMode::Game, GameMouseCaptureMode);
case ELyraWidgetInputMode::Menu:
return FUIInputConfig(ECommonInputMode::Menu, EMouseCaptureMode::NoCapture);
case ELyraWidgetInputMode::Default:
default:
return TOptional<FUIInputConfig>();
}
}
#if WITH_EDITOR
void ULyraActivatableWidget::ValidateCompiledWidgetTree(const UWidgetTree& BlueprintWidgetTree, class IWidgetCompilerLog& CompileLog) const
{
Super::ValidateCompiledWidgetTree(BlueprintWidgetTree, CompileLog);
if (!GetClass()->IsFunctionImplementedInScript(GET_FUNCTION_NAME_CHECKED(ULyraActivatableWidget, BP_GetDesiredFocusTarget)))
{
if (GetParentNativeClass(GetClass()) == ULyraActivatableWidget::StaticClass())
{
CompileLog.Warning(LOCTEXT("ValidateGetDesiredFocusTarget_Warning", "GetDesiredFocusTarget wasn't implemented, you're going to have trouble using gamepads on this screen."));
}
else
{
//TODO - Note for now, because we can't guarantee it isn't implemented in a native subclass of this one.
CompileLog.Note(LOCTEXT("ValidateGetDesiredFocusTarget_Note", "GetDesiredFocusTarget wasn't implemented, you're going to have trouble using gamepads on this screen. If it was implemented in the native base class you can ignore this message."));
}
}
}
#endif
#undef LOCTEXT_NAMESPACE
EDIT: Also, you can add a “false” to the end of the inputconfig function calls (its true by default) if you don’t want the mouse disappearing on capture.