Einfache Punktesysteme mit Unity Teil 1: Triggerpunkte

Sign in to queue

Description

Wenn ihr ein einfaches, kleines Spiel bastelt und die Spieler bei der Stange halten wollt (oder sie gar zu Wettbewerb animieren wollt), kommt ihr nicht drum herum, eine gewisse Vergleichbarkeit zu ermöglichen.

Zeit also, die Katzenvideos Katzenvideos sein zu lassen und Punkte zählen zu lassen!

Woher soll das Spiel eigentlich wissen, wann ein Punkt zu zählen ist? Oft ist es recht offensichtlich, zum Beispiel wenn der Charakter über eine Münze oder einen Diamanten läuft, wenn ihr eine Schatztruhe öffnet und so weiter. Aber bei Hopping Dragon habe ich keine Münzen, Schatztruhen oder ähnliches - der Punkt wird quasi im luftleeren Raum gezählt. Schwarze Magie?

Grundlegend brauchen wir mal eine Spielfigur, die Komponenten des Typs Collider (und Rigidbody) aufweist. Ihr könnt in dem vorangegangenen Artikel nachlesen, wie Komponenten hinzugefügt werden :)

Das Hindernis um eine Punktezone erweitern

Wenn wir uns an dem Projekt aus dem Microsoft Virtual Academy Kurs zum Thema Unity orientieren, haben wir folgendes Hindernis-Objekt als Grundlage:

Generic Episode Image

Ein leeres GameObject als "Behälter" und darin das obere und untere Wandelement, jeweils mit einer Collider-Komponente.

Als erstes legen wir über GameObject -> Create Empty ein neues, leeres Spielobjekt an und nennen sie so, dass wir sie als Punktzone identifizieren können - zum Beispiel Score Trigger. Diese ziehen wir dann in das Hindernis-Objekt hinein.

 Generic Episode Image

Und jetzt verpassen wir dem Score Trigger auch eine Box-Collider-2D-Komponente, wie gehabt. Allerdings aktivieren wir das Häkchen bei "Is Trigger" dieses mal.

Generic Episode Image

Das führt dazu, dass der Spieler zwar an den oberen und unteren Wänden abprallt, durch den Score Trigger aber durchfällt.

Es ist übrigens sinnvoll, auch dem leeren Spielobjekt einen Rigidbody2D zu geben (und ggf. "Is Kinematic" zu aktivieren, damit die Schwerkraft nicht wirkt), falls ihr es durch die Gegend bewegen müsst. Wie bereits an anderer Stelle gesagt, gehen Collider und Rigidbody üblicherweise Hand in Hand.

Generic Episode Image

Jetzt beginnt ein bisschen Feinarbeit: da der Box Collider bzw. das Spielobjekt unter Umständen an einer völlig anderen Stelle sein könnten, als das restliche Hindernis.

Markiert in der Hierarchie-Übersicht den Score Trigger und bearbeitet ihn entweder im Inspektor oder in der Szenenansicht (mittels Verschieben und Größenanpassungen) so, dass ihr eine Schmale, hochgestreckte Zone zwischen den beiden Hinderniswänden erhaltet - die Punktezone:

Generic Episode Image

Ihr könnt die Zone natürlich auch so gestalten, dass nur ein sehr mittiger, kleinerer Bereich als Punkt gewertet wird. Das solltet ihr dem Spieler dann aber auch anderweitig kenntlich machen, indem ihr zum Beispiel eine Münze einfügt.

Der Zone gebt ihr dann noch einen Tag, zum Beispiel "Score". Wie das geht, könnt ihr ebenfalls hier nachlesen. Jetzt habt ihr ein Hindernis-Konstrukt, das aus zwei Wänden und einer Punktezone besteht sowie einem übergeordneten Spielobjekt zur Gruppierung.

