diff --git a/03-UnrealEngine/Gameplay/Lyra/UE5 Lyra学习笔记(8)—EnhanceInput(UE5.5).md b/03-UnrealEngine/Gameplay/Lyra/UE5 Lyra学习笔记(8)—EnhanceInput(UE5.5).md index bd42fc5..8f5a49c 100644 --- a/03-UnrealEngine/Gameplay/Lyra/UE5 Lyra学习笔记(8)—EnhanceInput(UE5.5).md +++ b/03-UnrealEngine/Gameplay/Lyra/UE5 Lyra学习笔记(8)—EnhanceInput(UE5.5).md @@ -216,7 +216,9 @@ void ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputCompo 2. AddMappingContext()的选项OptionsNotifyUserSettings设置为true,会调用UEnhancedInputUserSettings::RegisterInputMappingContext() 2. ProjectSettings - Engine - EnhancedInput - UserSettings中的Enable User Settings 3. 配置IA与IMC中的UserSetting选项。 - 1. 部分输入比如Axis2D类 + 1. 部分输入比如Axis2D这种,需要在IMC中进行设置。 +4. 默认Profile GameplayTag + 1. ## 加载按键设置逻辑 默认自动加载,载入逻辑位于UEnhancedInputUserSettings::LoadOrCreateSettings(),调用顺序是: @@ -276,4 +278,61 @@ UEnhancedInputUserSettings* UEnhancedInputUserSettings::LoadOrCreateSettings(ULo return Settings; } +``` + +## 鼠标灵敏度与反转设置实现 +参考Lyra的实现方法: +1. 通过实现2个UInputModifier。 +2. 在ULyraSettingsShared(ULocalPlayerSaveGame)存储对应的灵敏度float数据。 + 1. 可以考虑直接在UEnhancedInputUserSettings中来存储。 + +```c++ +////////////////////////////////////////////////////////////////////// +// ULyraInputModifierGamepadSensitivity +FInputActionValue ULyraInputModifierGamepadSensitivity::ModifyRaw_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue CurrentValue, float DeltaTime) +{ + // You can't scale a boolean action type + ULyraLocalPlayer* LocalPlayer = LyraInputModifiersHelpers::GetLocalPlayer(PlayerInput); + if (CurrentValue.GetValueType() == EInputActionValueType::Boolean || !LocalPlayer || !SensitivityLevelTable) + { + return CurrentValue; + } + + ULyraSettingsShared* Settings = LocalPlayer->GetSharedSettings(); + ensure(Settings); + + const ELyraGamepadSensitivity Sensitivity = (TargetingType == ELyraTargetingType::Normal) ? Settings->GetGamepadLookSensitivityPreset() : Settings->GetGamepadTargetingSensitivityPreset(); + + const float Scalar = SensitivityLevelTable->SensitivtyEnumToFloat(Sensitivity); + + return CurrentValue.Get() * Scalar; +} + +////////////////////////////////////////////////////////////////////// +// ULyraInputModifierAimInversion +FInputActionValue ULyraInputModifierAimInversion::ModifyRaw_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue CurrentValue, float DeltaTime) +{ + ULyraLocalPlayer* LocalPlayer = LyraInputModifiersHelpers::GetLocalPlayer(PlayerInput); + if (!LocalPlayer) + { + return CurrentValue; + } + + ULyraSettingsShared* Settings = LocalPlayer->GetSharedSettings(); + ensure(Settings); + + FVector NewValue = CurrentValue.Get(); + + if (Settings->GetInvertVerticalAxis()) + { + NewValue.Y *= -1.0f; + } + + if (Settings->GetInvertHorizontalAxis()) + { + NewValue.X *= -1.0f; + } + + return NewValue; +} ``` \ No newline at end of file