This commit is contained in:
2026-08-10 19:23:04 +02:00
commit 404d15a56c
134 changed files with 5374 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# 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 2030 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