Arbeiten mit Unity3D-Physik

In diesem Tutorial erfahren Sie, wie Sie ein Unglücksspiel mit Unity3D erstellen! Auf dem Weg erfahren Sie, wie wichtig die Verwendung einer Physik-Engine ist und wie Sie unzählige Stunden an manueller Animation sparen können. Weiter lesen!

Welche moderne Spiel-Engine wäre ohne Physik-Engine komplett? Jede aktuelle Spiel-Engine, egal ob 3D oder 2D, verfügt über eine Physik-Bibliothek. Unity bildet dabei keine Ausnahme. Echtzeitphysik ist ideal für die Simulation komplexer Interaktionen zwischen Objekten in Ihrem Spiel. Eine Physik-Engine kann viele manuelle Kodierungen und Animationen einsparen, um eine realistische Bewegung zu erreichen, die Treffererkennung zu einem Kinderspiel zu machen und kann schnell eine Vielzahl neuer Spielmechanismen in Ihre Spiele einführen.

In diesem Lernprogramm verwenden wir die Physik-Engine in Unity, um ein 3D-Knockdown-Spiel zu erstellen, das BoomBlox und Angry Birds ähnelt. Wir lernen, wie man Objekten verschiedene physikalische Eigenschaften verleiht, sie kollisionsfähig macht und sogar zerstört, wenn die Kollisionen stark genug sind.


Was ist eine Physik-Engine??

Eine Physik-Engine simuliert, wie Objekte miteinander reagieren, wenn Kräfte auf sie einwirken. Diese Kräfte können konstant sein, wie die Schwerkraft oder der Impuls eines Fahrzeugs, während andere kurz und kräftig sind, wie Explosionen. Eine Physik-Simulation wird manchmal als „Sandbox“ bezeichnet, da nur Objekte in der Simulation betroffen sind. In der Tat muss nicht jedes Objekt in Ihrem Spiel Teil der Simulation sein. Dies ist wichtig, da Spielerbewegungen oft unrealistisch sein müssen und trotzdem realistisch auf Kollisionen reagieren müssen.


Projektaufbau

  • Klicken Sie auf Datei> Neues Projekt
  • Navigieren Sie zu einem geeigneten Ordner und nennen Sie das Projekt CannonBowl
  • Klicken Sie auf Erstellen
  • Klicken Sie auf GameObject> Create Other> Directional Light
  • Klicken Sie auf Datei> Szene speichern
  • Benennen Sie die Szene Main
  • Klicken Sie auf Speichern

Colliders

Kollisionen werden von Physik-Engines für die Treffererkennung verwendet. Im Gegensatz zu Netzobjekten wissen sie, wenn sie miteinander in Kontakt gekommen sind. Es sind einfache Formen wie Boxen, Kugeln oder Kapseln, die Ihren GameObjects zugewiesen werden und ihnen folgen. Sie können sich wie ein "Kraftfeld" vorstellen..

Günstigerweise wird bei der Erstellung eines GameObject automatisch ein entsprechender Collider zugewiesen. Ein Cube erhält einen BoxCollider, eine Kugel einen SphereCollider, ein Zylinder einen CapsuleCollider und so weiter.

Wir werden irgendwann ein paar Blöcke brauchen, um niederzuschlagen:

  • Klicken Sie auf GameObject> Create Other> Cube
  • Benennen Sie den Würfel in um Holzblock
  • Setzen Sie die Position des Blocks auf 0, 0, 0. Dadurch wird der Block in der Welt zentriert
  • Laden Sie Wood.jpg herunter
  • Ziehen Sie Wood.jpg in Ihr Projektfenster, um eine Textur zu erhalten
  • Ziehen Sie die Holzstruktur in der Szenenansicht auf den Block. Dadurch wird automatisch ein Holzmaterial für uns erstellt und auf den Block angewendet
  • Ziehen Sie den Block aus dem Hierarchiebedienfeld in das Projektfenster, um ihn in ein Prefab zu verwandeln

Wenn wir Play drücken, macht der Block nichts. Während es einen Kollider hat, fehlt ihm ein starrer Körper, so dass er nicht von physischen Kräften beeinflusst wird.


Starre Körper

Ein starrer Körper ist das kritischste Element in einer Physik-Engine. Jedes GameObject, an das es angehängt ist, wird in die Simulation einbezogen.

  • Wählen Sie im Projektfenster das Prefab "Block" aus
  • Klicken Sie auf Component> Physics> Rigidbody

Standardmäßig wird ein starrer Körper von der Schwerkraft und dem Luftwiderstand beeinflusst, die auch als Widerstand bezeichnet werden. Wenn wir auf Play drücken, beginnt der Block zu fallen, zu beschleunigen und schließlich die Endgeschwindigkeit zu erreichen, wenn die Schwerkraft und der Widerstand sich ausgleichen.


Baue eine Struktur

