202 lines
12 KiB
Markdown
202 lines
12 KiB
Markdown
# 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).
|
||
- **Noch offen / Geschmacksfrage:**
|
||
- Taunt: der **Radar-Selbst-Ping** (E) ist umgesetzt (Hider verrät sich freiwillig auf dem
|
||
Hunter-Radar); ob zusätzlich ein **akustisches Pfeifen** (ggf. erzwungen) kommt, ist offen
|
||
|
||
> **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
|
||
|
||
### 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] Pinsel: **Farbe**, **Größe**, Texturauflösung, Grundfarbe (Inspector)
|
||
- [x] Shader: `MeshPaintBrush.shader`, `MeshPaintDilate.shader`
|
||
- [x] **Farbwähler-UI** (Farbrad/Color-Picker) statt fester Inspector-Farbe
|
||
- [x] **Pipette / Eyedropper**: Umgebungsfarbe per Klick aufnehmen
|
||
- [x] Weitere Brushes (Größe per Hotkey/Slider, evtl. Muster/Texturen)
|
||
- [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 und **Höhe** (Occlusion-Kanal mit
|
||
Relief-Normal- und Parallax-Shading) — pro Kanal zuschaltbar im Paint-HUD
|
||
- [x] **Camo-Regler**: **Brightness** (generelle Exposure) + **Saturation**
|
||
(0 = neutral, −1 = grau) — persistent und netz-repliziert
|
||
- [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, Tab schaltet um)
|
||
- [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] **FrameRateLimiter** (FPS-Begrenzung, VSync-Handling)
|
||
- [x] **Settings-Persistenz** (`GameSettings`): Master-Volume- & Maus-Sensitivitäts-Slider
|
||
- [x] **SkyboxEnvironmentUpdater**: Sky-Reflexion + Ambient ohne gebackenes LightingData
|
||
(Custom-Cubemap-Render, Intensity-Regler, separates Reflexions-Sky-Material möglich)
|
||
- [x] **Concealment-Tooling**: `ConcealmentMeter` (volumetrische „wie tief steckt der Hider
|
||
in Geometrie"-Messung) + Collider-Baker (`ConcealmentColliderBaker`, VHACD, Skinned)
|
||
- [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`, rollenspezifisch
|
||
`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] **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 ❌
|
||
|
||
### Spielablauf (Hide & Seek)
|
||
- [ ] **Akustisches Taunt/Pfeifen** (optional, ggf. erzwungen) — der Radar-Selbst-Ping
|
||
deckt die Mechanik bereits ab
|
||
|
||
### 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**: Menüs — Match-HUD, Ergebnis-Screen, Paint-HUD (inkl. Library)
|
||
und Session-Browser sind bereits uGUI
|
||
- [ ] **Audio**: SFX (Schritte, Klettern, Schuss, ggf. Pfeifen), Musik
|
||
- [ ] **Beleuchtung / Art-Direction** finalisieren (Sky-Reflexion/Ambient via
|
||
`SkyboxEnvironmentUpdater` und erste Shadow-Passes sind drin)
|
||
|
||
---
|
||
|
||
## 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, optional Pfeifen), 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.
|