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

Bauen des Arkanoid mit Einheit: Spieler und Ballmechaniker

Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Build Arkanoid With Unity.
Build Arkanoid With Unity: Project Setup
Build Arkanoid With Unity: Block Mechanics, Prefabs, and Level Design

German (Deutsch) translation by Katharina Nevolina (you can also view the original English article)

Final product image
What You'll Be Creating

In dieser Tutorial-Serie zeigen wir Ihnen, wie Sie das klassische Spiel Arkanoid (oder Breakout) in Unity mithilfe der systemeigenen 2D-Werkzeuge von Unity neu erstellen.  In jedem Beitrag konzentrieren wir uns auf einen bestimmten Teil des Spiels. In diesem Beitrag werden wir das Paddel und den Ball bewegen.

Wo haben wir aufgehört 

Im vorherigen Lernprogramm haben Sie das Projekt eingerichtet, die Assets importiert und die Szene für die erste Ebene vorbereitet.  Wenn Sie das vorherige Tutorial noch nicht abgeschlossen haben, empfehlen wir Ihnen dringend, dies zu tun, bevor Sie mit diesem beginnen.

Letzte Vorschau

Werfen Sie einen Blick auf diese Demo, um zu sehen, was wir in der gesamten Serie anstreben:

Und hier ist, was wir am Ende dieses Teils haben werden:

Spielerbewegung

Sie haben bereits das Paddel des Spielers in der Schnittstelle; Jetzt müssen Sie damit interagieren.  Sie bewegen es horizontal, links und rechts.  Um diese Bewegung durch Eingabe zu erzeugen, müssen Sie ein Skript erstellen.

Skripte sind Codeschnipsel, die bestimmte Aufgaben ausführen.  Unity kann mit drei Programmiersprachen umgehen: Boo, C# und JavaScript.  Alle Skripte, die in diesem Tutorial erstellt werden, werden in C# geschrieben (Sie können sie aber auch in einer anderen Sprache implementieren).

Um ein Skript zu erstellen, gehen Sie auf die Registerkarte Projekt, wählen Sie den Ordner Skripte und klicken Sie mit der rechten Maustaste darauf, um ein Menü zu öffnen.  Wählen Sie Erstellen > C# -Skript.  Eine neue Datei namens NewBehaviourScript wird angezeigt. Benennen Sie es in Playerscript um.  Auf der Registerkarte Inspektor sehen Sie den Inhalt des Skripts selbst.

Doppelklicken Sie auf das Skript, um es zu bearbeiten.  Die MonoDevelop-IDE wird standardmäßig geöffnet, Sie können jedoch auch einen anderen Code-Editor konfigurieren, um sie zu öffnen.

Alle Unity-Skripts haben standardmäßig zwei Methoden:

  • Start(): wird verwendet, um alle Variablen oder Parameter zu initialisieren, die wir in unserem Code benötigen.
  • Update(): ruft jeden einzelnen Frame des Spiels auf und dient so dazu, den Spielstatus zu aktualisieren.

Um den Spieler zu verschieben, benötigen Sie zwei Informationen:

  • Spielerposition
  • Spielergeschwindigkeit

Erstellen Sie daher zwei Variablen (globale Klassenvariablen), um diese Informationen zu speichern:

Wie Sie vielleicht bemerkt haben, ist playerVelocity eine öffentliche Variable, während playerPosition privat ist.  Warum haben wir das gemacht?  Nun, mit Unity können Sie die Werte von öffentlichen Variablen im Editor ändern, ohne den eigentlichen Code ändern zu müssen. Das ist sehr nützlich, wenn Sie Parameter haben, die kontinuierlich angepasst werden müssen.  Die Geschwindigkeit ist einer dieser Fälle, also machen wir es öffentlich.

Speichern Sie das Skript (in MonoDevelop) und wechseln Sie erneut zum Unity-Editor.