Wir müssen ein paar weitere Elemente erstellen, um ein angemessenes Level aufzubauen. Lassen Sie uns zunächst etwas Boden hinzufügen, damit der Block auf etwas landen kann.

  • Klicken Sie auf GameObject> Create Other> Plane
  • Benennen Sie das Flugzeug in um Boden
  • Setzen Sie die Position des Bodens auf 0, 0, 0
  • Laden Sie Grass.jpg herunter
  • Ziehen Sie Grass.jpg in Ihr Projektfenster, um eine Textur zu erhalten
  • Ziehen Sie die Grass-Textur in der Szenenansicht auf den Boden

Der Boden wird automatisch mit einem MeshCollider versehen, der verhindert, dass starre Körper durch ihn hindurchtreten. Drücken Sie Play, und der Block sollte auf dem Boden abfallen.

Jetzt brauchen wir eine Struktur, um niederzuschlagen. Wählen Sie den Block aus und drücken Sie Strg + D in Windows oder Cmd + D in OSX, um den Block einige Male zu duplizieren. Verwenden Sie die Hilfsmittel zum Skalieren und Bewegen, um die Blöcke in etwa der gleichen Konfiguration wie in der Abbildung unten zu strecken und zu positionieren.

HINWEIS: Es ist eine gute Idee, genaue Zahlen für Ihre Transformationen zu verwenden. Blöcke sollten aneinander liegen, sich aber nicht überlappen. Überlappungen führen dazu, dass die Physik-Engine ausflippt und unvorhersehbare Dinge tut.


Kamerasteuerungen

Nachdem wir nun unsere wunderschöne Struktur erstellt haben, schreiben wir ein Skript, mit dem wir die Kamera bewegen können, um unsere Kreation aus allen Blickwinkeln zu bewundern.

  • Klicken Sie auf Assets> Create> C # Script
  • Benennen Sie das Skript in um Kanone (weil unsere Kamera irgendwann die Aufnahmen machen wird)
  • Ziehen Sie das Skript auf die Hauptkamera
  • Doppelklicken Sie auf das Skript, um es zu bearbeiten

Das folgende Skript bewirkt, dass die Kamera den Mittelpunkt der Welt umkreist und nach oben und unten neigt:

 public class Cannon: MonoBehaviour void LateUpdate () float x = Eingabe.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Mouse Y"); // vertikaler Kippschwimmer yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transform.eulerAngles.y, transform.eulerAngles.z); // horizontal orbiting transform.RotateAround (new Vector3 (0, 3, 0), Vector3.up, x); 

Lassen Sie uns zum Schluss noch einfacher zielen, indem Sie ein Fadenkreuz in unsere Kamera einfügen:

  • Klicken Sie auf GameObjects> Create> Plane
  • Benennen Sie das Flugzeug in um Fadenkreuz
  • Stellen Sie das Fadenkreuz auf 0, 0, 0
  • Laden Sie Crosshair.png herunter
  • Ziehen Sie Crosshair.png in das Projektfenster
  • Ziehen Sie die Fadenkreuz-Textur im Szenenbedienfeld auf die Fadenkreuz-Ebene
  • Klicken Sie im Inspektor mit der rechten Maustaste auf die MeshCollider-Komponente, und entfernen Sie sie, damit sie keine Auswirkungen auf andere Physikobjekte in der Szene hat

Kanonenkugeln schießen

In der Lage zu sein, unsere Struktur zu sehen, ist okay, aber es sollte sich um Physik handeln! Wir brauchen eine Möglichkeit, es niederzuschlagen, um die Physik in Aktion zu sehen. Was wir brauchen, ist etwas zum Schießen!

  • Klicken Sie auf GameObject> Create Other> Sphere
  • Benennen Sie die Kugel in um Kanonenkugel
  • Setzen Sie die Position der Kanonenkugel auf 0, 0, 0
  • Klicken Sie bei ausgewählter Kanonenkugel auf Komponenten> Physik> Rigidbody
  • Ziehen Sie die Kanonenkugel aus dem Hierarchiebedienfeld in das Projektfenster, um daraus ein Prefab zu machen

Da wir Kanonenkugeln direkt von der Kamera aus aufnehmen, können wir unser vorhandenes Kanonenskript bearbeiten. Zuerst fügen wir ein öffentliches Attribut an der Spitze der Klasse für unser Projektil-Fertighaus hinzu.

 public class Cannon: MonoBehaviour public GameObject projectilePrefab;

Wir fügen eine FixedUpdate-Methode hinzu, um auf die "Fire1" -Taste zu hören, um gedrückt zu werden. Anschließend wird ein Cannonball-Prefab instanziiert, an der Kamera positioniert und dann mit einer Kraft versehen, um ihn vorwärts zu bewegen.

 void FixedUpdate () if (Input.GetButtonDown ("Fire1")) GameObject-Projektil = Instanziieren (ProjektilePrefab, transform.position, transform.rotation) als GameObject; projectile.rigidbody.AddRelativeForce (new Vector3 (0, 0, 2000)); 

Grenzen

