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.
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.
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:
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.
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.
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.
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.
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.
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.
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:
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!
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));
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.
Jetzt müssen wir das Skript erstellen, das Objekte zerstört, die außerhalb der Grenze liegen.
öffentliche Klasse Boundary: MonoBehaviour void OnTriggerExit (Collider andere) Destroy (other.gameObject);
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.
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");
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.
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.
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.
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