Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Swinging Physics für Spielerbewegungen (wie in Spider-Man 2 und Energy Hook)

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Federicco Ancie (you can also view the original English article)

Hallo! Ich bin Jamie Fristrom von Happion Laboratories. Sie erinnern sich vielleicht an mich aus den Spielen, wie Die By The Sword, Spider-Man 2 und Schizoid... alle in der einen oder anderen Form ein Seil enthielten. Ich habe in letzter Zeit an einem Spiel namens Energy Hook gearbeitet, das kürzlich auf Kickstarter veröffentlicht wurde und sich ausschließlich mit Seilen befasst. (Nun, es geht sowieso nur um Ihren Gravitonen-Greifstrahl.)

Spider-Man 2 and Energy Hook rope swinging physics tutorial

Ich werde diskutieren, wie ich eine seilschwingende Spielmechanik realisieren möchte. Als ich anfing, an Energy Hook zu arbeiten, habe ich meistens alles mit meinem eigenen Code gemacht. Ich glaube, es ist möglich, einfach in Unity zu gehen und das konfigurierbare Joint zu verwenden, um einige sehr ähnliche Dinge zu tun, aber zu der Zeit war es nicht verfügbar. Ich bin mir ziemlich sicher, dass es sowieso der richtige Anruf war, weil ich damit die Kontrolle über alles habe - und ich kann es mit Ihnen teilen.

Spider-Man 2 and Energy Hook rope swinging physics tutorial

Die Grundlagen des Schwingen, wie ich es getan habe - unter Verwendung von Einschränkungen - sind eigentlich recht einfach. (Ich hoffe, Sie werden nicht enttäuscht, wenn Sie sehen, was sich unter der Haube befindet.) Es funktioniert genauso, ob Sie ein 2D- oder ein 3D-Spiel erstellen. Die Vektoren sind nur unterschiedlich, also beginne ich mit 2D und dann Besprechen Sie einige Falten, wenn Sie in drei Dimensionen gehen.

In diesem Artikel wird auch davon ausgegangen, dass Sie eine Spiel-Engine wie Unity verwenden, die einen Großteil der Arbeit für Sie erledigen kann, z. B. Raycasting gegen Geometrie und Ausrichtung eines Charakters mit einfachen Funktionsaufrufen. Wenn Sie Ihre eigene Engine verwenden, müssen Sie diese möglicherweise selbst berechnen.

Spider-Man 2 and Energy Hook rope swinging physics tutorial

Körperliche Simulationen und Bewegungen

Es gibt zwei Möglichkeiten, wie Spielsimulationen häufig funktionieren. Die meisten Spiele für Dritte haben alles eingemacht. Dosenanimationen und Dosenbewegungen, damit alles perfekt aussieht, die Füße des Charakters nicht rutschen, direkt vom Animationsprogramm des Animators zu uns. Die Alternative ist eine viel physischere Simulation - Sie simulieren die Physik: Beschleunigung, Geschwindigkeit, Schwerkraft - viele Spiele aus der ersten Person tun dies, aber Spiele aus der dritten Person meiden dies, weil es viel einfacher ist, die Füße des Charakters zu haben Folie und das physische Material stimmen nicht mit der Animation überein.

Wenn Sie eine Seilschaukel ohne Dosen ausführen möchten (im Gegensatz zu einer Seilschaukel aus der Dose, wie sie in der allerersten Fallstricke zu sehen ist, oder den frühen Spider-Man-Spielen wie Neversofts auf der PSX), ist eine Seilschaukel tatsächlich eine physische Simulation und kann daher vielleicht Freiheit und Nuance und das viszerale Gefühl haben, das echte Schwerkraft und Dynamik Ihnen geben können, dann werden Sie es auf die zweite Weise tun wollen - alles soll eine physikalische Simulation sein, und es vermeiden, Konserven zu tun, die töten der Schwung des Charakters. Dann wird alles fließen.

So mache ich Dinge mit Energy Hook.

Spider-Man 2 and Energy Hook rope swinging physics tutorial

