UE5 Settings Screens: Changing Resolution, Quality, and Volume with Game User Settings

Created: 2026-07-20

An illustrated guide to building a UE5 settings screen with Game User Settings. Covers switching resolution and window mode, quality levels via Scalability, the difference between Apply Settings and Save Settings, and why volume takes a separate path.

You got as far as putting a "Settings" button on the title screen. But you have no idea where the resolution should be saved. Create a SaveGame class, write out resolution and quality, read them back on launch, and apply them. Plenty of people design all of that before writing a line.

UE ships with a dedicated class for exactly this: Game User Settings . It holds resolution, window mode, quality, VSync, and frame rate limit, and handles writing to a file and loading on startup by itself. This article covers what Game User Settings can handle, the two easy-to-forget nodes Apply Settings and Save Settings, and why volume alone takes a different path.

A settings screen with resolution, quality, and volume, alongside the Game User Settings object receiving those values

What You'll Learn

  • Game User Settings already holds display-related settings for you
  • How to switch resolution and the three window modes
  • Quality is specified as a Scalability level
  • Nothing applies without Apply Settings, and nothing persists without Save Settings
  • Volume alone lives outside Game User Settings
  • Hands-on: a settings screen that changes resolution, quality, and volume

Sponsored

The Place for Settings Already Exists

When you design your own save data, it's tempting to put resolution and quality in there. But those two have awkward properties.

  • They don't belong to a save slot: "slot 1 is 1920×1080 and slot 2 is 1280×720" is meaningless. Settings belong to the player personally, and their lifetime differs from progression data
  • They're needed immediately at launch: these are values you want applied by the time the title screen appears. They can't wait for save data to load

UE separates these. Progression data goes in SaveGame , and display-related settings go in Game User Settings .

Contrast between cramming everything into a custom SaveGame on the left and splitting progression data from display settings into separate files on the right

To reach it from Blueprint, call the Get Game User Settings node. It takes no arguments, and you connect the other nodes to the returned Game User Settings object. Any Blueprint can call it, and it always refers to the same single instance for the whole game.

The items it handles are roughly these:

SettingNode to WriteNode to Read
ResolutionSet Screen ResolutionGet Screen Resolution
Window modeSet Fullscreen ModeGet Fullscreen Mode
Quality (all at once)Set Overall Scalability LevelGet Overall Scalability Level
Quality (individual)Set Shadow Quality and friendsGet Shadow Quality and friends
Vertical syncSet VSync EnabledIs VSync Enabled
Frame rate limitSet Frame Rate LimitGet Frame Rate Limit

Notice that volume isn't here . We'll get to that in a later section.

The values are saved outside the project, in a per-user location, in GameUserSettings.ini . For a packaged Windows build that's %LOCALAPPDATA%\<ProjectName>\Saved\Config\Windows\GameUserSettings.ini, while testing in the editor reads the project's Saved/Config/WindowsEditor/GameUserSettings.ini. Since the test file and the packaged file are different, settings you configure in the editor do not carry over to the packaged build.

Sponsored

Resolution and Window Mode

Resolution is specified with Set Screen Resolution . It has a single pin, Resolution, of type Int Point (a pair of integers, X and Y).

How the window is presented is set with Set Fullscreen Mode , passing one of three values to In Fullscreen Mode.

Fullscreen, Windowed Fullscreen, and Windowed lined up by how much of the display they occupy
ModeAppearanceCharacteristics
FullscreenTakes over the entire displayThe chosen resolution is applied to the display itself. Switching takes a moment
Windowed FullscreenLooks fullscreen, but is a borderless windowFast to alt-tab to other apps. The default for most PC games
WindowedA normal windowThe resolution becomes the window size directly

When in doubt, defaulting to Windowed Fullscreen avoids most problems with flicker on switching or mismatched resolutions.

Build the list of choices to match the environment. The Get Supported Fullscreen Resolutions node returns the resolutions available on that display as an array of Int Point (the returned Boolean tells you whether the query succeeded).

NodeWhat It ReturnsGood For
Get Supported Fullscreen ResolutionsArray of resolutions usable in fullscreenFullscreen-oriented options
Get Convenient Windowed ResolutionsArray of window resolutions that fit the current displayOptions for windowed mode

Writing a fixed list yourself always breaks down eventually: ultrawide and 4K users can't pick their resolution, or you offer resolutions larger than their screen. Build your options from what you queried.

Note: These nodes report what the connected display supports . Some environments return a nearly empty array, so it's safer to fall back to one default entry when the element count is 0.

Quality Is Specified as a Scalability Level

UE's quality settings are grouped under a system called Scalability . Shadows, textures, post-processing, view distance, and more exist individually, and you can switch them all together by level.

The node to change everything at once is Set Overall Scalability Level . Pass an integer to Value.

