# Architektur ## Autoritätsmodell ``` Client (Owner) Server (Host) ────────────── ───────────── Bewegung ───── prediction ──▶ NetworkTransform (einzige Client-Autorität) Raycast ───── ServerRpc ───▶ Distanz prüfen ──▶ IInteractable.Interact() UI-Anzeige ◀─── NetworkVariable ─── Geld / Bestand / Preise NPC-Optik ◀─── NetworkTransform ── NavMesh-Simulation (nur Server) ``` **Merksatz:** Wenn eine Variable Auswirkung auf Geld oder Bestand hat, darf sie nur auf dem Server geschrieben werden. ## Warum NPCs nicht jeden Frame ticken `CustomerAgent` läuft mit `TickInterval = 0.25 s`. Bei 20–30 Kunden spart das den Großteil der Server-CPU, ohne dass man es sieht — Laufwege macht ohnehin der NavMeshAgent. Wer die KI reaktiver braucht, senkt das Intervall gezielt für den Kunden an der Kasse, nicht global. ## Netzwerk-Traffic - Produkte: nur `int ProductId`, nie Referenzen oder Strings. - `ShelfSlot`: 3 NetworkVariables (Produkt, Menge, Preis). Bei vielen Fächern später zu einem gebündelten `NetworkList` pro Regal zusammenfassen. - NPC-Zustand: ein Enum + ein Float für Sprechblasen. Mehr braucht der Client nicht. ## Manuelles Netzwerk-Testen 1. `File > Build Settings > Build` (Development Build an) 2. Build starten → "Host" 3. Im Editor Play drücken → "Join" Testfälle, die regelmäßig brechen: - Zwei Spieler greifen gleichzeitig aufs selbe Regalfach - Client verlässt das Spiel, während er Ware trägt - Kunde verlässt die Schlange, während ein Spieler gerade scannt - Client mit hoher Latenz interagiert am Rand der Reichweite