Debugging und Profiling
Game3D-Encounter-Diagnose
Dungeon-Runs mit Developer Seed zeigen kurze, nicht-blockierende Encounter-Hinweise. Der einzelne Controller-Export EnableEncounterDevelopmentNotifications ist der lokale Schalter; andere Seed-Arten unterdruecken diese Hinweise zentral. Fuer eine komplette Spur vom Raumeintritt bis zum Reward nach event=EncounterFlow. filtern und die Felder runId, roomId und encounterId korrelieren. Reihenfolge und Fehlerbilder stehen in Encounters, Gegner und Bosse.
Werkzeuge
- Godot Debugger: Errors, Orphan Nodes, Monitors und Network Profiler.
- Remote Scene Tree/Inspector: tatsächliche Nodes, Transforms, Collision und Signals.
- Godot Profiler: Script/Physics/Rendering, Frame Time, Draw Calls und Memory.
- Rider: Breakpoints in Bootstrap, Run-Controller, Netzwerk-RPCs und Services.
NetworkStatsOverlay-Autoload: Laufzeit-Netzwerkdaten.- Containerlogs:
docker compose ... logs -f <service>. - Dungeonlogs:
DungeonRun3DControllerloggt Seed, Hash, Template, Rotation, Doors, Roomwechsel und Objectives.
Projektspezifische Hot Paths
PlayerController._PhysicsProcess, Movement3DComponent.Move, DungeonEnemy3D._PhysicsProcess, HubNetworkSync.ServerUpdateHubPlayer, Remote-Avatar-Interpolation, Projectiles und Replay-Checkpoint-Erfassung. Prüfe Allokationen, LINQ, JSON-Serialisierung, Node-Suchen und ungedrosselte Logs. Template-/Catalog-Validierung ist Setup und kein Frame-Hot-Path.
Diagnosepfade
| Symptom | Zuerst prüfen | Typische Ursache |
|---|---|---|
| Spieler jittert | HubNetworkSync, MovementValidator, Remote-Avatar, Netzwerkoverlay |
falsche World-Unit-Konvertierung, Inputintervall, HardSnap/TeleportThreshold, Packet loss |
| Waffe feuert nicht | PlayerController.Authority, AdvancedWeaponController, attack_primary |
Input-Lock, Combat deaktiviert, Authority-Command abgelehnt, kein aktives Loadout |
| Raum generiert nicht | DungeonRun3DController.GenerateWorld, DungeonGeneratorV3, Catalog-Fehlertext |
falscher Mode, ungültiger Seed/Profile, kein exakter Template-Kandidat |
| Tür bleibt geschlossen | RuntimeDoor3D, RuntimeDoorRoomLockController, RoomDoorSocket3D |
Encounter nicht complete, Socket mit Runtime-Door verwechselt, Startgate offen |
| Gegner spawnt nicht | EncounterSpawnRequestFactory, RoomEncounterRuntime3D, Markerindex |
Objective enthält keinen Initial-Gegner, Marker-ID fehlt, Raum noch nicht aktiviert |
| Boss zählt nicht | EnemyRuntimeContext.IsBoss, DungeonObjectiveTracker.RegisterEnemyKilled |
EnemyInstanceId stimmt nicht mit RequiredBossIds, Died-Handler nicht gebunden |
| Exit bleibt zu | DungeonObjectiveTracker3D HUD, DungeonExitController3D |
Bossquote oder Enemy-Points nicht erfüllt; DEV 50 %, Standard 80 % |
| Loadout ungültig | LoadoutValidationIssue.Code |
Locked/denied, falscher Mod-Slot, inkompatibel, Mastery-Tierkonflikt |
| Unlock sichtbar, Waffe gesperrt | UnlockService, Snapshot, RequiredUnlockId |
falsche stabile ID oder Snapshot nicht persistiert; Backend fehlt |
| Replay weicht ab | Seed, RunDefinition-/Policy-/Loadout-Hash, Tick-/Eventreihenfolge, Checkpoints | Capability-Gate, fehlende Spawn-/Hazard-Events oder Client-/Nakama-Schema nicht synchron |
| Client verbindet nicht | Main-Menu-Status, Nakama- und Registrylogs | Auth-Key/URL, kein joinbarer Hub, ENet-Port/PublicHost falsch |
| Release verbindet nicht | Production-Config und RuntimeConfigValidator |
Placeholder-Key, HTTP/Loopback oder deaktivierter Replay-Upload |
Dungeon deterministisch untersuchen
Nutze DungeonTemplateIntegrationTest.tscn mit TestSeed = template-integration-01. Vergleiche DungeonHash, Template-ID, Rotation und offene Sockets zwischen Läufen. Für große Layouts verwende einen normalen/daily/manual Seed; Developer-Seeds wählen bewusst das kleine Profil.
Siehe Troubleshooting, Multiplayer und Raumtemplates.