Skip to content

Authoring settings in Blueprint ​

For new menus, use Blueprint settings composition. It documents the current IFSettingsMenu, definition/provider/session and reusable-row workflow, including a four-tab saved example and one shared Apply/Cancel for preferences and input bindings. The low-level subsystem recipe below describes the historical WBP_AshenSettings screen; its separate Controls transaction is not the current product menu's behavior.

WBP_AshenSettings is a saved IFScreen Blueprint. Its Designer uses ordinary Sliders, IFText, IFSurface, WBP_ForgeActionButton and an InterfaceForge Scroll Box. Apply/Cancel stay outside the scroll area. Defaults is a quiet draft action inside the reading area, alongside the other editable controls; it calls the same Restore Defaults node. This leaves space to edit when a save error is visible at enlarged scale. The example uses public IFSettingsSubsystem contracts, with no parallel settings save file or custom slider runtime class.

Session and controls ​

Get IFSettingsSubsystem with Get Game Instance Subsystem. On On Activated, call Begin Edit and retain its result in your screen's OwnsSettingsSession Boolean. When returning from a child screen, retain an existing owned session. If Begin Edit returns false, display a busy message and reject edits; another screen owns the draft.

Each slider uses the same small workflow:

flowchart LR
    A[Slider: On Value Changed] --> B{Owns Settings Session?}
    B -->|Yes| C[Set Scalar Preference: field, Value, Preview=true]
    C --> D[On Preferences Updated]
    D --> E[Get Scalar Preference]
    E --> F[Slider: Set Value]
    E --> G[As Percent → value label: Set Text]

Fields: UIScale, TextScale, UIVolume, GameVolume, TooltipDelay. The first four have working controls in the example. UIScale ranges 0.75–1.5, TextScale 0.8–1.5, volumes 0–1; a keyboard/controller step is 0.05. Set Scalar Preference edits only that field and uses the same validation and transaction as Set Draft. It returns false outside an edit session or for non-finite input. Finite values clamp to the supported range. For batch edits use Get Preferences → Set Members in FIFUIPreferences → Set Draft instead.

The motion button calls Get Reduced Motion → NOT Boolean → Set Reduced Motion. Its label reflects the current draft. On Theme Updated applies Theme Outline/Accent through Set Slider Bar Color / Set Slider Handle Color; text, surfaces and buttons follow the same theme independently.

Finishing edits ​

Player actionPublic Blueprint flowExpected result
ApplyApply → Branch Return Value; success clears ownership and Deactivate WidgetSave succeeds before draft becomes committed; returns to opener
Save failureApply Failure Reason → status Set TextScreen stays open with its draft available
Cancel or BackClear ownership → Cancel → Deactivate WidgetReverts preview to committed values; restores opener focus
Restore defaultsRestore Defaults, Preview=trueChanges draft and presentation; Apply still required to persist
Forced removalEvent Destruct; if owned, clear ownership and CancelAbandoned drafts do not survive a destroyed screen

Ownership is a screen convention around the subsystem's single game-instance edit session. Clearing your Boolean before Cancel prevents reentrant preference notifications from treating the screen as an active editor. UI/audio preferences are game-instance-wide; Enhanced Input key profiles remain local-player data.

Unreal's device DPI curve is applied once, with UIScale multiplying ApplicationScale. TextScale changes semantic text size separately. Reduced motion controls the existing CommonUI stack transition duration. UI/game audio use the configured distinct SoundClasses and SoundMix; Play Sound 2D with the example's game-class preview sound exercises that route. Configure your own IFAudioRouting data asset through Set Audio Routing.

Controls opens WBP_AshenControls using public Push Screen. See BLUEPRINT_CONTROLS.md. Key persistence remains Unreal's EnhancedInputUserSettings. Key changes have their own Apply/Cancel transaction: they are not atomically committed with UI/audio preferences. Document this distinction in your game if exposing both on one page. Graphics should use UGameUserSettings rather than this preference struct.

Connect audio and a save profile ​

Create an IFAudioRouting data asset. Assign your engine Sound Mix, one UI Sound Class and one separate game Sound Class. Use distinct sibling classes, avoiding a master/parent class whose gain also affects the other group. Assign the UI class to the theme's Focus Sound/Confirm Sound assets, and the game class to your gameplay sounds. Call Set Audio Routing once during game-instance/player interface setup. After travel, Refresh Presentation reapplies the presented preferences to the new world. Unreal still owns mixing, playback and sound-class propagation.

The saved Test audio button uses On Clicked → Play Sound 2D with the original IF_GamePreview sound assigned to the game class. IFButton's normal click feedback uses the theme's Confirm Sound assigned to the UI class. Moving UI feedback should change the confirmation without changing the game preview; Game audio should do the opposite. Setting one slider to0 mutes that class. Cancel/Back restores the committed gains; reopening displays those values. Replace both sound assets/classes through your own theme/routing asset.

For a named local preference profile, call Set Storage Profile(Slot,UserIndex) before opening the settings edit session. The node rejects empty/path-like names, negative users and changes during an active edit. It loads defaults if the selected slot has no valid supported save. Apply writes that profile through Unreal's SaveGame system. A failed write returns false and Failure Reason while retaining the draft, so keep the screen open and permit retry or Cancel. Do not display success merely because the button was clicked. Platform-specific user-index/storage behavior remains Unreal-owned.

Evidence and limits ​

The saved screen also includes English/Türkçe choices. Language preview, Cancel/cleanup, Apply and project Defaults use public Unreal Get/Set Current Language, Get/Set Current Locale, and Set Current Language and Locale nodes inside the same edit-ownership gates. Culture config is committed only after a successful UI preference Apply; these are separate file operations. Follow the language-setting recipe for the actual wiring, target generation, expected results and engine startup/save-I/O limitations.

Current settings/audio evidence records actual mixer PCM, saved Blueprint controls/actions, unique test-slot OS save failure/retry and clean-process reload. The source/runtime fixture uses normal1280×720 and enlarged800×600/150%UI+text, retains the player save bytes, and independently analyzes exported waveforms. GUI failure feedback keeps Apply/Cancel visible and at least120logical units of editing space; recorded enlarged height170.4. Defaults is accessible inside the normal scroll/navigation region.

This proves engine output signals and the tested transactions, not physical speaker/listening, controller/touch/thumb dragging or arbitrary platforms. Synthetic Slate keys and explicit slider events are identified in the evidence. Graphics remain Unreal GameUserSettings-owned; remaps have their separate EnhancedInput transaction and stock Save Settings provides no disk-I/O return. Older settings/restart/scaling results retain their recorded revision scope in RESPONSIVE_LAYOUTS.md and prior Evidence.

UIForge v0.1.0 · Blueprint and C++ development documentation.

Enlarged documentation image

Enlarged documentation image