Files
chameleon/Docs/GAME_DESIGN.md
T
adminandClaude Fable 5 2ec4e147b9 Update docs: acoustic taunt/whistle is implemented
Taunt sound plays on every radar ping (sweep + self-ping) on all
clients as positional 3D audio; move it from open questions to done
in GAME_DESIGN.md and note it in the README match-loop bullet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 19:14:24 +02:00

228 lines
14 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Chameleon — Game Design & Fortschritt
> Lebendes Dokument. Checkliste, was wir schon haben und was noch fehlt.
> Vorbild: **Meccha Chameleon** — aber **kein 1:1-Klon**. Wir picken die Mechaniken,
> die uns gefallen, und lassen den Rest weg oder machen es anders.
---
## 1. Referenz: Was ist Meccha Chameleon?
Online-PvP-Versteckspiel (Hide & Seek), 2–10 Spieler. Kurzüberblick der Mechaniken
(Quellen: Wikipedia, Steam-Store-Seite, Stand der Recherche):
- **Hider:** Bemalt seinen anfangs **reinweißen** Chamäleon-Körper, um mit der Umgebung
zu verschmelzen. Werkzeuge: **Farbrad** + **Pipette (Eyedropper)** zum Aufnehmen von
Umgebungsfarben. Zusätzlich **Posen** (z. B. zusammenrollen, hinlegen), um die Silhouette
an Objekte anzupassen. „Versteck, Pose und vor allem die malerische Geschicklichkeit" sind
der Schlüssel.
- **Seeker/Hunter:** Muss **alle Hider im Zeitlimit** finden. Hider können „taunten"
(pfeifen), um sich verräterisch bemerkbar zu machen; optional **erzwungenes Taunting**
in Intervallen.
- **Modi:** Standard-Hide-and-Seek, **Infection** (Gefangene wechseln die Seite), u. a.
- **Struktur:** Runden mit Zeitlimit, Sieg der Seeker, wenn alle gefunden wurden.
- Empfohlen **2–10 Spieler**, reines **Online-PvP**. Keine nennenswerten
Progressions-/Kosmetik-Systeme in der Store-Beschreibung erwähnt.
---
## 2. Unsere Vision (Abgrenzung)
- **Behalten / Stärke ausbauen:** das **Bemalen** als Kern-Mechanik (haben wir bereits,
sogar nahtfreies Mesh-Painting auf 3D) + **Bewegung über das Gewöhnliche hinaus**
(Wand-Klettern/Mantle ist bei uns schon drin und geht über Meccha Chameleon hinaus).
- **Entschieden:**
- **Reines Multiplayer-PvP.** Kein Singleplayer/PvE, keine Seeker-KI — Hider und Seeker
sind immer menschliche Spieler.
- **Keine automatische Tarnungs-Bewertung.** Wie gut eine Bemalung tarnt, entscheidet
allein das Auge des Seekers — das Spiel misst/wertet die Tarnung nicht.
- **Entschieden (seit letzter Fassung):**
- **Posen-System: ja** — ist umgesetzt (Silhouette anpassen).
- **Infection-artiger Modus: ja** — als **Conversion-Modus** umgesetzt (getroffener Hider
wird zum Hunter, statt nur „gefunden" zu sein).
- **Taunt: ja** — Radar-Selbst-Ping (E) **plus akustisches Taunt**: bei jedem Ping
(Sweep oder Selbst-Ping) spielt auf **allen** Clients ein positionsgebundener
Taunt-Sound an jedem gepingten Hider — das „erzwungene" Taunten kommt also mit
jedem Radar-Sweep automatisch
> **TODO (User):** Hier eintragen, was dir bei Meccha Chameleon gefällt und was nicht — danach
> schärfen wir Scope & Reihenfolge.
---
## 3. Checkliste — Was wir schon haben ✅
### Charakter & Bewegung
- [x] Third-Person **CharacterController** mit WASD-Bewegung (kamerarelativ)
- [x] **Sprung** + Schwerkraft
- [x] **Sprint** (Shift halten, eigener Speed-Multiplikator)
- [x] **Beschleunigung/Entschleunigung** (sanfter Anlauf/Ausrollen statt Snap)
- [x] **Slope-Sliding** (Abrutschen von zu steilen Flächen/Kanten)
- [x] **Wall-Climb**: Wände/Decken hochklettern (wand-relative Steuerung:
W ran/hoch, S weg+ablösen, A/D seitlich); **volumetrische SphereCast-Probes** —
hält auch dünne Bretter, weiche Kontakt-Normale an Kanten/Rundungen (kein Flackern)
- [x] **Mantle / Top-Out**: über die Oberkante ziehen statt droppen, an steilen
Schrägen mit Aufwärts-Hop drüber (kein Kanten-Flackern)
- [x] **Animator-Anbindung**: `Running`-Bool wird bei Bodenbewegung gesetzt
### Posen & Charakter
- [x] **Posen-System** (zusammenrollen, hinlegen) zum Anpassen der Silhouette
- [x] Finales Charakter-Modell + Rig
- [x] Animationen (Klettern, Springen, Posen) — **Laufen** bereits über den
`Running`-Animator-Bool angebunden
- [x] **Fall-Animation**: eigene Pose-Animation beim Fallen (Abwärts-Velocity über
Schwellenwert, nicht am Boden; pro Pose authorbar mit Idle-Fallback)
- [x] **Fell** (`FurShellRenderer`): Shell-basiertes Fur auf dem Body, färbt mit der
Bemalung mit
- [x] **Radiales Posen-Menü** mit Hotkeys (bei ≤ 2 Posen direktes Durchschalten) +
**gerenderte Pose-Icons** (eigene `Pose Icon`-Szene mit Capture-Pipeline,
Toon-Shader mit Outline)
### Bemalen (Kern der Camouflage-Idee)
- [x] **MeshPainter**: nahtfreies Bemalen direkt auf dem 3D-Mesh des Charakters
- [x] **GPU- und CPU-Pfad**, umschaltbar; Edge-Padding/Dilation gegen Naht-Linien
- [x] **Kugel-Brush** (3D-Distanz statt Box) mit **Rückseiten-Abweisung** über die
Flächen-Normale (`brushMaxSurfaceAngle`) — kein Durchmalen auf die Gegenseite
dünner Geometrie, kein Übergreifen an Nähten
- [x] Pinsel: **Farbe**, **Größe**, Masken, **Spray**, Texturauflösung, Grundfarbe
- [x] Shader: `MeshPaintBrush.shader`, `MeshPaintDilate.shader`, Preview-Shader
(Vorschau matcht die echte Landung)
- [x] **Farbwähler-UI** (HSV-Color-Picker) statt fester Inspector-Farbe
- [x] **Pipette / Eyedropper**: nimmt Albedo, Metallic/Smoothness und Emission aus der
Umgebung auf — auch von den Custom-/AVP-Shadern
- [x] Weitere Brushes (Größe per Hotkey/Slider, Masken/Muster)
- [x] **Undo** der Bemalung (Checkpoint-basiert, auch über das Netzwerk) — ein
separates Komplett-**Reset** ist bewusst nicht nötig (Undo deckt das ab)
- [x] **PBR-Kanäle malbar**: Metallic/Smoothness, **Höhe** (Occlusion-Kanal mit
Relief-Normal- und Parallax-Shading) und **Emission** (mit Intensitäts-Regler) —
pro Kanal zuschaltbar im Paint-HUD
- [x] **Camo-/Material-Regler**: **Brightness**, **Saturation**, **Half Lambert**,
**Specular Damp** sowie Occlusion-/Normal-/Parallax-Intensität — netz-repliziert;
Laufzeit-Werte überleben den Respawn, werden aber bewusst **nicht** auf Disk
persistiert (Session startet auf Authoring-Defaults)
- [x] **Painting-Library**: Bemalungen benannt **speichern/laden/löschen** (versionierte
Slots inkl. aller Regler; Laden wird an Mitspieler re-broadcastet)
### Kamera
- [x] **Cinemachine** 3.1.7 Third-Person **Orbit-Kamera** (Maus)
- [x] Zoom (Mausrad, **interpoliert**), Kollisionsvermeidung (**Deoccluder**)
- [x] **Geglättete Orbit-Rotation** (Tiefpass auf das Maus-Delta)
- [x] Cursor-Lock/-Logik je nach Modus
### Spiel-Struktur / Tooling
- [x] **GameModeManager** (erweiterbare State-Machine, Wechsel über das Overview-Menü)
- [x] **Player-Control-Modus** (Laufen + Kamera per Maus)
- [x] **Paint-Modus** (kein Movement, Linksklick malt, Rechtsklick hält Kamera-Dreh)
- [x] **First-Person-Modus** (Hunter: FP-Kamera + Schießen per Linksklick-Raycast)
- [x] **Free-Cam / Spectator-Modus** (gefundene/zuschauende Spieler beobachten frei)
- [x] **Overview-/Escape-Menü** (`OverviewMenu`, Esc/Tab): Icon-Buttons mit Hotkey-Hints,
Taunt-Button, Match-Results-Modal, kontextsensitiver Disconnect
- [x] **FrameRateLimiter** (FPS-Begrenzung, VSync-Handling)
- [x] **Settings-Persistenz** (`GameSettings`): Master-Volume- & Maus-Sensitivitäts-Slider;
Paint-HUD-Layout/Brush-Werte persistent (`PaintHud.json`)
- [x] **SkyboxEnvironmentUpdater**: Sky-Reflexion + Ambient ohne gebackenes LightingData
(Custom-Cubemap-Render, Intensity-Regler, separates Reflexions-Sky-Material möglich)
- [x] **Rendering**: URP **Deferred+** mit **HTrace WSGI** Global Illumination
(in der Lobby automatisch deaktiviert, `HTraceLobbyToggle`); handgeschriebene
**URP-Ports der AVP/ArchViz-Shader** (POM, Glass, Velvet, Curtains, DoubleSided,
Nature, Vegetation) inkl. GBuffer-/Deferred+-Fixes und HeroCutout-Support
- [x] **Concealment-Tooling**: `ConcealmentMeter` (volumetrische „wie tief steckt der Hider
in Geometrie"-Messung) + Collider-Baker (`ConcealmentColliderBaker`, VHACD, Skinned)
- [x] **Asset-Importer** (Editor): **Poly-Haven-Importer** (Texturen **und** Modelle —
Katalog-Browser mit Thumbnail-Grid, PBR-Download, automatisches URP/Lit-Material
inkl. Roughness→Smoothness-Repack + ARM-Fallback, FBX-Material-Remap) und
**ambientCG-Importer** auf geteiltem `WebAssets`-Framework
- [x] Weitere Editor-Tools: Pose-Icon-Capture (`PoseIconStage`), `PictureFrameBuilder`,
Normal-Map-Generator
- [x] Git initialisiert (Unity-`.gitignore` + `.gitattributes`), englische Commits
### Multiplayer (reines Online-PvP)
- [x] **Netcode for GameObjects** (NGO 2.13) als Netzwerk-Stack
- [x] **Host/Join**, Lobby-Szene + Match-Szene (`The Room`)
- [x] **Session-Browser** (UGS Sessions, `OnlineSessionBrowserUI`): Host / Liste
aktualisieren / Join per Klick; im Spiel als **Esc-Pause-Overlay** mit
kontextsensitivem Disconnect (Exit / Back-to-Lobby / Disconnect)
- [x] **Spieler-Synchronisation** (NetworkTransform, owner-authoritativ)
- [x] **Bemalung über das Netzwerk** (`PlayerPaintSync`: ServerRpc/ClientRpc/NetworkVariable,
Late-Join-Replay der Paint-Stamps)
- [x] **Rollen-Prefab-Varianten**: Hunter (groß, Sprint ×2, FP+Schießen) / Hider (klein)
- [x] **Spawn-Areas** über getaggte (konvexe) Collider: `SpawnArea`, rollen­spezifisch
`HunterSpawnArea` / `HiderSpawnArea` mit Fallback-Kette (Rolle → `SpawnArea` → Ring);
zufälliges Streuen per Rejection-Sampling innerhalb der Form
### Match-Loop (Hide & Seek)
- [x] **Server-autoritative State-Machine** (`MatchManager`, repliziert via Named Messages):
**Verstecken → Suchen → Auflösung → zurück zur Lobby**
- [x] **Pro-Phase-Timer** als Inspector-Properties in Sekunden (`hideDuration`,
`seekDuration`, `resolveDuration`)
- [x] **Rollenabhängige Sichtbarkeit** (jeder Client rechnet lokal aus Rolle/Phase/Modus):
Hider-Meshes werden je nach Modus/Phase für Hunter (bzw. andere Hider) ausgeblendet
- [x] **Hunter-Schießen**: Raycast aus FP-Kameramitte, Cooldown (`shootCooldown`),
Reichweite (`shootRange`), server-validierter Treffer
- [x] **Found-State** (`NetworkVariable<bool>`, server-write): getroffener Hider →
Mesh bei allen aus → nur noch **Spectator-Freecam**
- [x] **Früh-Ende der Suchphase**, wenn alle Hider gefunden/konvertiert sind
- [x] **Match-Start per Trigger-Zone** in der Lobby (`StartMatchTrigger`): die Match-Authority
stellt sich in den Bereich; server-seitiger Overlap-Poll (funktioniert auch für
Remote-Authority ohne Rigidbody)
- [x] **Radar-Pings**: Intervall-Sweep in der Suchphase — jeder un-gefundene Hider blippt
auf dem **Hunter-Radar** (Overlay-Radar mit Fade); HUD zeigt Countdown zum nächsten Sweep
- [x] **Selbst-Ping / Taunt** (E): Hider verrät sich freiwillig mit einem sofortigen Radar-Blip
- [x] **Akustisches Taunt/Pfeifen**: bei jedem Radar-Ping (Sweep und Selbst-Ping) spielt auf
**allen** Clients (Hunter, Hider, Zuschauer) ein 3D-Taunt-Sound an der Position jedes
gepingten Hiders (Kopfhöhe, bei mehreren Treffern zeitlich gestaffelt) — Blips bekommen
nur Hunter, den Sound hört jeder
- [x] **X-Ray-Reveal** (Umriss-Glow durch Wände): in der Auflösung, als kurzer Schuss-Flash
und als **Embedded-Schutz** — steckt ein Hider tiefer als die Schwelle in Geometrie
(`ConcealmentMeter`), wird er für alle enthüllt (Anti-Cheese)
- [x] **Conversion-Statuen** (`MatchStatue`): eingefrorene, bemalte Statue jedes konvertierten
Hiders (Ort/Pose/Bemalung) erscheint zur Auflösung
- [x] **Zwei Match-Modi** (`matchMode`, Inspector):
- **Classic** — getroffener Hider wird „gefunden" (Freecam)
- **Conversion** (Infection) — Hider blind füreinander; getroffener Hider **wird Hunter**
(echte Hunter-Variante, **an Ort und Stelle**, sauberes Reveal via `conversionRevealDelay`)
- [x] **Match-HUD** (`MatchHud`, uGUI `MatchHudCanvas`): Phase + Countdown, Rollen-Zähler,
Hunter-Crosshair, Radar-Sweep-Countdown
- [x] **Ergebnis-Screen + Sieg-Auswertung** (`MatchResultScreen`, uGUI `MatchResultCanvas`):
der Server friert bei Seek-Ende das Ergebnis ein (Hunter gewinnen bei „alle
gefunden/konvertiert", Hider bei Timeout mit Überlebendem) und repliziert es an alle
Clients (inkl. Late-Joiner); die Auflösung zeigt Sieger-Banner + Spielerliste
(Status Gefunden/Konvertiert/Überlebt, Überlebenszeit, gefunden von wem)
- [x] **Kamera-Occlusion-Fade** (`HeroCutout`): kegelförmiger weicher Cut (radial + axial),
konstante Bildschirm-Lochgröße, raycast-getriggert
---
## 4. Checkliste — Was noch fehlt ❌
### Multiplayer
- [ ] **Matchmaking-Ausbau**: Join-Codes / Relay / private Sessions
(Session-Browser mit Host/Join existiert bereits)
- [ ] Robustheit: Reconnect, Host-Migration, Disconnect-Edge-Cases im Match
### Welt & Präsentation
- [ ] **Maps / Level-Design** ausbauen (mehr Verstecke, abwechslungsreiche
Oberflächen/Farben) — Szenen `Lobby`, `The Room`, `Test Map` existieren als Basis
- [ ] **UI-Ausbau**: Feinschliff — Match-HUD, Ergebnis-Screen, Paint-HUD (inkl. Library),
Session-Browser und Overview-/Escape-Menü sind bereits uGUI
- [ ] **Audio**: SFX (Schritte, Klettern, Schuss), Musik — Taunt-Sound existiert bereits
- [ ] **Beleuchtung / Art-Direction** finalisieren (HTrace WSGI GI + Deferred+ und
Sky-Reflexion/Ambient via `SkyboxEnvironmentUpdater` stehen; Material-/Map-Look
wird gerade mit den Poly-Haven-/ambientCG-Sets ausgebaut)
---
## 5. Vorgeschlagene nächste Schritte (Reihenfolge zur Diskussion)
Der Kern-Loop steht (Netcode, Session-Browser, Rollen, Phasen, beide Modi, Schießen/Konversion,
Radar, X-Ray-Reveal, Statuen, Ergebnis-Screen). Die nächsten Schritte machen ihn **rund** und
**präsentabel**:
1. **Map-/Level-Design** vertiefen: mehr Verstecke und farblich abwechslungsreiche
Oberflächen, damit die Tarnung wirklich zählt.
2. **Politur:** Audio (Schritte/Schuss; Taunt steht bereits), Art-Direction/Beleuchtung.
3. **Robustheit:** Reconnect / Host-Migration / Disconnect-Edge-Cases.
> Reihenfolge bewusst so, dass aus dem funktionierenden Prototyp ein **fühlbar fertiges**
> Match wird, bevor wir Breite (mehr Modi/Maps) draufsetzen.