A complete, hot-applying Settings system for Unity 6000.2.3f1 (URP) on PC + Consoles
📦 This repository contains the full implementation from a 16-part production tutorial (Parts 0–15). It delivers a polished, AAA-style Settings menu with hot-apply, presets, ES3 persistence, full rebinding, localization, accessibility, and controller glyphs.
Unity-Settings-Modifier is a complete, modular Settings framework for Unity 6000.2.3f1 (URP). It’s designed for teams shipping on PC (Windows/macOS/Linux) and Consoles. You get:
- Hot-apply changes mid-game (no scene reload where possible).
- Strong UX with uGUI, keyboard/mouse & gamepad navigation, tooltips, and safe fallbacks.
- Robust persistence using Easy Save 3 (ES3).
- Clean, maintainable C# (namespaces, asmdefs, comments, no per-frame allocations).
- Quality presets (Low/Medium/High/Ultra + Custom) & an optional PC Auto-Detect.
- Full Input rebinding (conflict detection), controller glyphs, localization, accessibility, and more.
| Part | Topic | Highlights |
|---|---|---|
| 0 | Foundations & Architecture | SettingsRuntime, SettingsRegistry, SettingsModel (SO) & SettingsState (POCO), Apply/Cancel/Defaults, ES3 persistence, event bus, presets. |
| 1 | Display & Windowing | Resolution list, fullscreen/borderless/windowed, refresh rate, VSync, FPS cap, safe console fallbacks. |
| 2 | URP Rendering Core | MSAA, HDR, Dynamic Resolution, SRP Batcher toggles; per-camera overrides where appropriate. |
| 3 | Anti-Aliasing | FXAA / SMAA / TAA per preset, motion vectors & sharpening notes, camera wiring. |
| 4 | Post-Processing | Bloom, Motion Blur, Depth of Field, Color Grading; Volume profile binding vs parameter toggles. |
| 5 | Shadows | Distance, cascades, resolution, soft shadows, realtime/baked flags; console guidelines. |
| 6 | Textures & Filtering | Global texture quality (mip limit), anisotropic filtering, mip bias & memory notes. |
| 7 | Lighting & Probes | Ambient modes, reflection probes, additional lights per object, light cookies tradeoffs. |
| 8 | Performance Switches | LOD bias, skin/shadow update, occlusion culling toggle; frame pacing tips. |
| 9 | Audio Mix & Devices | Master/Music/SFX/Voice sliders & mute, AudioMixer mapping, device hint (PC), OS panel helper. |
| 10 | Voice (Mic) | Mic device selection (PC), input gain, noise gate threshold, Push-to-Talk, monitor meter, netcode hook. |
| 11 | Input & Keybinding | Full rebinding UI, conflict detection, mouse sens/invert, gamepad dead-zones, multiple schemes. |
| 12 | Controller Icons | Auto-swap Xbox/PlayStation glyphs; glyph provider and prompt prefab; manual override. |
| 13 | Localization & Language | Unity Localization, language dropdown, per-language fonts (no fallback), persistence. |
| 14 | Accessibility & UI Scale | Subtitles (size/bg), color-blind filter (URP feature), UI scale, controller vibration. |
| 15 | Presets & Auto-Detect | Cohesive preset application, PC hardware Auto-Detect, final polish & QA. |
- Unity: 6000.2.3f1
- Render Pipeline: URP
- UI: uGUI (Canvas/RectTransform)
- Input: New Input System (PlayerInput / InputActionAsset)
- Persistence: Easy Save 3 (ES3) — required
- Inspector polish (optional): Odin Inspector — optional, editor-only
- Localization: Unity Localization package
- Audio: Unity AudioMixer (recommended)
🔗 Asset Store • Easy Save 3 – required • Odin Inspector – optional (guards via
#if ODIN_INSPECTOR)
Assets/
_Project/
Settings/
Core/ # Data models, services, applicators (runtime)
UI/ # uGUI controllers, rebind rows, preview widgets
ControllerGlyphs/ # Glyph DB + sets (Xbox/PlayStation)
Localization/ # Language catalog, font database/binder
Accessibility/ # Subtitles, UI scale, color-blind URP feature
Runtime/ # Bootstrap, PresetCoordinator, persistence glue
Editor/ # QA helpers & menu items (Editor-only)
Assembly Definitions Create two asmdefs for faster compile & clean deps:
_Project.Settings.Core→ references:UnityEngine.*,Unity.InputSystem,Unity.Localization,Unity.RenderPipelines.Universal.Runtime,Unity.Audio_Project.Settings.UI→ references Core +UnityEngine.UI
If Odin is present, add scripting define: ODIN_INSPECTOR.
-
Import this repository’s
Assets/_Project/Settingsfolder into a URP project (Unity 6000.2.3f1). -
Install packages: New Input System, Localization; import Easy Save 3 (required); Odin (optional).
-
Create
SettingsModelasset: Create → Settings → Settings Model. Set default preset (e.g., High). -
Bootstrap: In your startup scene, add an empty
SettingsManagerGameObject with:SettingsRuntime→ assign yourSettingsModelSettingsRegistry- Applicators you need (Display, Rendering, Shadows, Textures, Lighting, PostFX, Performance, Audio, Voice, Input, ControllerIcons, Localization, Accessibility)
PresetCoordinator(recommended)
-
URP Color-Blind (optional): Open your Renderer Data → Add Renderer Feature →
ColorBlindFilterFeature→ assignColorBlindFilter.shader. -
Audio: Create an AudioMixer with exposed params (
Master,Music,SFX,Voice). Assign toAudioApplicator. -
Input: Ensure a PlayerInput exists and an InputActionAsset is assigned to
InputApplicator. -
Localization: Create a LanguageCatalog & LanguageFontDatabase, add locales/fonts. Add
LocalizationApplicator+FontApplier. -
Controller Glyphs: Create ControllerGlyphSet(s) for Xbox/PlayStation → fill key→sprite → put into
ControllerGlyphDatabase. AddControllerGlyphResolver&ControllerIconsApplicator. -
UI: Use the provided UI controllers (e.g.,
DisplayMenuController,InputKeybindsMenuController,PresetsMenuController) or wire your own:- On change: write to
SettingsRuntime.Working, callruntime.SetDirty()andpresetCoordinator.MarkCustom() - Buttons: Apply →
runtime.ApplyAll(); Cancel →runtime.CancelChanges(); Defaults →runtime.LoadDefaultsIntoWorking()then apply.
- On change: write to
You now have a working, hot-applying Settings menu with persistence.
SettingsModel (SO)
Authoring-time defaults for every section (Display, Rendering, Audio, …).
SettingsState (POCO)
The full runtime state: Saved (from ES3) and Working (edited in UI).
SettingsRuntime
- Loads ES3 → builds
Saved&Working - Apply: validates, hot-applies via Applicators, then saves ES3
- Cancel: discards
Working→ reloadsSaved - Defaults: copies from
SettingsModel→WorkingSettingsRegistry Central registry of all ISettingsApplicators present. ISettingsApplicator Each section implements:Apply(state),ApplyPreset(preset, state),Validate(state). Presets Low/Med/High/Ultra/Custom tracked on the state. Manual edits → Custom. Auto-Detect (PC) Heuristic (VRAM, shader level, cores) → recommended preset + “why”.
Below are practical notes per module. All are hot-apply unless explicitly noted.
- Resolution & Mode: Windowed / Borderless / Fullscreen.
- Refresh Rate: uses current monitor modes.
- VSync: Off / Every V-Blank / Every 2nd V-Blank.
- FPS Cap:
Application.targetFrameRate(0 = uncapped). - Console: Usually borderless/fullscreen only, resolution set by platform; use safe fallbacks.
Limitations
- Consoles: don’t force desktop-style mode switches; keep to platform defaults.
- Some window managers ignore certain refresh requests.
- MSAA (0/2/4/8)
- HDR toggle
- Dynamic Resolution (DRS) on/off
- SRP Batcher on/off
- Per-Camera overrides where appropriate
Notes
- These write to URP Pipeline Asset or camera data and apply immediately.
- If overriding per camera, ensure consistent settings for UI camera(s).
- Post-AA: Off / FXAA / SMAA / TAA
- Sharpening for TAA (amount)
- Motion Vectors: ensure enabled for TAA stability.
Notes
- Configure in your Volume or per camera.
- TAA needs stable history; fast FOV swaps can cause ghosting.
- Bloom (intensity, threshold, scatter)
- Motion Blur (intensity, clamp, quality)
- Depth of Field (Gaussian/Bokeh; near/far ranges or f-stop/focal length)
- Color Grading (tonemap, exposure, contrast, saturation)
Approach Bind either the Volume profile (swap profiles per preset) or drive parameters individually to keep one profile.
- Distance, Cascade count (1/2/4), Resolution, Soft shadows
- Realtime vs Baked flags per preset
- Additional lights shadow limits
Notes
- Large distances & 4 cascades are costly; tune per platform.
- Baking: settings don’t retroactively change baked data.
- Global Mip Limit (0 = full, 1 = ½, 2 = ¼ …)
- Anisotropic: Off / Per-Texture / Forced On
- Mip Bias and Streaming budget (MB)
Notes
- Lower mip limit reduces VRAM and bandwidth.
- On consoles, prefer Per-Texture anisotropy plus author-tuned import settings.
- Ambient: Skybox / Trilight / Flat; intensity/colors
- Reflections: resolution, bounces, intensity
- Additional lights per object & per-vertex options
- Light cookies & atlas size
Tradeoffs Higher additional lights and cookies increase draw calls & bandwidth.
- LOD Bias
- Skinned Mesh/Shadow update mode
- Occlusion Culling toggle
Frame Pacing Prefer a stable cap with VSync or a sensible targetFrameRate for consistency.
- Master / Music / SFX / Voice sliders + Mute
- AudioMixer mapping via exposed parameters
- Output Device Hint (PC) + Open OS Sound Panel helper
Limitations
- Unity cannot force an OS output device; we store a preference and provide a button to open the OS dialog.
- On consoles, device selection is platform-managed.
- Mic device selection (PC) or “Default”
- Input Gain (-20 dB … +20 dB)
- Noise Gate Threshold (-80 dB … -20 dB)
- Push-to-Talk toggle + binding display
- Monitor Local (sidetone)
- Live meter + “transmitting” indicator
- Transport hook (
IVoiceTransportSink) for your netcode/VOIP
Limitations
- Consoles typically use platform party chat; in-engine Microphone is disabled / NOP.
- Control Schemes: Keyboard&Mouse / Gamepad / (yours)
- Sensitivity (mouse/gamepad), Invert Y, Dead-zones
- Interactive Rebind UI (per scheme)
- Conflict Detection (optional toggle)
- Save/restore overrides via JSON (ES3)
Tips
- Use the provided Rebind Row prefab/controller.
- Call
SnapshotBindingOverridesToState()before save if you rebind outside the menu.
- Auto-detect Xbox vs PlayStation
- ControllerGlyphDatabase with ControllerGlyphSet(s)
- GlyphImage ties an
InputActionto the right icon - Manual override (Auto/Xbox/PlayStation)
Notes
- Provide your sprites (256px+; sprite atlas recommended).
- On consoles, force platform glyph style.
- Unity Localization integration
- Language dropdown (codes:
en,ja,zh-Hans,fr,es,de,koby default) - Per-language fonts (no fallback) via
LanguageFontDatabase+FontApplier - Use System Language on First Run (optional)
Notes
- Mark uGUI
TextwithLocalizableFontfor automatic font swap. - If using TMP, adapt the applier to TMP FontAssets.
- Subtitles: enable, size (S/M/L), background opacity
- Color-blind filters: Off / Protanopia / Deuteranopia / Tritanopia (+ strength) — URP Renderer Feature
- UI Scale: 0.8× … 1.5× (root-level)
- Controller Vibration: enable + global intensity
Notes
- Accessibility values are not changed by graphic presets.
- Color-blind filter runs After PostProcessing by default.
- Quality Presets: Low / Medium / High / Ultra / Custom
- PresetCoordinator applies a preset across all applicators in a single pass.
- PC Auto-Detect: heuristic (VRAM, shader level, CPU cores) picks preset + “why” text.
- Custom: any manual tweak switches preset display to Custom.
✅ You Can
- Hot-apply most rendering & gameplay-facing settings mid-game.
- Persist all settings via ES3 with versioned schema and safe defaults.
- Rebind input (per scheme) with conflict detection and save overrides.
- Swap controller icons dynamically (device-aware) or force a style.
- Localize UI strings and swap fonts per language without TMP.
- Assist color-blind users with a URP render feature overlay.
- Scale your entire UI quickly and reliably.
- Use Apply/Cancel/Defaults UX with strong consistency.
⛔ You Cannot
- Force the OS audio output device change from Unity. (We store a preference + open OS panel.)
- Override platform-enforced display modes or resolution behavior on consoles.
- Retro-modify already baked lighting/shadows; those must be re-baked.
- Guarantee all URP toggles work in non-URP pipelines (this system targets URP).
Adding a new category (e.g., Gameplay):
-
Data: Add a
GameplaySectionclass (POCO) to Core/Sections. -
State: Add to
SettingsState(clone/equals), and defaults toSettingsModel. -
Applicator: Implement
GameplayApplicator : MonoBehaviour, ISettingsApplicator.ApplyPreset(preset, state)sets recommended defaults per preset if relevant.Validate(state)clamps ranges.Apply(state)hot-applies to runtime (services/components).
-
UI: Create a
GameplayMenuController– read/writeSettingsRuntime.Working.gameplay, callruntime.SetDirty()andpresetCoordinator.MarkCustom(). -
Hook: Add your applicator to the scene (SettingsManager). Done.
- Controller Navigation: Can traverse every control with gamepad; focus order is sane.
- Hot-Apply: Tweak a slider (e.g., shadow distance) → visible immediately.
- Apply/Cancel: Make changes → Apply persists; Cancel reverts to saved.
- Defaults: Resets to
SettingsModeland hot-applies. - Persistence: Relaunch → all values restored from ES3.
- Presets: Switch Low→Ultra; then change one field → preset becomes Custom.
- Auto-Detect (PC): Result & “why” matches expectations across hardware tiers.
- Localization: Change language; strings & fonts update; no tofu boxes.
- Accessibility: Color-blind filter visible; UI scale affects the entire UI; subtitles styling updates.
- Input: Rebinds succeed; conflicts are caught; JSON overrides persist.
- Audio: Mixer params change; mute works; OS device panel opens on button.
- Voice (PC): Device list populates; meter responds; PTT toggles “transmitting”.
- No effect when switching color-blind mode → Ensure
ColorBlindFilterFeatureis added to your Renderer Data and assigned the provided shader. - Controller icons don’t show → Check your ControllerGlyphDatabase is assigned to
ControllerGlyphResolver, and your GlyphSet has entries for keys likebuttonSouth,dpad/up, etc. - Bindings don’t persist → Confirm
InputApplicatorcallsLoadBindingOverridesFromJsonand that you Apply before exiting. - Fonts missing glyphs → Provide proper fonts per locale in
LanguageFontDatabase. There is no fallback by design. - Console builds → Lock icon style to platform; avoid windowed mode toggles; ensure any forbidden toggles are hidden/disabled.
PRs welcome!
- Keep code clean (namespaces, asmdefs, comments).
- Avoid per-frame allocations; prefer event-driven updates.
- Guard optional dependencies (
#if ODIN_INSPECTOR). - Update docs if you add a new section/applicator.
MIT License
Built for teams shipping cross-platform with Unity 6000.2.3f1 (URP). Includes production-grade patterns for presets, hot-apply, rebinding, localization, accessibility, and controller UX.