Every project hits this. You've got a game, you've got abilities, and now you need a menu where someone can turn the music down and switch to windowed mode. It looks like a weekend of UMG.
It is not a weekend of UMG — but a good chunk of the reason is that beginners rebuild systems the engine already has. Here's the map of what's free and what isn't.
GameUserSettings is already your settings object
Do not build a SaveGame for graphics settings. UGameUserSettings exists, it's a singleton, it persists to GameUserSettings.ini on its own, and it already covers resolution, window mode, V-Sync, frame rate cap and the five scalability groups.
The whole graphics half of your menu is this:
CB0
ApplySettings writes the ini. LoadSettings reads it. You do not write a single line of persistence code.
For the resolution dropdown, don't hardcode a list — ask the platform via GetSupportedFullscreenResolutions and populate from that. A hardcoded list is how you ship a game that can't run at someone's native resolution.
Scalability: five groups, five integers
View Distance, Anti-Aliasing, Post Processing, Shadows, Textures, Effects, Foliage, Shading. Each is an integer 0–3 (Low/Medium/High/Epic), and GameUserSettings has a getter and setter for every one. Your "Quality" preset is SetOverallScalabilityLevel(2).
There's a genuinely useful trick here: RunHardwareBenchmark() followed by ApplyHardwareBenchmarkResults() gives you sensible defaults for the machine the game is actually running on. Two nodes, and first-launch quality stops being a guess.
Audio: Sound Classes and one Sound Mix
The volume-slider question comes up constantly and the answer is never "set volume on the audio component."
Create Sound Classes: Master, Music, SFX, Voice. Assign every sound to one. Create a Sound Mix that references them. Then:
CB1
One node per slider. Volume changes take effect on sounds already playing.
The catch nobody mentions: GameUserSettings does not store your audio values. That half you do save yourself — a small SaveGame or config-backed UObject with four floats. That's the boundary: engine handles graphics, you handle audio and gameplay.
Key rebinding: check your engine version first
This is where the internet will waste your evening. Most rebinding tutorials predate UE 5.3 and describe a custom system built on the old input mappings.
Since UE 5.3, Enhanced Input ships user settings: enable Enhanced Input User Settings in Project Settings, mark your Input Actions as player-mappable (they need a Player Mappable Key Settings entry with a name), and you get EnhancedInputUserSettings with MapPlayerKey / UnMapPlayerKey / ResetKeyProfileToDefault and built-in saving.
Before 5.3 you're writing it yourself against InputMappingContext and storing the overrides in your own save. Same menu, five times the work. If you're on 5.3+ and following a 2022 tutorial, stop and search again.
The other half of rebinding is the "press any key" capture. UMG gives you OnKeyDown on a focused widget — set keyboard focus, catch the event, hand the FKey to MapPlayerKey. Don't forget gamepad: that's a different device and needs its own slot.
Plugin tip
Everything above is maybe five hours of wiring, and then a lifetime of it breaking whenever you add a setting.
FoxSettings is a data-driven settings menu — you define settings as data, it builds the UMG, applies to GameUserSettings, handles the Sound Class routing and Enhanced Input rebinding, and saves. Audio · Graphics · Gameplay · Controls. Optional, but it's the same menu every project needs and nobody wants to write twice.Apply, Revert, Confirm
The pattern players expect and beginners skip: changing resolution should not be permanent until confirmed. Apply the change, show a 10-second countdown dialog, and revert if nobody clicks. GameUserSettings gives you SetScreenResolution + ApplyResolutionSettings separately from ConfirmVideoMode and RevertVideoMode for exactly this. Someone picks a mode their monitor can't display and your game isn't bricked.
Common pitfalls
- A custom SaveGame for graphics settings. You rebuilt
GameUserSettingsbadly. Delete it. - A hardcoded resolution list. Query the platform.
- Volume set on individual audio components. Sound Classes and a Sound Mix, or you'll be chasing sliders forever.
- Following a pre-5.3 rebinding tutorial on 5.3+. You'll write a system the engine already has.
- No confirm/revert on video mode. One bad fullscreen choice and the player can't get back.
- Applying every setting on every slider drag.
ApplySettingswrites to disk. Apply on commit, not on tick.
30-second recap
GameUserSettingsis the graphics half — resolution, window mode, V-Sync, FPS cap, scalability. It persists itself.RunHardwareBenchmarkgives you real first-launch defaults.- Audio is Sound Classes + one Sound Mix, saved by you. GameUserSettings won't do it.
- Key rebinding is built in from 5.3 via Enhanced Input User Settings. Check your version before following any tutorial.
- Query supported resolutions, never hardcode.
- Video mode needs Apply → Confirm → Revert with a timeout.
Next Sunday: level streaming basics — World Partition vs sublevels vs streaming volumes, and how to pick without repainting your world twice.
— Marco
Comments
Leave a comment