Einführung 2D Spiele mit Unity entwickeln - Interaktionen

Sign in to queue

Description

Als nächstes befassen wir uns damit, wie wir die vorhin erstellte Spielfigur per Klick durch in die Luft befördern können und sie sich automatisch nach rechts bewegen lassen.

Hüpfen

Das magische Schlüsselwort für die Spielerinteraktionen sind Skripte. Klickt in der Projektübersicht auf den Ordner "Skripte" und dann auf das Feld "Create", wo ihr "C# Script" auswählt. Die neu erstellte Datei benennt ihr

PlayerController

Wenn ihr sie habt, macht ihr zwei Dinge:

Zuerst zieht ihr das Skript auf die Spielerfigur in der Hierarchie. Dann klickt ihr doppelt auf die Datei, um den Skript-Editor zu öffnen, der euch folgendes anzeigt:

using UnityEngine;

using System.Collections;

public class PlayerController : MonoBehaviour {

// Use this for initialization

void Start () {

 }

 // Update is called once per frame

void Update () {

}

}

Direkt nach public class PlayerController : MonoBehaviour { schreibt ihr jetzt folgendes rein:

"

public Vector2 jumpForce;

"

Speichert die Datei ab und geht zurück in das Fenster von Unity, wo ihr die Spielfigur auswählt.

Anmerkung: ich habe mein Skript ein wenig anders benannt, nämlich PlayController, hier kommt es aber auf die Jump Force an:

Generic Episode Image

Ihr seht, Unity schlüsselt das sogenannte Camelcase (die Verwendung von Groß- und Kleinbuchstaben in Variablennamen) so auf, dass jeweils vor einem Großbuchstaben ein Leerzeichen eingefügt wird. Und ihr seht, ihr könnt die X- und Y-Koordinaten für die Jump Force in dem Inspektor ändern.

Würdet ihr statt "public Vector2 jumpForce" schreiben "public float jumpForce;" würde lediglich ein Ziffernfeld auftauchen - die Anzeige im Inspektor richtet sich danach, welchen Variablentypen ihr auswählt.

Der Begriff "public" sorgt übrigens dafür, dass die Variable im Spiel veränderbar ist. Lasst ihr das weg, verschwindet die Variable aus dem Inspektor.

Eine Alternative ist übrigens auch die folgende Schreibweise:

"

[SerializeField]
Vector2 jumpForce;
"

Damit ist die Variable nicht komplett öffentlicht, ihr könnt sie aber dennoch im Inspektor bearbeiten.

Kurz zu den Methoden:
"void Start()" wird einmal mit der Objektinitialisierung ausgeführt; "void Update()" mit jedem Frame erneut.

Jetzt wollen wir aber, dass sich die Spielfigur auch bewegt. Und zwar als erstes möchte ich, dass die Figur bei Klick (oder Berühren eines Bildschirms) springt.

 Gehen wir in die Methode "void Update()" und fügen folgende Code-Zeilen hinzu:

if ( Input.GetMouseButtonUp(0))

{

rigidbody2D.AddForce(jumpForce);

}

Die if-Abfrage geht danach, ob eine Maustaste geklickt wurde, nämlich die linke (0). Ich könnte prinzipiell auch sagen "Input.GetMouseButton", aber mit dem Zusatz "up" sorge ich dafür, dass die Aktion pro Klick wirklich nur einmal ausgeführt wirde, nämlich wenn ich die Maustaste gerade wieder loslasse.

rigidbody2D.AddForce(jumpForce); bewirkt, dass auf mein Spielobjekt eine Kraft ausgeübt wird, mit den Werten von JumpForce. Speichert das Skript und geht zurück zu Unity, um im Inspektor die Jump Force-Werte anzupassen. Lasst den X-Wert auf 0 und stellt bei Y mal für den Anfang 300 ein.

Startet das Spiel und klickt in den Spielbildschirm. Ihr werdet sehen: die Spielfigur springt! Die Feinheiten über die Sprungkraft könnt ihr jetzt in Ruhe balancieren, während ihr horizontal gesehen zumindest noch auf der Stelle hüpft.

Automatisch vorankommen

Jetzt wollen wir aber auch, dass die Spielfigur sich immer weiter nach rechts bewegt.

Legt erstmal bei den anderen Variablen noch eine Fließkommazahl "speed" an:

public float speed = 4;

Ihr werdet es schon richtig vermutet haben, dazu müssen wir in die void Update()-Methode gehen.

Zuerst legen wir einen neuen Vector3 an:

Vector3 moveObject = Vector3.right;

Dieser Vektor bewegt sich also erst einmal in der horizontalen Ebene.

Um die Spielfigur automatisch nach rechts zu bewegen, fügt ihr noch folgendes ein:

this.transform.position += moveObject * speed * Time.deltaTime;

this konkretisiert, dass das Spielobjekt angesprochen wird, auf dem das Skript liegt. transform greift auf die Komponente "Transform" zu, in dem auch die Lage-Koordinaten enthalten sind. position wiederum konkretisiert, dass jetzt auch die Lagekoordinaten verändert werden sollen.

"+=" ist ein in der Programmierwelt gängiger Operator, der nichts anderes aussagt als "füge dem Wert auf der linken Seite noch den Wert auf der rechten Seite des Operators hinzu". Einfacheres Beispiel:

int a = 5;
a +=2;

Wir legen eine Ganzzahl-Variable mit dem Wert 5 an. Im nächsten Schritt wird der 5 noch eine 2 hinzugefügt, sodass der Wert von a nach der Operation bei 7 liegt.

Time.deltaTime ist ein notwendiger Multiplikator, um dafür zu sorgen, dass die Bewegungsgeschwindigkeit auf allen Maschinen gleich ist. Mit unterschiedlichen Prozessorleistungen ist die Frame-Rate auf jedem System etwas anders, daher solltet ihr sie auf diese Art und Weise angleichen.

The Discussion

Add Your 2 Cents