Die Kollisionskomponenten der einzelnen Unterobjekte werden als komplexes Gesamtkonstrukt zusammengefasst - damit ihr also mal kompliziertere Gegnerfiguren erstellen könnt, bei denen die Arme anderen Schaden verursachen als Rücken, Kopf oder Füße - ist es bereits jetzt wichtig, sich die Arbeit mit den jeweiligen GameObjects anzugewöhnen.

Exkurs: Das Debug-Fenster

Woher wissen wir jetzt, dass die Zone als solche Funktioniert? Ganz einfach, wir verwenden die Unity-eigene Debug-Konsole.

Debuggen bedeutet so viel wie Fehler identifizieren und suchen - in der Konsole werden vor allem Fehler und Warnungen ausgegeben, die bei der Ausführung eures Spiels ausgegeben. Ihr könnt sie euch anzeigen lassen, indem ihr im Menü auf Window -> Console klickt.

Generic Episode Image

Die Debug-Konsole selbst schaut so aus:

Generic Episode Image

Nun könnt ihr aber auch, neben Fehlern und Warnungen, eigene Nachrichten dort hineinschreiben. Die dazugehörige Methode lautet:

Debug.Log(Inhalt);

Den Inhalt könnt ihr entweder mit Variablen befüllen (um euch den aktuellen Wert anzeigen zu lassen - mehr dazu später) oder mit einer einfachen Textnachricht.

Den Spieler durch die Punktezone schicken

Legen wir also ein neues Skript an, das wir an den Spieler heften können und nennen es zum Beispiel "ScoreTrigger".

Warum ein neues Skript nur dafür? Ihr könntet natürlich auch lediglich ein einziges "PlayerControl"-Skript führen und es stetig erweitern. Und um ehrlich zu sein, habe ich auch genau so angefangen, es aber schnell bitter bereut. Wenn ich in einer Testszene etwas ausprobieren möchte, will ich möglicherweise nur Teilfunktionen übernehmen. Dann tue ich mich deutlich leichter damit, wenn ich die einzelnen Funktionsbereiche auf entsprechend einzelnen Komponenten bzw. Skripten halte. Die Wiederverwendbarkeit und die Übersicht (paradoxerweise, da die Dateimenge ja deutlich steigt) sind einfach größer.

Die Methoden Start und Update benötigen wir nicht, statt dessen legen wir eine neue Methode an und befüllen sie folgendermaßen:

void OnTriggerEnter2D(Collider2D otherObject)
    {
        if (otherObject.gameObject.tag == "Score")
        {
            Debug.Log("Score!");
        }
    }

Zur Erklärung:

OnTriggerEnter2D(Collider2D otherObject) heißt so viel wie "wenn du gegen einen als Trigger markierten anderen Collider läufst, tue dieses. Das (andere) Triggerobjekt wird hierbei mit "otherObject" identifiziert."

Die if-Abfrage prüft, ob das Trigger-Objekt (otherObject.) den Tag (gameObject.tag) "Score" besitzt.

Exkurs: einfache und doppelte Gleichheitszeichen

Der Unterschied zwischen doppelten und einfachen Gleichheitszeichen ist übrigens der, dass ein einfaches Gleichheitszeichen einen Wert zuweist (a = 5; -> der Variable a wird der Wert 5 zugewiesen) und ein doppeltes Gleichheitszeichen prüft in Zusammenhang mit Schleifen oder Abfragen, ob die linke mit der rechten Seite übereinstimmt (if (a == 5) usw.: Wenn die Aussage a ist gleich 5 wahr ist.... )

Also: wenn ihr etwas zuweisen wollt, dann nehmt ihr nur ein "=", wenn ihr etwas vergleichen wollt, dann zwei.

Mit Debug.Log("Score!"); gebt ihr in der Debug-Konsole den Text "Score!" aus, wann immer ihr durch die Punktezone rauscht.

Probierts aus! Wie sieht euer Spiel aus? Wie groß soll euer Punktebereich sein? Zeigt ihr ihn an oder ist er auch unsichtbar? Schreibts mir doch in die Kommentare :)

In Teil 2 zählen wir dann die Punkte selbst - stay tuned!

The Discussion

Add Your 2 Cents