Diagram showing a single Overall Scalability Level slider moving shadows, textures, view distance, and other individual settings together
ValueLevel
0Low
1Medium
2High
3Epic
4Cinematic (for filmmaking)

For an in-game settings screen, exposing the four levels 0-3 is enough. Cinematic is a filmmaking tier and is too heavy to play at in real time.

Individual items have their own dedicated nodes.

NodeTarget
Set Shadow QualityShadows
Set Texture QualityTextures
Set View Distance QualityView distance
Set Post Processing QualityPost-processing
Set Anti Aliasing QualityAnti-aliasing
Set Visual Effect QualityEffects

There's one behavior here that catches people building UI. Get Overall Scalability Level returns -1 when the individual items are set inconsistently. There's no level that corresponds to "shadows low, everything else high."

So when you reflect the current value into a dropdown on your settings screen, you need to decide how to handle a -1. Adding a "Custom" option, or simply leaving nothing selected, are both reasonable.

Note: If you want to pick a starting level automatically, you can measure with Run Hardware Benchmark and then call Apply Hardware Benchmark Results . Run it once on first launch and respect the player's choice afterward. Running it every time overwrites their settings on every startup.

Sponsored

Apply and Save Are Different Jobs

This is the part of the article most worth remembering. Nearly every broken settings screen comes down to one of these two.

Both Set Screen Resolution and Set Overall Scalability Level only rewrite a value inside Game User Settings . Nothing happens on screen.

Three stages side by side: writing the value, applying it to the screen, and saving it to a file
NodeWhat It DoesWhat Happens If You Skip It
The various Set ...Writes the valueNothing changes at all
Apply SettingsApplies the written values to the current screenChoosing something doesn't change the display
Save SettingsWrites the values to a fileEverything reverts on restart

Apply Settings has a Boolean pin, b Check for Command Line Overrides . It controls whether command line arguments (such as -ResX=) take precedence when present. When calling from a settings screen you want the player's choice to go through as-is, so pass false .

The apply nodes come in three flavors.

NodeScope
Apply SettingsEverything
Apply Resolution SettingsResolution, window mode, VSync
Apply Non Resolution SettingsQuality and everything else

Using Apply Non Resolution Settings when only quality changed makes the switch smoother, since the window isn't rebuilt. Early on, though, it's safer to standardize on calling Apply Settings then Save Settings from your "Apply" button so nothing gets missed.

(Apply button On Clicked)
  → Get Game User Settings
  → Apply Settings (b Check for Command Line Overrides: false)
  → Save Settings

Loading is automatic. The engine reads and applies GameUserSettings.ini at launch, so you normally don't need to call Load Settings yourself. All your settings screen has to do is show the current values in the UI .

Volume Alone Takes a Different Path

If you're going to put three things on a settings screen, they're resolution, quality, and volume. But volume isn't part of Game User Settings .

Volume isn't a rendering setting; it's part of audio mixing. In UE you group sounds with a Sound Class and change that group's volume with a Sound Mix .

What You Want to DecideWhat to Use
Display-related settingsGame User Settings
Which group a sound belongs toSound Class
How loud that group is right nowSound MixSet Sound Mix Class Override

So a volume slider on a settings screen has to take care of two things separately:

  • Applying: call Set Sound Mix Class Override
  • Saving: write to a save location you provide yourself, such as SaveGame

How to assemble Sound Classes and Sound Mixes is covered in the 3D sound and mixing article. That article covers the mechanism; this one covers wiring it to UI. For the save side, the SaveGame class from the save/load article works as-is.

Sponsored

Hands-On: Building a Resolution, Quality, and Volume Screen

An action game's title screen, an exploration game's pause menu, a simulation game's first launch. If you're shipping, a settings screen is required in every genre. Here we build the minimum three-item version, all the way to values that survive a restart.

The Finished Result

Pick 1280 x 720 from the dropdown, press "Apply," and the window resizes. Set quality to "Low" and shadows get coarser. Quit the app and launch it again, and it comes back up at the resolution and quality you chose.

A settings screen with resolution and quality dropdowns, a volume slider, and an Apply button, with the window shrinking after applying

Setup to Reproduce It

Create a new project from the Third Person template and prepare the following. The volume portion uses the same setup as the 3D sound article.

TypeNameSettings
Widget BlueprintWBP_SettingsBuilt with the layout below
Sound ClassSC_MasterJust create it
Sound MixSM_UserAudioOne entry in Sound Class Effects (SC_Master / Volume Adjuster 1.0 / Apply to Children true)
Sound WaveAny BGMLooping on, Sound Class set to SC_Master

In WBP_Settings, put a Vertical Box in the center of a Canvas Panel and add these four widgets. Check Is Variable on all four.

