39 lines
1.7 KiB
Markdown
39 lines
1.7 KiB
Markdown
# 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
|