feat(presentation): Pausemenü und ein Riegel für modale Oberflächen (#105, #102) - #113
Merged
Conversation
#105, #102) Paket 21.8, das Beta-Tor: bisher kam ein Spieler aus einer laufenden Runde nicht heraus, und wer ueber das Matchende ins Hauptmenue zurueckging, sah das Cockpit ueber dem Menue stehen. DER RIEGEL IST DIE UI-WURZEL, KEIN KATALOG. SetGameplayLayerActive schaltet jetzt das GameObject, auf das der Szenengenerator ohnehin alle In-Match- Komponenten legt, statt zweier namentlich genannter. Damit ist jede kuenftige HUD-Komponente automatisch abgedeckt, ohne je genannt zu werden — die Sorge im dortigen Docstring, ein Katalog verrotte mit der naechsten Komponente, ist damit strukturell beantwortet statt bestaetigt. Das Kamera-Rig bleibt ein eigener Schalter, es liegt auf der Main Camera und nicht auf der Wurzel. FUER DEN PAUSEZUSTAND EIN FLAG, denn dort bleibt die Wurzel an. ModalSurfaceLink publiziert pro Frame 'ein modales Fenster besitzt die Eingabe' — ausdruecklich nicht 'das Match laeuft nicht', die drei Zustaende bleiben getrennt. Kein Latch mit Gedaechtnis: ein haengendes true waere ein Eingabe-Deadlock, deshalb setzt OnDisable zurueck. Drei Fehler aus dem Audit fallen damit mit: - Der Klick auf 'Hauptmenue' selektierte eine Einheit HINTER dem Panel und erzeugte damit selbst die Auswahl, die danach ueber dem Menue stand - Ein armierter Bau-Ghost ueberlebte den Menuewechsel und wanderte in die naechste Runde - Die P-Pause hatte keinerlei Eingabe-Riegel: Hotkeys und Harvester-Eskorte feuerten in den gestoppten Kernel 'Einstellungen' ist bewusst nur ein Hinweis auf das Hauptmenue statt einer zweiten, driftenden Maske: die Bestandsmaske haengt fest im Menue-Screen samt Key Art. DebugHud unangetastet; nachgesehen und verhaltensgleich (siehe #107). Umsetzung durch den Kimi-K3-Worker. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e nachziehen Bootstrap.unity neu erzeugt — deckt jetzt alle vier Generator-Aenderungen des Tages ab (21.2, Versionsanzeige, Baubereich-Overlay, Pausemenue). Geprueft: PauseMenuHud, VersionBadge und BuildZoneOverlayView sind in der Szene. Neuer PlayMode-Test PauseMenuTests pinnt die zwei Fallen, die heute wirklich zugeschnappt sind: dass das Pausemenue ueberhaupt in der committeten Szene landet (sie war einmal acht Tage stale, waehrend der Generator dreimal zog), und dass ModalSurfaceLink beim Weg ins Hauptmenue kein haengendes true hinterlaesst — das waere ein Eingabe-Deadlock ohne laufende Komponente, die ihn noch loesen koennte. FieldReservePickTests angepasst: er startet das Match direkt an MainMenuController vorbei, und seit dem Wurzel-Schalter ist RtsDeviceInput dabei inaktiv — kein Update, kein gebundener Dispatcher, Null-Referenz in jedem Pick-Pfad. Der Test schaltet die Wurzel jetzt selbst ein und behauptet vorher, dass sie aus ist, damit die Zeile ehrlich bleibt, falls der Schalter je woanders hinwandert. Das Produktverhalten ist richtig und bleibt ungeaendert; eine Null-Absicherung im Produktivcode haette echte Verdrahtungsfehler verschluckt. Nachweis: EditMode 605/605, PlayMode 12/13 — der eine rote ist NetworkPanel_ValidatesMasks..., auf main bereits rot (#110). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Schliesst #105 und #102. Paket 21.8 — das Beta-Tor: ohne sauberes Verlassen einer Runde findet kein Betatest statt.
Der Riegel ist die UI-Wurzel, kein Katalog
SetGameplayLayerActiveblendete bisher zwei namentlich genannte Komponenten aus und verliess sich im Docstring darauf, dass jede andere HUD-Komponente "ohne laufendes Match früh zurückkehrt". Auf dem Rückweg stimmt das nicht:ReturnToMenupausiert das Match, es beendet es nicht — Runner, Entitäten und Auswahl leben weiter, und die Baukarte zeichnet über das Menü.Jetzt schaltet die Methode das GameObject, auf das der Szenengenerator ohnehin alle In-Match-Komponenten legt. Damit ist jede künftige HUD-Komponente automatisch abgedeckt, ohne je genannt zu werden — die Sorge im dortigen Docstring ist strukturell beantwortet statt bestätigt. Das Kamera-Rig bleibt ein eigener Schalter; es liegt auf der Main Camera, nicht auf der Wurzel.
Für den Pausezustand ein Flag, denn dort bleibt die Wurzel an
ModalSurfaceLink(Nova.Gameplay, nach demHudPointerLink-Vorbild — keine neue Assembly-Kante) publiziert pro Frame "ein modales Fenster besitzt die Eingabe", ausdrücklich nicht "das Match läuft nicht". Die drei Zustände bleiben getrennt: kein Match, pausiert, gelaufen-und-zurück.Kein Latch mit Gedächtnis, und
OnDisablesetzt zurück: ein hängendestruewäre ein Eingabe-Deadlock für den Rest der Sitzung — keine Auswahl, keine Befehle, kein Kamerarand, und keine laufende Komponente mehr, die es je klären könnte.Drei Fehler fallen damit mit
IsPointerOverHud; ein Klick auf "Hauptmenü" lief zuerst durch die Auswahl-Logik und markierte eine Einheit hinter dem Panel — genau die Auswahl, die danach über dem Menü stand.Das Pausemenü
ESC oder P. Fortsetzen, Zum Hauptmenü, Spiel beenden. ESC ist geschichtet: bricht erst eine armierte Geste ab, öffnet das Menü beim nächsten Druck — abgesichert über die vorhandene
DefaultExecutionOrder(-200)vonRtsDeviceInput. Resultat- und Netzwerk-Panel schlagen das Pausemenü; es stapelt sich nicht darauf."Einstellungen" ist bewusst nur ein Hinweis auf das Hauptmenü. Die Bestandsmaske hängt fest im Menü-Screen samt Vollbild-Key-Art; sie mitten im Match zu zeigen hiesse, den ganzen Menü-Screen über das Spiel zu legen. Lieber ein Eintrag weniger als eine zweite Maske, die auseinanderdriftet.
Die Szene ist mit drin — und das ist wesentlich
Bootstrap.unitylag vom 2026-08-08 bis heute unverändert im Repo, während der Generator sich dreimal bewegt hatte. Eine nur im Generator verdrahtete Komponente ist im Spiel nicht vorhanden — Code gemergt, CI grün, auf dem Schirm nichts. Die Szene ist einmal neu erzeugt und deckt jetzt alle vier Generator-Änderungen des Tages ab; geprüft, dassPauseMenuHud,VersionBadgeundBuildZoneOverlayViewdarin stehen.Der neue
PauseMenuTestspinnt genau diese Falle plus den Deadlock-Fall.Nachweis
NetworkPanel_ValidatesMasks…) ist aufmainbereits rot, Gegenprobe gefahren, siehe PlayMode-Test NetworkPanel_ValidatesMasks… ist auf main rot — und niemand sieht es, weil die CI keine Unity-Tests fährt #110dotnet test tools/Nova.SimRunner.Tests— 726/726 grünFieldReservePickTestsangepasst: er startet das Match am Menü vorbei, wobei die HUD-Wurzel aus bleibt undRtsDeviceInputnie einUpdateläuft. Der Test schaltet sie jetzt selbst ein und behauptet vorher, dass sie aus ist. Das Produktverhalten ist richtig und unverändert — eine Null-Absicherung im Produktivcode hätte echte Verdrahtungsfehler verschlucktSchreibhoheit
Scripts/Presentation/UI/,Scripts/Gameplay/UI/,Assets/_Project/Editor/— Maintainer-Strang.DebugHud.csunangetastet und nachgesehen (#107 geschlossen).🤖 Generated with Claude Code