initial
This commit is contained in:
@@ -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 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
|
||||
@@ -0,0 +1,36 @@
|
||||
# Design-Kern
|
||||
|
||||
## Der Loop
|
||||
Bestellen → Einräumen → Bepreisen → Beraten → Kassieren → Ausbauen
|
||||
|
||||
## Was das Spiel von anderen Shop-Sims unterscheidet
|
||||
|
||||
**1. Komfort als Ressource.**
|
||||
Kunden haben einen Komfortwert. Enge Gänge, Personal, das ungefragt danebensteht,
|
||||
und Regale mit Sichtachse zum Schaufenster senken ihn. Fällt er unter 25 %, legt
|
||||
der Kunde die Ware zurück und geht. Das macht *Ladenlayout* zur zentralen
|
||||
Designentscheidung — nicht Regalfläche, sondern Blickachsen.
|
||||
|
||||
**2. Beratung statt bloßem Kassieren.**
|
||||
Kunden umschreiben, was sie suchen. Der Spieler leitet daraus die Kategorie ab.
|
||||
Treffer = größerer Warenkorb + Stammkunde. Fehlgriff = peinliche Stille und ein
|
||||
Kunde, der schneller geht.
|
||||
|
||||
**3. Sortimentspolitik.**
|
||||
Wellness zieht Laufkundschaft mit kleiner Marge. Specialty bringt Marge, verlangt
|
||||
aber Diskretion und Beratung. Wer beides mischt, braucht räumliche Trennung.
|
||||
|
||||
## Koop-Rollen (Anspielung an Overcooked in Stoßzeiten)
|
||||
| Rolle | Aufgabe |
|
||||
|----------|--------------------------------------|
|
||||
| Kasse | Scannen, Schlange abarbeiten |
|
||||
| Lager | Kisten holen, Regale auffüllen |
|
||||
| Beratung | Kunden mit `SeekingAdvice` bedienen |
|
||||
| Einkauf | Bestellungen, Preise, Layout |
|
||||
|
||||
Die Rollen sind nicht hart zugewiesen — die Rush-Kurve erzwingt Arbeitsteilung
|
||||
von selbst.
|
||||
|
||||
## Ton
|
||||
Trocken, situativ, nie anzüglich. Die Komik entsteht aus Verlegenheit und
|
||||
Zeitdruck, nicht aus dem Produkt. Siehe CLAUDE.md §7.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Roadmap
|
||||
|
||||
## Meilenstein 0 — Editor-Setup (manuell, nicht durch Claude Code)
|
||||
- [ ] Unity 6 LTS Projekt anlegen, `Assets/Scripts` einhängen
|
||||
- [x] Package Manager: `com.unity.netcode.gameobjects`, `com.unity.ai.navigation`
|
||||
- [ ] Szenen `Boot` und `Shop` anlegen, NetworkManager konfigurieren
|
||||
- [ ] Prefabs: Player, Customer, ShelfSlot, CashRegister — alle mit NetworkObject
|
||||
- [ ] 8–10 `ProductDefinition`-Assets + `ProductCatalog` befüllen
|
||||
|
||||
## Meilenstein 1 — Vertikaler Schnitt (Singleplayer-Host)
|
||||
- [x] Kunde spawnt, geht zu einem Regal, nimmt Ware, zahlt, verlässt Laden
|
||||
- [x] `CustomerAgent.UpdateBehaviour()` ausimplementieren (aktuell TODO)
|
||||
- [x] Einkaufsliste: Produktwahl anhand Kategorie + Preis (`PricingService`)
|
||||
- [x] Regal-Auffüllen aus Lagerkiste (`StorageCrate`, `PlayerHands`)
|
||||
|
||||
## Meilenstein 2 — Koop
|
||||
- [ ] Zweiter Spieler joint, beide sehen dieselben Bestände
|
||||
- [ ] Race Conditions am Regal und an der Kasse abfangen
|
||||
- [ ] Steam-Lobby via Facepunch.Steamworks + Unity Relay
|
||||
- [ ] Reconnect: Spieler trägt Ware, verbindet neu → Ware zurück ins Lager
|
||||
|
||||
## Meilenstein 3 — Substanz
|
||||
- [ ] Beratungs-Minispiel (Kundenandeutung → passende Kategorie)
|
||||
- [ ] Bestellsystem mit Lieferzeit (`SupplierService`, noch nicht angelegt)
|
||||
- [ ] Tagesabrechnung, Miete, Personalkosten
|
||||
- [ ] Laden-Upgrades: Umkleide, Vorhang, zweite Kasse, Regalreihen
|
||||
- [ ] Sichtachsen-System (`ExposedToStreet` automatisch aus Geometrie ableiten)
|
||||
|
||||
## Meilenstein 4 — Release-Vorbereitung
|
||||
- [ ] Speichern/Laden (JSON, serverseitig)
|
||||
- [ ] Steam-Seite, Age-Gate, Rating-Fragebogen (siehe CLAUDE.md §7)
|
||||
- [ ] Controller-Support, Rebinding
|
||||
- [ ] Lokalisierung DE/EN
|
||||
Reference in New Issue
Block a user