WidgetNameInitial Settings
Combo Box (String)Combo_ResolutionLeave the options empty (filled in at runtime)
Combo Box (String)Combo_QualityRegister Low / Medium / High / Epic in Default Options, in that order
SliderSlider_VolumeMin Value 0.0 / Max Value 1.0 / Value 1.0
ButtonButton_ApplyPut a Text inside reading "Apply"

Variables (create these on WBP_Settings)

VariableTypeDefaultPurpose
ResolutionListArray of Int PointEmptyHolds resolutions in the same order as the dropdown

Since a dropdown can only hold strings, the most reliable approach is to keep the corresponding Int Point values in an array in the same order and look them up by the selected index. That removes any need to parse 1280 x 720 back into numbers.

Note: In Play In Editor (PIE), resolution and window mode changes don't show up on screen. You're running inside the editor's viewport. Always test by choosing Standalone Game from the dropdown next to Play. Quality and volume do change in PIE.

Step 1: Build the Options and Show Current Values at Launch

Build this in WBP_Settings's Event Construct. There are two jobs here: building the options and reflecting the current settings into the UI .

Node graph flowing from Event Construct through fetching resolutions, adding options in a For Each Loop, and reflecting current values
Event Construct
  → Get Supported Fullscreen Resolutions ── Resolutions (array of Int Point) ─┐
  → Set ResolutionList  ←──────────────────────────────────────────────────────┘
  → For Each Loop (Array = ResolutionList)
       Loop Body:
         → Pull out the Int Point's X / Y (right-click the pin → Split Struct Pin)
         → Append (build the form "1280" + " x " + "720")
         → Add Option (Target = Combo_Resolution, Option = the string you built)
       Completed ↓
  → Get Game User Settings
  → Get Overall Scalability Level ── Return Value ─┐
  → Branch (Return Value >= 0)                      │
      True → Set Selected Index (Target = Combo_Quality, Index = ←┘)
      False → (do nothing; individual settings are custom, so leave it unselected)
  → Push Sound Mix Modifier (In Sound Mix Modifier: SM_UserAudio)

Don't forget that final Push Sound Mix Modifier. If the Sound Mix isn't active, the volume override does nothing at all.

The reason Combo_Quality's options are ordered Low / Medium / High / Epic is so the 0 through 3 returned by Get Overall Scalability Level can be passed straight into Set Selected Index.

Step 2: Apply Volume Immediately

The volume slider alone applies the moment you move it, without waiting for "Apply." It's an item you adjust by ear.

Select Slider_Volume in the designer and press the + next to On Value Changed in the event list at the bottom of the Details panel.

Event On Value Changed (Slider_Volume) ── Value ─┐
  → Set Sound Mix Class Override                  │
      In Sound Mix Modifier : SM_UserAudio        │
      In Sound Class        : SC_Master           │
      Volume                : ←──────────────────┘
      Pitch                 : 1.0
      Fade In Time          : 0.1
      Apply to Children     : true

Fade In Time defaults to 1.0 second. On a slider that feels like a one-second delay, so drop it to 0.1.

Step 3: Write, Apply, and Save from the Apply Button

Lay out this article's key points directly in Button_Apply's On Clicked.

Node graph running from On Clicked through Set Screen Resolution, Set Fullscreen Mode, Set Overall Scalability Level, Apply Settings, and Save Settings in series
Event On Clicked (Button_Apply)
  → Get Game User Settings ── use the Return Value as the Target below

  → Get Selected Index (Target = Combo_Resolution) ── Return Value ─┐
  → Get (Target = ResolutionList, Index = ←──────────────────────┘)
  → Set Screen Resolution
        Resolution : ← the result of Get (Int Point)

  → Set Fullscreen Mode
        In Fullscreen Mode : Windowed Fullscreen

  → Get Selected Index (Target = Combo_Quality) ── Return Value ─┐
  → Set Overall Scalability Level
        Value : ←────────────────────────────────────────────────┘

  → Apply Settings
        b Check for Command Line Overrides : false

  → Save Settings

Apply Settings and Save Settings are what this entire article is about. The four Set ... nodes above only write values, and nothing happens on screen. Apply Settings applies them, and Save Settings writes them to a file.

Note that this setup doesn't save volume. If you want all three to persist, add a write to SaveGame after Save Settings, then read it back in Event Construct and Set Value on Slider_Volume. The split is: the engine owns display settings, and you own volume.

Step 4: Show It on Screen and Enable the Mouse

Add this to BP_ThirdPersonGameMode's Event BeginPlay.

Event BeginPlay
  → Create Widget (Class = WBP_Settings) → Add to Viewport
  → Get Player Controller → Set Show Mouse Cursor (true)

