Subsystem and registry
UGSS_GameSettingsSubsystem is a Local Player Subsystem that creates and owns UGSS_GameSettingRegistry. The registry collects the settings tree, finds nodes by SettingId, filters visible entries, and emits value-change, Apply, Action, navigation, and edit-state events.
A Definition Data Asset fits a static, reusable tree. UGSS_GameSettingsProvider fits settings that depend on runtime state or need dynamic registration and removal. Providers should add nodes through the supplied UGSS_GameSettingsBuilder so the subsystem can track lifecycle, dependencies, and pending changes consistently.
Tree and identifiers
Use Pages and Collections to organize navigation and value nodes. Value nodes can represent Bool, Discrete, Scalar, or Action settings. Give each setting a stable, globally unique Gameplay Tag as its SettingId. Do not use display names or developer names as cross-system identifiers.
The Provider Builder exposes methods such as AddBool, AddDiscrete, AddScalar, and AddAction. C++ providers build nodes during registration; Blueprint providers use the typed Add nodes. When removing dynamic content, unregister the Provider with its registration handle so nodes and event bindings do not outlive it.
Accessors and storage
- A Local Accessor connects to project-local engine settings, commonly options owned by
UGameUserSettings. - A Shared Accessor connects to the current Local Player's
UGSS_SettingsShared. Projects can derive from this class and add SaveGame properties with matching getters and setters.
Accessor getters and setters use reflected functions. In a project-specific Shared Settings class, override ApplySettings to apply loaded preferences to project systems; override SaveSettings when you need additional persistence. The default Shared save uses the asynchronous LocalPlayer SaveGame path.
Editing and committing
Regular staged nodes are committed by Apply; Cancel restores the baseline tracked by the registry; Reload discards pending edits and reads stored values again. Dynamic Discrete/Scalar nodes call their accessor immediately for previews. ApplyChanges persists values, and the project should define a clear rollback path for immediate previews.
Edit conditions can hide or disable a setting, exclude options, or control whether it can be reset. Dependencies are declared by SettingId and resolved again by the registry after registration or removal. For cross-provider dependencies, keep SettingIds unique and ensure the referenced node exists.