# 71 — SS_SettingsManager ## Blueprint Spec — UE 5.5–5.7 --- ### Parent Class `GameInstanceSubsystem` ### Dependencies - [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) — Game instance reference - [`BPC_RenderPipelineManager`](149_BPC_RenderPipelineManager.md) — Quality pipeline bridge (NEW) - [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) — Persist settings - [`WBP_SettingsUI`](../06-ui/44_WBP_SettingsUI.md) — UI to read/write settings ### Purpose Centralized settings manager that stores, applies, and persists all player-configurable game settings including graphics, audio, gameplay, controls, accessibility, and language. Operates as a GameInstanceSubsystem so settings are available before any level loads and persist across level transitions. Provides a unified API for reading and writing settings, with change-notification dispatchers for real-time UI updates. ### Enums **ESettingsCategory** | Value | Description | |-------|-------------| | Graphics | Visual quality settings | | Audio | Volume and audio settings | | Gameplay | Game behavior settings | | Controls | Input bindings | | Accessibility | Accessibility options | | Language | Localization | **ESettingsType** | Value | Description | |-------|-------------| | Bool | Yes/no toggle | | FloatRange | Slider value (0.0–1.0) | | IntRange | Integer slider | | Dropdown | Enum or option list | | KeyBinding | Rebiddable input | | Color | Color picker | ### Structs **FSettingsEntry** | Field | Type | Description | |-------|------|-------------| | Category | ESettingsCategory | Grouping | | Key | FName | Setting identifier | | DisplayName | FText | Localized label | | Tooltip | FText | Help text | | Type | ESettingsType | Data type | | CurrentValue | FString | Current value as string | | DefaultValue | FString | Default value | | MinValue | Float | For ranges | | MaxValue | Float | For ranges | | Options | TArray\ | For dropdowns | ### Variables | Name | Type | Description | |------|------|-------------| | `SettingsMap` | TMap\ | All settings by key | | `bSettingsLoaded` | Bool | Initialization flag | | `PendingApplySettings` | TArray\ | Settings awaiting apply | | `bAutoApply` | Bool | Apply changes immediately | ### Functions | Name | Inputs | Outputs | Description | |------|--------|---------|-------------| | `Initialize` | — | — | Load saved settings, set defaults | | `RegisterSetting` | Entry: FSettingsEntry | — | Add setting to registry | | `GetSetting` | Key: FName | FSettingsEntry | Retrieve setting | | `SetSetting` | Key: FName, Value: FString | — | Update setting value | | `SetSettingBool` | Key: FName, Value: Bool | — | Type-safe bool setter | | `SetSettingFloat` | Key: FName, Value: Float | — | Type-safe float setter | | `SetSettingInt` | Key: FName, Value: Int32 | — | Type-safe int setter | | `SetSettingDropdown` | Key: FName, OptionIndex: Int32 | — | Dropdown index setter | | `GetSettingBool` | Key: FName | Bool | Type-safe bool getter | | `GetSettingFloat` | Key: FName | Float | Type-safe float getter | | `GetSettingInt` | Key: FName | Int32 | Type-safe int getter | | `GetSettingDropdown` | Key: FName | Int32 | Dropdown index getter | | `ResetToDefault` | Key: FName | — | Revert single setting | | `ResetCategoryToDefaults` | Category: ESettingsCategory | — | Revert all in category | | `ResetAllToDefaults` | — | — | Factory reset settings | | `ApplySettings` | — | — | Push pending changes to systems | | `ApplyGraphicsSettings` | — | — | Push to PerformanceScaler | | `ApplyAudioSettings` | — | — | Push to AudioManager | | `ApplyGameplaySettings` | — | — | Push to gameplay systems | | `ApplyControlSettings` | — | — | Update input mappings | | `ApplyAccessibilitySettings` | — | — | Push to AccessibilityManager | | `SaveSettings` | — | — | Persist to SS_SaveManager | | `LoadSettings` | — | — | Read from SS_SaveManager | | `IsSettingModified` | Key: FName | Bool | Compare to default | | `GetAllSettingsInCategory` | Category: ESettingsCategory | TArray\ | Filter by category | | `RegisterDefaultSettings` | — | — | Populate standard settings | ### Blueprint Flow ``` [On GameInstance Init] └─► RegisterDefaultSettings() └─► LoadSettings() from SS_SaveManager └─► ApplySettings() to all systems └─► bSettingsLoaded = true [SetSetting] └─► Update SettingsMap[Key].CurrentValue = Value └─► If Key modified: Add to PendingApplySettings └─► If bAutoApply: ApplySettings() └─► Broadcast OnSettingChanged(Key, Value) [ApplySettings] └─► ApplyGraphicsSettings(): Get "QualityPreset", "ResolutionScale", "UpscalerMethod", etc. Pass to BPC_RenderPipelineManager.ApplyQualityPreset(QualityPreset) → RenderPipelineManager handles ALL CVars, reload detection, platform selection └─► ApplyAudioSettings(): Get "MasterVolume", "SFXVolume", etc. Pass to BPC_AudioManager volume modifiers └─► ApplyGameplaySettings(): Get "InvertLook", "Sensitivity", "FOV" Pass to BPC_Movement or BPC_Camera └─► ApplyControlSettings(): Get rebindings, apply to UPlayerInput └─► ApplyAccessibilitySettings(): Pass to BPC_AccessibilitySettings └─► Clear PendingApplySettings └─► OnSettingsApplied.Broadcast() [SaveSettings] └─► Serialize SettingsMap to JSON string └─► Pass to SS_SaveManager.SaveString("Settings", JSON) └─► OnSettingsSaved.Broadcast() [LoadSettings] └─► String = SS_SaveManager.LoadString("Settings") └─► If String is empty: return (use defaults) └─► Deserialize JSON string into SettingsMap └─► For each loaded setting: If key exists in map: update CurrentValue └─► OnSettingsLoaded.Broadcast() [RegisterDefaultSettings] └─► Graphics category: QualityPreset Dropdown [Low, Medium, High, Ultra, Cinematic, Custom] GlobalIllumination Dropdown [Lumen, Baked, SSGI, Off] ⚠ reload ShadowMethod Dropdown [VSM, CSM, DFShadows, Off] ⚠ reload ReflectionMethod Dropdown [Lumen, SSR, Captures, Off] ⚠ reload MeshStrategy Dropdown [Nanite, LOD, Proxy] ⚠ reload UpscalerMethod Dropdown [TSR, DLSS, FSR, PSSR, XeSS, NIS, TAAU, Off] UpscalerQuality Dropdown [UltraPerf, Perf, Balanced, Quality, UltraQuality] ResolutionScale Float 1.0 [0.25–2.0] DynamicResolution Bool false DynamicResTargetFPS Int 60 [30–120] ShadowQuality Int 2 [0–4] TextureQuality Int 2 [0–3] PostProcessQuality Int 2 [0–3] ViewDistanceQuality Int 2 [0–3] FoliageQuality Int 2 [0–3] AntiAliasingQuality Int 2 [0–3] VSync Bool true FrameRateLimit Int 60 [30–240] MotionBlur Bool true DepthOfField Bool true VolumetricClouds Bool true HW_RayTracing Bool false ⚠ reload Brightness Float 1.0 [0.5–2.0] HDR Bool false (if display supports) TexturePoolSizeMB Int 2048 [512–8192] └─► Audio category: MasterVolume Float 1.0 [0–1] SFXVolume Float 1.0 [0–1] MusicVolume Float 0.8 [0–1] AmbientVolume Float 0.8 [0–1] DialogueVolume Float 1.0 [0–1] UIVolume Float 1.0 [0–1] SpatialAudio Bool true AudioQuality Int 2 [0–3] └─► Gameplay category: InvertLook Bool false SensitivityX Float 0.5 [0–1] SensitivityY Float 0.5 [0–1] FOV Int 90 [70–120] HeadBob Bool true AutoPickup Bool true CrosshairType Dropdown [Default, Dot, Cross, Off] Subtitles Bool true └─► Controls category: (Key bindings stored separately via UPlayerInput) └─► Accessibility category: SubtitleSize Int 1 [0–3] HighContrastUI Bool false ColorBlindMode Dropdown [None, Protanopia, Deuteranopia, Tritanopia] TextToSpeech Bool false ScreenShakeIntensity Float 1.0 [0–1] CameraShake Bool true ReducedMotions Bool false LargeText Bool false └─► Language category: Language Dropdown [en, fr, de, es, it, pt, ja, ko, zh] ``` ### Event Dispatchers | Name | Payload | Description | |------|---------|-------------| | `OnSettingChanged` | Key: FName, NewValue: FString | Single setting modified | | `OnSettingsApplied` | — | All settings pushed to systems | | `OnSettingsSaved` | — | Settings persisted | | `OnSettingsLoaded` | — | Settings read from save | | `OnCategoryReset` | Category: ESettingsCategory | Category reverted | ### Communications With | Target | Method | Why | |--------|--------|-----| | [`BPC_RenderPipelineManager`](149_BPC_RenderPipelineManager.md) | Direct call | Graphics pipeline settings | | [`BPC_PerformanceScaler`](../10-adaptive/69_BPC_PerformanceScaler.md) | Direct call | Adaptive quality bridging | | [`BPC_AudioManager`](../10-adaptive/66_BPC_AudioManager.md) | Cast to player | Audio settings | | [`BPC_Movement`](../02-player/14_BPC_Movement.md) | Cast to player | Gameplay settings | | [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) | Direct call | Persistence | | [`WBP_SettingsUI`](../06-ui/44_WBP_SettingsUI.md) | Event | UI read/write | | [`BPC_AccessibilitySettings`](72_BPC_AccessibilitySettings.md) | Direct call | Accessibility apply | | [`GI_GameFramework`](../01-core/04_GI_GameFramework.md) | Direct call | Init ordering | ### Reuse Notes - Settings are stored as FString for maximum flexibility (serialize/deserialize as needed) - Type-safe getters/setters handle conversion from FString - Auto-apply can be toggled for batch changes vs immediate - Default settings registered on initialization serve as fallback - All settings are available before any level loads (GameInstanceSubsystem) - Language settings trigger UI refresh via OnSettingChanged