Jedes Projekt kommt hier an. Du hast ein Spiel, du hast Abilities, und jetzt brauchst du ein Menü, in dem jemand die Musik leiser dreht und auf Fenstermodus umschaltet. Sieht nach einem Wochenende UMG aus.
Es ist kein Wochenende UMG — aber ein guter Teil des Grundes ist, dass Anfänger Systeme nachbauen, die die Engine längst hat. Hier die Karte: was gratis ist und was nicht.
GameUserSettings ist bereits dein Settings-Objekt
Bau kein SaveGame für Grafik-Einstellungen. UGameUserSettings existiert, ist ein Singleton, schreibt sich selbst in GameUserSettings.ini, und deckt Auflösung, Fenstermodus, V-Sync, FPS-Limit und die fünf Scalability-Gruppen schon ab.
Die komplette Grafik-Hälfte deines Menüs ist das hier:
CB0
ApplySettings schreibt die ini. LoadSettings liest sie. Du schreibst keine einzige Zeile Persistenz-Code.
Für das Auflösungs-Dropdown: keine harte Liste — frag die Plattform über GetSupportedFullscreenResolutions und füll daraus. Eine hardcodierte Liste ist der Weg zu einem Spiel, das die native Auflösung von jemandem nicht kann.
Scalability: fünf Gruppen, fünf Integer
View Distance, Anti-Aliasing, Post Processing, Shadows, Textures, Effects, Foliage, Shading. Jedes ist ein Integer 0–3 (Low/Medium/High/Epic), und GameUserSettings hat für jedes einen Getter und Setter. Dein "Qualität"-Preset ist SetOverallScalabilityLevel(2).
Ein wirklich nützlicher Trick: RunHardwareBenchmark() gefolgt von ApplyHardwareBenchmarkResults() gibt dir sinnvolle Defaults für die Maschine, auf der das Spiel tatsächlich läuft. Zwei Nodes, und die Qualität beim ersten Start ist kein Ratespiel mehr.
Audio: Sound Classes und ein Sound Mix
Die Volume-Slider-Frage kommt ständig, und die Antwort ist nie "Lautstärke auf der Audio-Component setzen".
Leg Sound Classes an: Master, Music, SFX, Voice. Weis jedem Sound eine zu. Leg einen Sound Mix an, der sie referenziert. Dann:
CB1
Ein Node pro Slider. Lautstärke-Änderungen greifen auch bei schon laufenden Sounds.
Der Haken, den keiner erwähnt: GameUserSettings speichert deine Audio-Werte nicht. Diese Hälfte speicherst du selbst — ein kleines SaveGame oder ein config-gestütztes UObject mit vier Floats. Das ist die Grenze: Engine macht Grafik, du machst Audio und Gameplay.
Key-Rebinding: erst Engine-Version prüfen
Hier verbrennt dir das Internet den Abend. Die meisten Rebinding-Tutorials sind älter als UE 5.3 und beschreiben ein eigenes System auf Basis der alten Input-Mappings.
Seit UE 5.3 bringt Enhanced Input User Settings mit: Enhanced Input User Settings in den Project Settings aktivieren, deine Input Actions als Player Mappable markieren (sie brauchen einen Player-Mappable-Key-Settings-Eintrag mit Namen), und du bekommst EnhancedInputUserSettings mit MapPlayerKey / UnMapPlayerKey / ResetKeyProfileToDefault samt eingebautem Speichern.
Vor 5.3 schreibst du das selbst gegen InputMappingContext und legst die Overrides in deinem eigenen Save ab. Gleiches Menü, fünffacher Aufwand. Wenn du auf 5.3+ bist und einem 2022er-Tutorial folgst: stopp und such nochmal.
Die andere Hälfte vom Rebinding ist das "drück eine Taste"-Abfangen. UMG gibt dir OnKeyDown auf einem fokussierten Widget — Keyboard-Focus setzen, Event fangen, den FKey an MapPlayerKey geben. Gamepad nicht vergessen: das ist ein anderes Device und braucht einen eigenen Slot.
Plugin tip
Alles oben ist vielleicht fünf Stunden Verkabelung — und danach ein Leben lang kaputt, sobald du eine Einstellung dazunimmst.
FoxSettings ist ein datengetriebenes Settings-Menü: du definierst Einstellungen als Daten, es baut das UMG, wendet auf GameUserSettings an, macht das Sound-Class-Routing und das Enhanced-Input-Rebinding, und speichert. Audio · Graphics · Gameplay · Controls. Optional, aber es ist dasselbe Menü, das jedes Projekt braucht und keiner zweimal schreiben will.Apply, Revert, Confirm
Das Muster, das Spieler erwarten und Anfänger überspringen: eine Auflösungsänderung darf nicht sofort endgültig sein. Änderung anwenden, 10-Sekunden-Countdown-Dialog zeigen, zurücksetzen wenn keiner klickt. GameUserSettings gibt dir SetScreenResolution + ApplyResolutionSettings getrennt von ConfirmVideoMode und RevertVideoMode — genau dafür. Jemand wählt einen Modus, den sein Monitor nicht kann, und dein Spiel ist trotzdem nicht tot.
Häufige Fehler
- Ein eigenes SaveGame für Grafik-Einstellungen. Du hast
GameUserSettingsschlecht nachgebaut. Löschen. - Hardcodierte Auflösungsliste. Plattform fragen.
- Lautstärke auf einzelnen Audio-Components. Sound Classes und ein Sound Mix, sonst jagst du Slider bis in alle Ewigkeit.
- Einem Pre-5.3-Rebinding-Tutorial auf 5.3+ folgen. Du schreibst ein System, das die Engine hat.
- Kein Confirm/Revert beim Video-Modus. Eine falsche Fullscreen-Wahl und der Spieler kommt nicht zurück.
- Bei jedem Slider-Zug alles anwenden.
ApplySettingsschreibt auf die Platte. Beim Commit anwenden, nicht im Tick.
30-Sekunden-Recap
GameUserSettingsist die Grafik-Hälfte — Auflösung, Fenstermodus, V-Sync, FPS-Limit, Scalability. Persistiert sich selbst.RunHardwareBenchmarkliefert echte Defaults beim ersten Start.- Audio sind Sound Classes + ein Sound Mix, gespeichert von dir. GameUserSettings macht das nicht.
- Key-Rebinding ist ab 5.3 eingebaut über Enhanced Input User Settings. Version prüfen bevor du irgendeinem Tutorial folgst.
- Unterstützte Auflösungen abfragen, nie hardcoden.
- Video-Modus braucht Apply → Confirm → Revert mit Timeout.
Nächsten Sonntag: Level-Streaming-Grundlagen — World Partition vs Sublevel vs Streaming-Volumes, und wie du wählst, ohne deine Welt zweimal zu bauen.
— Marco
Comments
Leave a comment