Es gibt eine Menge Artikel darüber, wie man Physik simuliert - hier ist einer mit einer coolen Flash-Demo. Sie können Euler-Integration oder Verlet-Integration durchführen, das spielt keine Rolle. (Ich werde Sie hier nicht über Euler vs. Verlet unterrichten, aber lassen Sie mich nur sagen, dass die Konzepte nicht so beängstigend sind, wie sie klingen.)

Nehmen wir an, wir machen die einfache Euler-Integration. Der Spielzeitschritt unseres Charakters könnte folgendermaßen aussehen: Die Beschleunigung wird durch die Schwerkraft bestimmt und wie Sie auf den Schläger drücken:

(Randnotiz: Dies ist eigentlich eine grobe Annäherung - Sie können mit avatar.position = avatar.position + (avatar.oldvelocity + avatar.velocity) * deltaT / 2.0f eine bessere, weniger frameratenabhängige Annäherung erhalten, und Sie können erhalten eine nahezu perfekte Simulation mit so etwas - aber Ihre Spieler werden es wahrscheinlich nicht bemerken.)


Beschränken Sie es

Ihr Spiel hat wahrscheinlich ein System zum Kollidieren mit der Weltgeometrie. Es sieht wahrscheinlich ungefähr so aus:

Was passiert mit der Geschwindigkeit Ihres Avatars, wenn er auf ein Hindernis trifft? Es macht für Ihren Avatar keinen Sinn, die gleiche Geschwindigkeit durch die Wand beizubehalten. Einige Spiele könnten Sie abprallen lassen, indem Sie die Normalen der Kreuzung verwenden, um Ihre Geschwindigkeit widerzuspiegeln. Bei anderen Spielen können Sie möglicherweise an der Wand entlang gleiten. andere werden irgendwo dazwischen sein. Schauen wir uns den Code zum Gleiten an einer Wand an:

(Wenn Sie eine Verlet-Integration durchführen, bei der für jeden Frame die Geschwindigkeit bereits durch Betrachten der vorherigen Positionsdaten bestimmt wird, ist dieser Schritt bereits für Sie ausgeführt.)

Da Videospiele die hackigen Dinge sind, die sie sind, werden Sie wahrscheinlich oft feststellen, dass die Position Ihres Charakters in bestimmten Eckfällen plötzlich von einem Bild zum nächsten wechselt. Wenn dies geschieht, geht ihre Geschwindigkeit durch das Dach. Meine Lösung dafür ist einfach ein Hack: Überprüfen Sie, ob ihre Geschwindigkeit zu extrem wird, und beheben Sie sie, wenn dies der Fall ist.

Was macht dieser Code, wenn Sie schräg gegen eine Wand stoßen? Im ersten Frame ändert sich Ihre Geschwindigkeit dramatisch, wenn Sie gegen die Wand stoßen, aber es drückt Sie immer noch durch die Wand. Im nächsten Frame wird Ihr Avatar wieder in die Wand aktualisiert und dann wieder herausgeschoben. Jetzt ist die Geschwindigkeit die neue Position des Avatars, die entlang der Wand abzüglich seiner alten Position gegen die Wand geschoben wird, sodass sie parallel zur Wand verläuft .

Dies ist eine enorme Vereinfachung dessen, was in der realen Welt vor sich geht, wenn ein Objekt mit einem anderen kollidiert, aber die meisten Ihrer Spieler werden es nicht bemerken oder sich darum kümmern.

Zu diesem Zeitpunkt haben wir jedoch die Position und Geschwindigkeit unseres Avatars mit den Wänden und Böden unseres Spiels erfolgreich eingeschränkt. Jetzt sind wir also bereit.

Einschränken mit Bändern anstelle von Wänden

Stellen Sie sich nun vor, Ihr Avatar ist bereits mit einem virtuellen Seil an einem virtuellen Punkt befestigt. Für uns können wir einfach eine unsichtbare kreisförmige oder kugelförmige Wand betrachten. Wir können die Kollision testen, indem wir feststellen, ob Sie zu weit vom Mittelpunkt des Kreises entfernt sind, und den Avatar wieder hineinziehen.

