CrimsonSettings

One config line is mandatory
Your project MUST register UCrimsonSettingsLocal as the engine's GameUserSettings class, or the plugin asserts the first time any video, audio, gamepad or mouse row is built. Add to Config/DefaultEngine.ini:

[/Script/Engine.Engine]
GameUserSettingsClassName=/Script/CrimsonSettings.CrimsonSettingsLocal

UCrimsonSettingsLocal::Get() is a CastChecked over GEngine->GetGameUserSettings(), and the engine allocates that object once, from this config value. Quick Start step 2 covers it.

A modular settings framework (a Crimson-prefixed port of Epic's GameSettings). You declare options in a data asset, choose how they persist - a generic per-player keyed store with no glue, or a delegate bound to your own game code - and present them with a CommonUI screen that ships search, tag filtering, presets, named profiles, live preview, confirmation countdowns, and a first-run wizard.

Two ways to read this
Use the Blueprint / C++ / Both switch at the top of the window. Blueprint readers get editor screenshots; C++ readers get code; Both shows them side by side.

What's included

SystemKey TypesPurpose
DeclareUCrimsonSettingsDataAssetAuthor sections + setting entries (scalar / discrete / action) in the Content Browser - no code
Persist (zero glue)UCrimsonSettingsShared keyed store, UCrimsonSharedSettingsSubsystemTick Persist To Shared Store and a setting saves per-player by key - no delegates, no fields to add
Bind to codeUCrimsonSettingValueScalar_BP, UCrimsonSettingValueDiscrete_BPRoute a setting's get/set to your own functions via K2_BindSetting when it drives live game state
Advanced (C++)UCrimsonSettingValueScalarDynamic, FCrimsonSettingDataSourceReflected getter/setter data sources for resolution, scalability, gamma, etc.
RegistryUCrimsonSettingRegistryBuilds and owns the settings; PopulateFromDataAsset, category hooks, presets, profiles
Ready-made rowsAddDefaultVideoSettings ... AddDefaultGameplaySettingsFive builders that produce a complete Video / Audio / Mouse & Keyboard / Gamepad / Gameplay menu with nothing authored
Key rebindingUCrimsonSettingKeyboardInput, UCrimsonSettingsListEntrySetting_KeyboardInputDevice-scoped rebind rows with chord support, three display modes, and critical-binding warnings
CalibrationUCrimsonBrightnessEditor, UCrimsonSafeZoneEditorFull-screen gamma and title-safe screens the player judges live, driven from an action row
First runUCrimsonFirstRunWizard, UCrimsonFirstRunStepA step sequence shown once on first launch, with native and Blueprint hooks
Storage backendsUCrimsonSettingsLocal, UCrimsonSettingsSharedMachine-local (GameUserSettings.ini) vs per-player save (follows the account)
ScreenUCrimsonSettingScreen, UCrimsonSettingPanel, UCrimsonSettingListEntryCommonUI screen + scrollable list + per-row widgets with dirty / default / conflict indicators
UXsearch, tag filter, presets, profiles, live preview, confirmation, wizardAAA polish available out of the box, each opt-in

Plugin dependencies

TypeName
CrimsonNone - fully standalone
Engine pluginsCommonUI, EnhancedInput, AudioModulation
Engine modulesCore, CoreUObject, Engine, UMG, Slate, SlateCore, CommonUI, CommonInput, GameplayTags, InputCore, EnhancedInput, DeveloperSettings, AudioMixer, RHI (+ private ApplicationCore, PropertyPath, AudioModulation)
The generic keyed store is the headline
You never add a typed field to CrimsonSettings to persist a new option. Tick Persist To Shared Store on a data-asset entry and it saves into a generic Key -> value store on the per-player save. That is what lets any plugin (or your game) add persistent settings without editing CrimsonSettings - see How-To: Persist Settings with Zero Glue and How-To: Expose Another Plugin's Settings.
Using with other Crimson plugins
This plugin works alone: any plugin or game system exposes options through its own data asset or registry hooks, with no dependency on CrimsonSettings. When you own the other Crimson plugins, CrimsonCore contains the full-suite wiring in Source/CrimsonCore/{Public,Private}/Integration/Settings/: UCrimsonCoreSettingKeyboardInput (chord-aware keybind rows backed by the input plugin) and UCrimsonCorePerfStatSettingsLibrary (the performance stats page). To wire it yourself, see CrimsonCommon -> Concept: Connecting Crimson Plugins; for what CrimsonCore installs, see CrimsonCore -> Concept: The Integration Layer.

Where to go next

  • New here? Quick Start builds a working settings screen whose values persist per player.
  • Want a complete menu immediately? How-To: Use the Ready-Made Collections.
  • Authoring rows: How-To: Author Settings in the Visual Editor, How-To: Persist Settings with Zero Glue, How-To: Bind a Setting to Game Code, How-To: Expose Another Plugin's Settings.
  • Input and screens: How-To: Rebindable Keys, How-To: Brightness & Safe Zone Calibration, How-To: First-Run Setup Wizard.
  • Polish: How-To: Presets & Profiles, How-To: Live Preview & Confirmation, How-To: Performance Stats on the HUD.
  • Mental model: the Concept pages (three layers, storage model, value types & data sources).
  • Signatures: API Reference.