In a real game you'd open this from a pause menu. How to wire that up is in the pause menu article. When switching to the settings screen, don't Remove from Parent the pause menu; set its Set Visibility to Collapsed and the back button becomes trivial.

Verifying

Choose Standalone Game from the dropdown next to Play, launch, and check the following in order.

  1. Pick 1280 x 720 for resolution and press "Apply." The window immediately shrinks to that size
  2. Set quality to "Low" and press "Apply." Shadow edges get coarser and distant foliage renders more simply
  3. Drag the volume slider to 0. The BGM cuts out on the spot, without pressing the button
  4. Close the window and launch Standalone Game again. If it comes up at 1280 x 720 on low quality, it worked
  5. Disconnect the Save Settings node and repeat steps 1 and 4. This time it reverts to the original resolution

Doing 4 and 5 back to back makes what Save Settings does click in one pass.

Here's how to narrow things down when it doesn't work.

  • Pressing the button changes nothingApply Settings isn't wired up
  • Nothing happens in the editor but the values do change → That's how PIE works. Test with Standalone Game
  • Everything reverts on restart → You aren't calling Save Settings
  • The dropdown stays emptyGet Supported Fullscreen Resolutions returned 0 entries. Try Get Convenient Windowed Resolutions too, and if that's also empty, insert one default entry
  • You get a different size than the one you picked → The order of ResolutionList doesn't match the dropdown's order. Build both inside the same loop
  • Nothing is selected in the quality dropdownGet Overall Scalability Level is returning -1. The individual items are in a mixed state
  • Moving the volume slider does nothing → You aren't calling Push Sound Mix Modifier, or your BGM has no Sound Class assigned

Two points to take away.

  • Writing, applying, and saving are separate nodes: Set ... just puts a value in place. Apply Settings sends it to the current screen, and Save Settings sends it to a file. When a settings screen doesn't work, first figure out which of those three stages it stopped at
  • Build your options from the environment: hard-coding a resolution list always breaks on ultrawide and 4K setups. Building the dropdown from Get Supported Fullscreen Resolutions and keeping the matching Int Point values in a parallel array is the most durable shape

If you want gamepad support too, the focus management article is the natural next read.

Sponsored

Checks When It Doesn't Work

Settings screens are structured so you can trace causes from symptoms.

SymptomWhere to Look
Nothing you pick changes the screenAre you calling Apply Settings?
It applies but reverts on restartAre you calling Save Settings?
Resolution only fails to change in the editorThat's how PIE works. Test with Standalone Game
Only the packaged build launches at the default resolutionThe editor and packaged builds use different GameUserSettings.ini files. Configure it once in the packaged build
Settings are broken and can't be fixedDeleting GameUserSettings.ini restores the initial state. Or use Set to DefaultsApply Settings
Raising quality doesn't change the lookAre individual items pinned separately? If Get Overall Scalability Level returns -1, they're mixed

GameUserSettings.ini is a text file, so opening it shows you exactly what got saved. It separates "it wasn't saved" from "it wasn't loaded" in one look , so check this file first when you get stuck.

Bonus: Good to Know for Later

  • A frame rate limit of 0 means "unlimited": passing 0.0 to Set Frame Rate Limit removes the cap. Offering 30, 60, 120, and 0 as choices is standard. For a quick temporary check while running, typing t.MaxFPS in the console is faster
  • VSync and frame rate limit are different things: Set VSync Enabled syncs to the display's refresh rate to prevent tearing, and isn't a way to specify a cap. Offering both as options is the friendly choice
  • Set to Defaults doesn't save: when building a "restore defaults" button, follow Set to Defaults with Apply Settings and Save Settings. The same three stages apply here too
  • Key bindings use a different system: remapping keys isn't handled by Game User Settings; it lives on the Enhanced Input side. If you split your settings screen into tabs, you'll end up with display, audio, and controls
  • Quality isn't always the cause of poor performance: when "Low" doesn't help, the culprit may be Blueprint logic or Tick rather than rendering. Measure first (see the stat commands article and the LOD and culling article)
  • Test the first launch of a packaged build: plenty of settings-screen bugs only show up in packaged builds. Anything involving resolution must be packaged and verified at least once (see the packaging article)

Summary

  • Display-related settings already have a home in Game User Settings . You don't need to cram them into a SaveGame yourself
  • You work with the Set ... nodes hanging off Get Game User Settings. Resolution is an Int Point , and quality is a level from 0 to 3
  • Apply Settings applies, Save Settings persists. Forgetting these two accounts for most bugs
  • Build your options from Get Supported Fullscreen Resolutions . Fixed lists break in the wild
  • Volume lives outside Game User Settings. Change it with Sound Class + Sound Mix, and save it yourself

In the game you're building right now, which setting would a player want to touch first? Even a settings screen that only handles that one item changes the impression of how finished your game feels.