Die gleiche Geschwindigkeitsanpassung, die uns an Wänden entlang gleiten ließ, lässt uns auch entlang der Innenseite dieses virtuellen Kreises oder dieser Kugel gleiten.

Spider-Man 2 and Energy Hook rope swinging physics tutorial
Swinging Physics: Mit einem Haltegurt fallen - Frame 1
Spider-Man 2 and Energy Hook rope swinging physics tutorial
Swinging Physics: Mit einem Haltegurt fallen - Frame 2
Spider-Man 2 and Energy Hook rope swinging physics tutorial
Swinging Physics: Mit einem Seil fallen - Frame 3

Etwas Subtilität und Nuance

Zu diesem Zeitpunkt haben Sie ein schwingendes Spiel. Aber es wird wahrscheinlich ein paar Dinge geben, die Ihren Spielern den Spaß behindern, und hier kann ein wenig Hacken die Dinge verbessern.

Schlaffheit, Federung

Abhängig von Ihrem Spiel und davon, ob es eine Seillänge oder ein elastisches Netz oder einen Greifbalken simulieren soll, haben Sie möglicherweise unterschiedliche Ansätze für Spiel und Federung. Sie können eine Menge Dinge simulieren, indem Sie die tetherLength anpassen. Wenn Sie Ihr federndes Netz oder Ihren Greifbalken lockern möchten, können Sie die tetherLength verkürzen, wenn sich der Spieler dem Haltepunkt nähert:

Aber wenn es sich um ein nichtelastisches Seil handelt, bleibt die tetherLength unberührt.

Für die Federung können Sie eine desiredLength festlegen, die fest ist, und eine currentLength, die ständig versucht, sich der desiredLength anzunähern. Dies ist auch für unseren nächsten Schritt hilfreich:

Aber ich will nicht auf den Boden fallen!

Was ist, wenn Ihr Avatar an einem niedrigen Ort beginnt und versucht zu schwingen? Es ist ziemlich offensichtlich, dass sie nicht sehr weit kommen werden. Eine schnelle Lösung besteht darin, zu überprüfen, wie hoch über dem Boden der Punkt ist, von dem aus sie schwingen möchten, und die Länge ihrer Leine zu verkürzen, damit sie den Boden frei machen.

Sie können es jedoch nicht einfach über einen Frame kürzen, da sie dann plötzlich in die Luft schnappen. Wenn Sie also eine desiredLength haben, die kurz genug ist, um den Boden nicht zu berühren, und eine currentLength, die sich schnell der desiredLength nähert, erhalten Sie die Freigabe, die Sie erhalten wollen.

Der Avatar ist oben

Wenn Ihr Avatar eine humanistische Figur ist, macht es wenig Sinn, dass sie beim Schwingen ständig perfekt vertikal erscheinen. Wenn Sie sie so ausrichten, dass sie so aussehen, als würden sie am Seil hängen - also stehen sie auf dem Kopf, wenn sie beispielsweise eine Schleife machen - könnte dies in Unity folgendermaßen aussehen:

Dadurch kann der Avatar rückwärts schwingen. Sie können auch die Geschwindigkeit des Avatars für ihre Vorwärtsbewegung verwenden (das ist, was ich tue) - oder sie verrückt drehen lassen...

Um Dinge wickeln

In der realen Welt wickeln sich Seile um Sachen. Eine schnelle Möglichkeit, dies in Ihrem Code zu simulieren, besteht darin, jeden Frame entlang des virtuellen Seils zu strahlen. Wenn er auf etwas trifft, erstellen Sie einen neuen Befestigungspunkt an der Stelle, an der er sich schneidet. Dies sieht nicht richtig aus, wenn der Avatar dann an einem nicht klebrigen Seil zurückschwingt, ist aber für ein klebriges Netz, eine Zunge oder einen Greifbalken in Ordnung.

Das Ändern der Art und Weise, wie Ihre Seilwickel ausgeführt werden, kann einen großen Einfluss auf den Spaß haben. Das plötzliche Umwickeln eines Aufschlusses kann den Spieler überraschen und frustrieren. In Spider-Man 2 hatten wir eine dreistufige Lösung: Wenn Sie zu nahe am Aufschluss wären, würde das Netz brechen. Wenn Sie sich in mittlerer Entfernung befinden, wird das Web gewickelt. und wenn Sie weit weg wären, würde das Web einfach durchlaufen.


