Animierter physikbasierter First Person Playercontroller

Mein Code auf Github
Der PlayerController steuert einen physikbasierten First-Person-Charackter auf Basis eines Rigidbodys. Er übersetzt rohe Eingaben (Bewegung, Sprint, Sneak, Jump, Dash, Vault, Waffenslots, Feuern, Zielen) in einen konsistenten Satz von Zuständen, Kräften, Animationstriggern und Audio-Events. Die Bewegungen erfolgen vollständig über physikalische Kräfte auf dem Rigidbody, inklusive einer eigenen Reibungsmodellierung, während eine interne Movement-StateMachine (Idle, Walk, Sneak, SneakSprint, Sprint, Slide, Air) definiert, wie das Modell des Chatakters animiert werden soll. Parallel dazu verwaltet der Controller Waffenhaltung, Armposen, Sprungverhalten, Vaults über Hindernisse, Kameraführung und Schrittgeräusche – und liefert damit die zentrale Steuerinstanz für das Spielgefühl der Spielfigur.
Kern des Bewegungsmodells ist die Movement-StateMachine. Sie überwacht Bodenstatus, Inputrichtung, Sneak- und Sprint-Toggles, Slide-Locks sowie Sonderzustände wie Dash oder Vault und übersetzt diese in klar definierte Modi: Im Idle steht der Charakter am Boden, Walk und Sprint unterscheiden sich primär durch die angesetzte Laufkraft und die erlaubte Gleichgewichtsgeschwindigkeit, Sneak reduziert Geschwindigkeit und Sichtbarkeit, SneakSprint verbindet geduckte Haltung mit beschleunigter Fortbewegung. Der Slide-Zustand wird nur unter klaren Bedingungen eingeleitet (hohe Vorwärtsgeschwindigkeit, Sneak aktiv, Boden unter den Füßen) und bleibt so lange aktiv, bis entweder die gekoppelte Animation oder eine Maximaldauer das Ende signalisiert. Air kapselt alle Phasen ohne Bodenkontakt und dient als Grundlage für Coyote Time, Jump Buffer und Air-Strafing. Jeder Modus setzt seine eigenen Bewegungsparameter (Laufkraft, Zielgeschwindigkeit) und informiert gleichzeitig das Animationssystem, sodass visuelle Darstellung und physikalisches Verhalten übereinstimmen.
Die physische Fortbewegung selbst ist bewusst modelliert statt rein linear. Aus dem Eingabevektor wird zunächst eine lokale Bewegungsrichtung berechnet, in den Weltraum transformiert und anschließend auf die aktuelle Bodennormale projiziert. So bewegt sich der Spieler tatsächlich entlang der Oberfläche, statt über schrägen Untergrund „wegzurutschen“. Solange die aktuelle Geschwindigkeit unterhalb einer berechneten Gleichgewichtsgeschwindigkeit liegt, wird in dieser Richtung eine kontinuierliche Kraft auf den Rigidbody gegeben. Dem entgegen steht ein eigenes Reibungsmodell: Bei Geschwindigkeiten in der Kontrolle des Spielers überwiegt quadratische Reibung, bei höheren Geschwindigkeiten kommt eine lineare Komponente hinzu, die insgesamt durch einen Limitfaktor gedeckelt wird. Dadurch entstehen natürliche Beschleunigungs- und Auslaufkurven, die pro MovementMode durch die Anpassung von Laufkraft und Reibungsparametern feinjustiert werden können.
Das Sprungverhalten ist durch mehrere Komfort- und Skill-Systeme angereichert. Klassische Coyote Time stellt sicher, dass ein Sprung kurz nach Verlassen des Bodens noch angenommen wird, während ein Jump Buffer Eingaben kurz vor der Landung puffert und beim ersten gültigen Zeitpunkt automatisch auslöst. Optional kann der Sprung in einem Charge Jump-Modus verwendet werden: Hält der Spieler die Sprungtaste, wird eine Sprungkraft über eine definierte Zeitspanne aufgeladen und beim Loslassen als vertikaler Impuls ausgeführt. Dash und Vault ergänzen diese vertikalen und horizontalen Bewegungsmuster: Der Dash ist ein kurzer, impulsiver Vorwärtsausbruch in Eingaberichtung, der Gravitation temporär moduliert, Sprint und Crouch auf Wunsch beendet und eng mit dem Animationssystem verzahnt ist. Vaults über Hindernisse werden über separate Detektionsskripte vorbereitet und in einer eigenen Phase mit gravitierendem Rigidbody, ansteigender Vorwärtskraft und Reibung simuliert, sodass sie sich wie physisch nachvollziehbare, aber kontrollierbare Parkour-Bewegungen anfühlen.
Ein weiterer wichtiger Baustein ist das Ausrüstungs- und Waffenmodell mit expliziten Zuständen für None, Sword, MachinePistol und RailGun. Eingaben auf Waffenslots werden zunächst als „Requests“ erfasst und nur dann in einen tatsächlichen Wechsel überführt, wenn keine blockierenden Aktionen laufen (z. B. Nachladen, Feuern, Schwerthieb oder aktiver Schild). Der eigentliche Waffenwechsel verläuft in zwei Phasen: Zunächst werden die First-Person-Arme mit ihrer aktuellen Waffe elegant in eine „Off“-Pose gefahren, bis eine Off-Nähe-Logik (Positions- und Winkelprüfung) erfüllt ist. Dann aktiviert der Controller das angeforderte Waffen-Setup, setzt die zugehörigen Zieltransforms (Aimed, Lowered, Off, Stroke) und führt die Arme in eine „Lowered“-Pose, aus der heraus gezielt, geschossen oder geschlagen werden kann. So entsteht ein fließender, animationsnaher Waffenwechsel. 
Die Waffen selbst greifen auf dieses Armsystem zurück. Fernkampfwaffen nutzen Aimed- und Lowered-Posen und koppeln Rückstoß direkt an Kamera und Player-Rotation: Beim Schuss werden Pitch und Yaw kurzzeitig versetzt, gleichzeitig werden über das Sound- und Recoil-System virtuell Geräusche emittiert, die später von der Gegner-KI ausgewertet werden können. Das Schwert besitzt eine eigene Schlaglogik mit „Stroke“-Pose und Hitbox, die nur während des aktiven Angriffsfensters eingeschaltet ist. Zusätzlich kann der Spieler im Schwertmodus einen Schild aktivieren: Wenn die Arme in einer definierten Aim-Pose sind und genügend Schildladung im Inventar vorhanden ist, wird ein Schildobjekt sichtbar geschaltet und gleichzeitig ein internes Flag gesetzt, das andere Systeme über den aktiven Schutz informiert. Das Ausrüstungsmodell verzahnt so Sichtmodell, Trefferlogik, Defensive und Audio in einem konsistenten Workflow.
Kamera, Audio und Wahrnehmungsrückkopplung sind eng in den Controller integriert. Die horizontale Rotation des Spielers erfolgt über das Gameobject (Yaw), die vertikale Ausrichtung über ein eigenes Kamera-Carrier-Transform (Pitch), dessen Winkel begrenzt und per Mausinput gesteuert wird. Eine separate Höhenanpassung sorgt dafür, dass sich die Kamera, inklusive eines zusätzlichen Offsets für Charge Jumps, weich an eine Referenzhöhe am Charakter anlegt, statt abrupt zu springen. Auf der Audioseite verarbeitet der Controller Schrittereignisse, die von zwei Fußskripten kommen, und übersetzt sie je nach MovementMode in unterschiedliche Schritt-Sounds (Sneak, Walk, Sprint). Gleichzeitig werden diese Schritte sowie Aktionen wie Dash, Sprünge, Landungen oder Schüsse an einen globalen SoundManager gemeldet, der aus Position, Reichweite und Intensität akustische Ereignisse erzeugt – eine direkte Schnittstelle zur KI, insbesondere zum Hörkanal von Gegnern wie dem AgentBehaviour.
Abgerundet wird der PlayerController durch ein einfaches Gesundheits- und Schadensmodell sowie enge Anbindung an das Animationssystem. Eingehender Schaden reduziert Lebenspunkte, triggert Treffer-Sounds und bei Erreichen von null Lebenspunkten wird die Szene neu geladen; alternative Todesabfolgen können hier problemlos nachgerüstet werden. Über den integrierten Animationscontroller erhält der PlayerController pro Frame Rückmeldungen und gibt Bewegungsdaten weiter: Planargeschwindigkeit, Grounded-Status, sowie aktive MovementModes steuern Laufzyklen, Slide-Animationen, Dash- und Landungsreaktionen.
Insgesamt beschreibt dieser PlayerController einen modular aufgebauten, physikbasierten First-Person-Charakter, in dem Eingabe, Bewegungszustände, Kräfte, Waffen- und Schildhaltung, Kamera und Audio klar getrennt, aber eng ineinander verzahnt sind. Dadurch entsteht ein Spieleravatar nicht nur intern korrekt berechnet, sondern durch Körperhaltung, Armposition, Kameraverhalten und Sound auch für Spielende intuitiv lesbar und spürbar wird.