Sie haben jetzt das Skript; Sie müssen es nur dem Paddle-Objekt des Spielers zuweisen.  Wählen Sie das Paddle auf der Registerkarte Hierarchie aus und klicken Sie im Bereich Inspektor auf Komponente hinzufügen.  Geben Sie nun den Namen des gerade gespeicherten Skripts ein und füge es dem Spielobjekt hinzu.

Weitere Informationen zum Konzept von Komponenten und deren Funktionsweise in Unity finden Sie unter Unity: Jetzt denken Sie mit Komponenten.

Eine andere Möglichkeit, das Skript der Komponente hinzuzufügen, besteht darin, es aus seinem Ordner zu ziehen und über den Bereich Komponente hinzufügen zu ziehen.  Sie sollten so etwas in Ihrem Inspector sehen:

Wie Sie sehen können, können Sie jetzt, da wir die Variable playerVelocity public verlassen haben, ihren Wert im Editor einstellen.  Setzen Sie den Wert vorerst auf 0.3 und kehren Sie zum Code zurück.

Sie initialisieren nun die playerPosition.  Dazu müssen Sie in der Start-Methode des Skripts auf die Position des Spielobjekts zugreifen:

Jetzt haben wir die Anfangsposition und die Geschwindigkeit des Paddles definiert, aber wir müssen es noch bewegen.  Dazu werden wir die Update-Methode bearbeiten.

Da wir nur Objekte horizontal verschieben möchten, können wir die GetAxis-Methode der Input-Klasse verwenden, um herauszufinden, in welche Richtung die Eingabe des Spielers entlang der horizontalen Achse zeigt (-1 für links, +1 für rechts). Multiplizieren Sie diesen Wert mit Velocity, fügen Sie diesen Wert zur aktuellen X-Position des Paddels hinzu und aktualisieren Sie entsprechend die aktuelle playerPosition.

Während wir uns mit der Eingabe beschäftigen, wollen wir auch sicherstellen, dass das Spiel beendet wird, wenn der Spieler die Esc-Taste drückt.

Das vollständige Snippet befindet sich unter:

Speichern Sie das Skript und kehren Sie zum Unity-Editor zurück.  Drücken Sie nun Play und versuchen Sie, den Player mit den Pfeiltasten nach links und rechts zu bewegen.

Definieren des Spielbereichs

Sie haben wahrscheinlich bemerkt, dass das Paddel sich außerhalb des Levels bewegen kann.  Das geschieht, weil für den Spielbereich keine Grenzen definiert sind.

Um die Grenze zu erstellen, erstellen Sie zuerst eine andere öffentliche Variable - nennen Sie sie als boundary.

Diese Variable speichert die maximale X-Position, zu der sich das Paddel bewegen kann.  Da wir die Ebene in einer symmetrischen Form um die Position (0, 0, 0) aufbauen werden, bedeutet dies, dass der absolute Grenzwert für sowohl das positive als auch das negative X gleich ist.

Um zu vermeiden, dass der Spieler die Grenze überschreitet, fügen wir einige if-Bedingungen hinzu.  Wenn der x-Wert der Position größer als der Grenzwert ist, wird der x-Wert gleich der Grenze gesetzt.  Auf diese Weise stellen wir sicher, dass das Paddel den Spielbereich nicht verlassen kann.  Der entsprechende Code ist unten:

Nun gehen Sie zurück zum Editor und erarbeiten Sie den besten Wert für boundary.  Indem Sie die Paddelposition auf der X-Achse ziehen, können Sie sehen, dass der perfekte Wert 5,46 beträgt (in unserem Projekt mindestens).

Setzen Sie im Inspektor den X-Wert der Paddelposition auf 0 zurück und geben Sie 5,46 im Parameter Boundary unter der Komponente Player-Skript ein.

Drücken Sie im Editor auf Wiedergabe.  Jetzt können Sie das Paddel bewegen, aber nur innerhalb des Spielbereichs.

Erstellen von physikalischen Eigenschaften