Sie haben vielleicht bemerkt, dass eine Kanonenkugel, wenn sie weit genug abgefeuert wird, vom Rand unserer Bodenebene fallen kann. Diese Kanonenkugel wird so lange bestehen bleiben, wie das Spiel weiterläuft und die Physik weiter berechnet wird. Wir müssen eine Grenze um die Ebene schaffen und alle Spielobjekte zerstören, die diese Grenze verlassen.

  • Klicken Sie auf GameObject> Create Empty
  • Benennen Sie es in um Grenze
  • Setzen Sie die x-, y- und z-Position der Grenze auf 0
  • Klicken Sie bei ausgewählter Begrenzung auf Components> Physics> Box Collider
  • Stellen Sie im Insepctor sicher, dass die Option Ist Trigger aktiviert ist
  • Setzen Sie das Zentrum des Box Colliders auf 0, 25, 0
  • Stellen Sie die Größe des Box-Colliders auf 50, 50, 50 ein

Jetzt müssen wir das Skript erstellen, das Objekte zerstört, die außerhalb der Grenze liegen.

  • Klicken Sie auf Assets> Create> C # Script
  • Benennen Sie das Skript in um Grenze
  • Ziehen Sie das Skript im Hierarchiebedienfeld auf das Begrenzungsobjekt
  • Bearbeiten Sie das Skript und fügen Sie den folgenden Code hinzu
 öffentliche Klasse Boundary: MonoBehaviour void OnTriggerExit (Collider andere) Destroy (other.gameObject); 

Zerstörung verursachen

Wir brauchen einen Weg, um unser Niveau zu erreichen. Um dies zu erreichen, müssen unsere Blöcke zerstört werden, wenn sie durch Stöße genügend Schaden erleiden.

  • Klicken Sie auf Assets> Create> C # Script
  • Benennen Sie das Skript in um Block
  • Ziehen Sie das Skript im Projektfenster auf die Option "Block"
  • Doppelklicken Sie auf das Skript im Projektfenster, um es zu bearbeiten

Im Skript geben wir dem Prefab eine öffentliche Health-Eigenschaft, die im Editor angepasst werden kann. Dies ermöglicht, dass verschiedene Blöcke unterschiedliche Gesundheitszustände haben.

 öffentliche Klasse Block: MonoBehaviour public float health = 20;

Wenn eine Kollision erkannt wird, wird die Stärke des Aufpralls gemessen. Je größer das Ausmaß, desto mehr Schaden wurde angerichtet. Alles, was sich über einem leichten Antippen befindet, wird vom Zustand des Blocks abgezogen. Wenn der Zustand des Blocks unter 0 fällt, zerstört sich der Block. Anschließend wird geprüft, wie viele weitere Blöcke in der Szene verbleiben. Wenn nur noch ein Block übrig ist, ist das Spiel vorbei und lädt die Szene erneut, um sie erneut zu spielen.

 void OnCollisionEnter (Kollisionskollision) // Kollisionsschaden anwenden if (collision.relativeVelocity.magnitude> 0,5) health - = collision.relativeVelocity.magnitude;  // zerstören, wenn Gesundheit zu niedrig ist, wenn (Gesundheit <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Betonblöcke

Bisher haben wir nur Holzblöcke verwendet. Sie sind leicht und relativ schwach, was die Zerstörung der Struktur zu einfach macht und deren Beweglichkeit ziemlich vorhersehbar ist. Wir müssen einen anderen Blocktyp erstellen, der sowohl schwerer als auch stärker ist.

  • Duplizieren Sie im Projektfenster die WoodBlock-Vorfertigung (Strg + D in Windows, Cmd + D in OSX)
  • Benennen Sie das Duplikat in um Betonblock
  • Laden Sie Concrete.jpg herunter
  • Ziehen Sie Concrete.jpg in das Projektfenster
  • Ziehen Sie die Concrete-Textur auf das ConcreteBlock-Prefab im Projektfenster
  • Wenn das Prefab ausgewählt ist, aktualisieren Sie den Zustand mit dem Inspector auf 50
  • Erhöhen Sie in der Starrkörperkomponente die Masse auf 5, um sie schwerer zu machen
  • Ziehen Sie das ConcreteBlock-Fertighaus in die Szene

Versuchen Sie, einige der Querträger durch Betonblöcke zu ersetzen. Die Betonblöcke sollten schwerer zu schlagen sein, mit großer Wirkung fallen und mit Kanonenkugeln schwieriger zu zerstören sein.


Fertiges Spiel

Unten ist das fertige Spiel, das im Unity Web Player ausgeführt wird. Benutze die Maus, um die Kamera zu umkreisen, und drücke Strg oder Linke Maustaste, um Kanonenkugeln abzuschießen.




Fazit

Dieses Tutorial zerkratzt nur die Oberfläche dessen, was die Unity-Physik-Engine kann. Konstante Kräfte, Sprengkräfte, physikalische Materialien, Scharniere, Federn, Ragdolls usw. Auch wenn dies abschreckend erscheinen mag, passen alle Elemente der Unity-Physik-Engine zusammen, sodass die Physik in Ihren Spielen leicht verständlich und leicht zu implementieren ist.

Weitere Informationen zu den Funktionen der Unity-Physik-Engine finden Sie unter:

http://docs.unity3d.com/Documentation/Manual/Physics.html