Überlegungen zu 3D

Das Schwierigste daran, diese 2D-Mechanik auf 3D zu bringen, ist die Berücksichtigung der Benutzeroberfläche für den Spieler - wie er Punkte in der Welt auswählt, von denen aus er schwingen kann. Verschiedene Spiele verwenden unterschiedliche Methoden, um einen solchen Punkt auszuwählen. Ratchet & Clank hat feste Punkte in der Welt, mit denen Sie sich auseinandersetzen können. Mit dem Quake Grappling-Hook-Mod und Bionic Commando: Rearmed richten Sie die Kamera auf das, woran Sie sie befestigen möchten. Spider-Man 2 und Energy Hook werfen Strahlen relativ zum Charakter aus und wo sich die Strahlen mit der physischen Geometrie schneiden, ist dies der Punkt, an dem Sie sie anbringen.

Spider-Man 2 and Energy Hook rope swinging physics tutorial

Bei fast allen dieser Methoden wird Raycasting gegen die physische Geometrie der Welt durchgeführt, sei es entlang der Linie der Kamera oder vom Charakter bis zum Mausklickpunkt - der Schnittpunkt des Raycasts bestimmt Ihren neuen Tetherpoint.

Hier ist zum Beispiel ein Raycast im Maus-Look, der für ein Ego-Spiel gut sein könnte:


In Sachen stoßen

Das Anstoßen an Wände und dergleichen tritt in einem 3D-Spiel häufig auf als in einem 2D-Spiel, insbesondere wenn es sich um die Wände handelt, an die Sie sich binden. Es gibt eine Vielzahl von Möglichkeiten, um dies weniger ärgerlich zu machen.

  • Lassen Sie den Spieler in die Luft steuern: Die Physik hat nicht viel zu sagen, aber es fühlt sich irgendwie richtig an. Das ist eines der Dinge, die wir in Spider-Man 2 gemacht haben und warum Sie in Energy Hook ein Jetpack bekommen.
  • Spielen Sie eine coole Animation: Lassen Sie den Avatar eine Art Flip oder Spin machen, wenn er gegen eine Wand stößt, und dann fühlt es sich weniger wie ein Fehler an, sondern eher wie "Ich wollte das tun!"
  • Halten Sie sie von der Wand fern: Ultimate Spider-Man hat dies getan - wenn Sie sich einer Wand zu nahe kommen, werden Sie sanft von ihr weggedrückt. Es sah ein bisschen komisch aus, wenn Sie den Stock losließen und Ihren Avatar einfach dort hängen ließen - sie würden in einem seltsamen Winkel von der Wand wegschweben -, aber für den Rest des Spiels war es eine Verbesserung. (Sie könnten möglicherweise das Beste aus beiden Welten haben, indem Sie nur wegschieben, wenn der Charakter eine bestimmte Geschwindigkeit erreicht?)
  • Belohnen Sie sie dafür, dass sie die Wand überhaupt nicht getroffen haben: Dies ist die Energy Hook-Strategie - bringen Sie dem Spieler bei, das Schlagen von Wänden zu vermeiden, indem Sie sie für saubere Schaukeln belohnen. Einerseits ermutigt es sie, hübsch zu schwingen; Auf der anderen Seite ist es umso frustrierender, wenn sie gegen die Wand stoßen, weil sie ihre Stilpunkte verlieren.
Spider-Man 2 and Energy Hook rope swinging physics tutorial

Also, worauf warten Sie?

Gehen Sie raus und machen Sie Ihre eigenen Swing-Spiele und lassen Sie mich wissen, was Sie sich einfallen lassen! Ich kann nie genug von Swing-Spielen bekommen.

Ich hoffe, Sie fanden diesen Artikel hilfreich. Wenn ja, unterstützen Sie bitte den Energy Hook Kickstarter oder stimmen Sie ihn bei Steam Greenlight ab. Vielen Dank!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.