In diesem speziellen Spiel müssen wir physische Eigenschaften für drei Komponenten erstellen: das Paddel, den Ball und die Wände.  Da wir ein 2D-Spiel erstellen, werden wir 2D-Collider verwenden und anwenden.  (Ein Collider ist ein bestimmter Komponententyp, mit dem die zugehörigen Objekte auf andere Collider reagieren können.)

Beginnen Sie mit dem Hinzufügen eines Colliders zu unserem Paddel.  Wählen Sie in der Hierarchie unser Paddle-Objekt.  Wechseln Sie zum Inspektor, klicken Sie auf Komponente hinzufügen und geben Sie collider ein.  Wie Sie im folgenden Screenshot sehen können, stehen Ihnen verschiedene Arten von Collidern zur Verfügung.  Jeder einzelne Collider hat bestimmte Eigenschaften, die dem zugehörigen Objekt ähneln.

Da der Spieler ein Rechteckformat hat, verwenden wir den Box Collider 2D.  Wählen Sie es aus, und die Komponente wird automatisch Ihrem Player-Objekt hinzugefügt.  Die Werte für die Größe und die Mittelposition des Colliders sind bereits definiert; diese Standardwerte funktionieren für Sie, Sie müssen sie also nicht ändern.

Machen Sie nun den gleichen Vorgang für die drei Balken und den Block.  (Hierarchie > Inspektor > Komponente hinzufügen > Box Collider 2D (Hierarchy > Inspector > Add Component > Box Collider 2D)).

Alle Ihre Spielobjekte haben jetzt Collider, erwarte den Ball.  Da der Ball eine andere Form hat, müssen Sie einen anderen Collider verwenden.  Wählen Sie es aus und fügen Sie auf der Registerkarte Inspektor die Komponente Circle Collider 2D hinzu.

Der Circle Collider 2D ähnelt dem Box Collider, nur dass anstelle der Größe des Parameters, der die Breite und Höhe der Box definiert, ein Radius-Parameter den Radius des Kreises definiert.

Springendes Material

Um den Ball prallen zu lassen, müssen wir ein springendes physikalisches Material erzeugen und es an den Ball befestigen.  Unity hat bereits dieses spezifische Material erstellt, also müssen wir es einfach hinzufügen.

Erstellen Sie auf der Registerkarte Projekt einen neuen Ordner im Ordner Asset und nennen Sie ihn Physics.  Wählen Sie diesen Ordner, klicken Sie auf Erstellen und wählen Sie Physics2D Material.  Nennen Sie Ihr neues Physikmaterial BallPhysicsMaterial.

Das Material hat zwei Parameter: Friction und Bounciness.  Da Sie ein reines, federndes Verhalten wollen, müssen Sie die Werte entsprechend ändern: 0 für Friktion, 1 für Bounciness.

Jetzt haben Sie das Material fertig und wenden es auf den Ball an.  Wählen Sie auf der Registerkarte Hierarchie das Ballspielobjekt aus und wechseln Sie zum Bereich Inspektor.  Wenn Sie sich Ihren Circle Collider 2D genauer ansehen, werden Sie bemerken, dass diese Komponente einen Parameter namens Material hat; Hier können Sie beliebiges physisches Material an das Objekt anhängen.

Um das BallPhysicsMaterial anzuhängen, wählen Sie es einfach aus und ziehen Sie es auf den Collider am Material-Parameter.

Hinzufügen eines starren Körpers

Damit sich der Ball unter der Kontrolle der Physik bewegen kann, müssen wir noch eine letzte Sache hinzufügen: eine Starrkörperkomponente.  Wählen Sie das Kugelobjekt und fügen Sie die Komponente RigidBody 2D hinzu.  Diese Komponente verfügt über mehrere Parameter, die angepasst werden können.  Da sich der Ball nur durch Prellen bewegen wird, sollten Sie den Gravitationsskala-Parameter von 1 auf 0 ändern. Auf diese Weise stellen wir sicher, dass der Ball nicht von der Schwerkraft beeinflusst wird.  Der Rest der Parameter kann als Standard belassen werden:

Programmieren des Ballobjekts

Der Ball wird vollständig dynamisch sein, daher müssen wir ein benutzerdefiniertes Skript für dieses Verhalten erstellen.

Erstellen Sie ein neues Skript (wir verwenden wieder C#) und nennen Sie es BallScript.  Weisen Sie dem Ball-Objekt dieses neue Skript zu (Hierarchie > Inspektor > Komponente hinzufügen).

Lassen Sie uns jetzt die Regeln und Eigenschaften des Balls analysieren, bevor Sie sie in das Skript schreiben:

  • Der Ball sollte zwei Zustände haben: inaktiv (folgt dem Paddel, bevor das Spiel beginnt) und aktiv (springt von Paddel, Wänden und Blöcken).
  • Der Ball wird erst aktiv, wenn der Spieler eine bestimmte Taste auf der Tastatur drückt.
  • Wenn der Ball aktiv wird, wenden wir eine Kraft an, um ihn zu bewegen.
  • Wenn der Ball vom Bildschirm fällt, sollte er zurückgesetzt werden.

Basierend auf diesen Informationen erstellen wir zunächst die globalen Variablen ballIsActive, ballPosition und ballInitialForce.

Nachdem Sie die Variablen festgelegt haben, sollten Sie das Spielobjekt initialisieren.  In der Start-Methode sollten Sie:

  • Schaffen Sie eine Kraft, um den Ball zu drücken.
  • Setzen Sie den Ball auf inaktiv.
  • Bewahren Sie die Kugelposition auf.

So sieht das aus:

Hier wenden wir eine Kraft von 300 entlang der Y-Achse an, um den Ball nach oben zu bewegen, und 100 entlang der X-Achse, um den Ball diagonal statt direkt nach oben zu bewegen.  Auf diese Weise zwingen Sie den Spieler, die Paddelposition zu verschieben.

In der Update-Methode definieren wir das Verhalten des Balls. Lassen Sie uns Fall für Fall näher kommen.

Zuerst müssen wir mit den Benutzereingaben umgehen; Wir werden die Standard-Jump-Schaltfläche von Unity as und Aktionsschlüssel verwenden.  Der mit Jump verknüpfte Schlüssel kann geändert werden, der Standardwert ist jedoch die Leertaste auf der Tastatur.

Als nächstes muss der Ballstatus überprüft werden, da der Action Key nur funktionieren sollte, wenn der Ball inaktiv ist:

Nehmen wir an, dass das zu Beginn des Spiels ist, also müssen wir eine Kraft auf den Ball anwenden und ihn aktivieren.  Die neue Update-Methode sollte folgendermaßen aussehen:

Spielen Sie jetzt Ihr Projekt und testen Sie die Jump-Aktion. Sie werden bemerken, dass der Ball hochgedrückt wird und anfängt, herumzuprallen, genau wie es sollte.  Sie werden jedoch bemerken, dass der Ball nicht der Position des Schlägers folgt, wenn er inaktiv ist.  Stoppen Sie das Spiel und lassen Sie uns das ändern.

In der Update-Methode müssen wir den Ballstatus überprüfen und wenn der Ball inaktiv ist, müssen wir sicherstellen, dass der X-Wert des Balls derselbe wie der X-Wert des Paddels ist.

Ah, aber wie können wir auf die Spielerposition zugreifen, wenn sie sich in einem anderen Spielobjekt befindet?  Ganz einfach: Wir erstellen einfach eine Spielobjektvariable und speichern darin einen Verweis auf das Paddelobjekt.  Fügen Sie das Paddle-Objekt als öffentliche globale Variable vom Typ GameObject hinzu:

Zurück zur Update-Methode.  Wir werden den Ballzustand und die Paddelreferenz überprüfen.  Wenn der Zustand inaktiv ist und das Paddelobjekt nicht Null ist (d.h. wir haben einen Bezug darauf), sollte der Ball der Position des Paddels folgen.  Das komplette Update ist jetzt:

Speichern Sie Ihr Skript und kehren Sie zum Editor zurück.  Wie Sie vielleicht bemerkt haben, ist die Paddelreferenz öffentlich, was bedeutet, dass Sie sie am Editor weitergeben.  Wählen Sie auf der Registerkarte Hierarchie den Ball aus.  Im Inspector werden Sie feststellen, dass der Player-Objekt-Parameter in unserem Skript derzeit None ist.

Um das als Referenz für das Spieler-Paddle-Spielobjekt zu verwenden, ziehen Sie einfach das Paddle-Spielobjekt aus der Hierarchie in den Player-Objekt-Parameter im Skript.

Klicken Sie auf die Schaltfläche Spielen und testen Sie Ihr Spiel.  Sie werden nun sehen, dass der Ball dem Spieler folgt, bevor die Jump-Taste gedrückt wird.

Zurücksetzen des Spiels

Es gibt nur noch eine Sache, die Sie tun müssen, um das Skript zu beenden.  Wie Sie vielleicht bemerkt haben, wird der Spieler, wenn er den Ball nicht fängt, aus dem Satz fallen und das Spiel wird nicht zurückgesetzt.  Lassen Sie uns die Update-Methode ändern, um das zu beheben.

Wir prüfen, ob der Ball aktiv ist und ob seine Y-Position kleiner als -6 ist.  Wenn ja, setzen wir den Ball auf inaktiv und setzen die Ballposition auf die Spielerposition zurück.  Der Ausschnitt dafür sieht so aus:

Wenn Sie das Skript speichern und den Editor überprüfen, können Sie sehen, dass jedes Mal, wenn der Ball vom Bildschirm fällt, die Position des Balls auf die Position des Spielers zurückgesetzt und auf inaktiv gesetzt wird.  Wenn Sie jedoch anfangen zu spielen, werden Sie ein seltsames Verhalten bemerken. Jedes Mal, wenn der Ball fällt, erhöht sich beim nächsten Drücken der Aktionstaste die Geschwindigkeit.  Warum ist das so?

Denken Sie daran, dass wir dem Ball beim Start eine Kraft hinzufügen. Jedes Mal, wenn Sie das Spiel zurücksetzen, fügen Sie dem steifen Körper immer mehr Kraft hinzu und machen das Spiel nach einigen Versuchen wahnsinnig hart.  Also, die Frage ist, wie lösen wir das?

Um die gleiche Gesamtkraft beizubehalten, müssen Sie sicherstellen, dass Sie alle Kräfte, die auf den Ball wirken, jedes Mal löschen, wenn Sie ihn zurücksetzen.  Um dies zu tun, können wir einfach den Is Kinematic-Parameter jedes Mal aktivieren, wenn der Ball stoppt, und ihn deaktivieren, wenn das Spiel beginnt.  Dieser Parameter bestimmt, ob der Ball von der Physik beeinflusst wird oder nicht und wenn er deaktiviert wird, wird sichergestellt, dass alle vorher angewendeten Kräfte verschwinden.

Fügen Sie Ihrer Update-Methode zwei weitere Zeilen hinzu, um dies zu tun:

  • rigidbody2D.isKinematic = false, bevor die Kraft hinzugefügt wird, und
  • rigidbody2D.isKinematic = true, wenn wir wollen, dass sich der Ball wieder bewegt.

Am Ende sollte die vollständige Update-Methode wie folgt aussehen:

Jetzt können Sie das Spiel spielen und alle oben genannten Funktionen überprüfen.

Nächstes Mal

Damit ist der zweite Teil der Serie abgeschlossen.  Sie haben jetzt benutzerdefinierte Skripts, Physik-Collider und programmierte Benutzereingaben implementiert.  Beim nächsten Mal richten wir die Blöcke ein.

Wenn Sie Fragen oder Feedback zu den bisher behandelten Themen haben, hinterlassen Sie bitte einen Kommentar.

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.