Einfache Punktesysteme mit Unity, Teil 2: HighScore!

Sign in to queue

Description

Im letzten Post haben wir den Grundstein dafür gelegt, dass das Spiel zumindest weiß, wann ein Punkt gezählt werden soll.

Jetzt wollen wir mal die Punkte auch tatsächlich zählen lassen und ein simples, lokales Highscore-System einbauen. Schließlich wollt ihr auch damit angeben, welchen Höchstpunktestand ihr mal erreicht habt (oder wissen, welchen High Score ihr überbieten müsst).

Die Kernmechanik

Legen wir als erstes ein neues, leeres  GameObject an, das wir zum Beispiel "ScoreCount" benennen.

Unity funktioniert vor allem über GameObjects und deren Komponenten. Ihr könnt zwar auch Skripte und Werte verwenden, die an kein GameObject geheftet sind - sogenannte statics - aber versucht zumindest, soweit es geht über GameObjects zu gehen.

Als nächstes geben wir dem Controller ein Skript - "ScoreCountController". In diesem Script fügt ihr zwei Dinge hinzu: eine öffentliche Variable (aktueller Punktestand) und eine einfache, öffentliche Methode, die den Punktestand erhöht:

public int currentscore;

public void RaiseScore()
{
currentscore++;
}
void Start()
{
currentscore = 0;
}

In der Start-Methode stellt ihr sicher, dass jede neue Spielrunde mit einem Punktestand von 0 anfängt.

"currentscore++" ist eine abgekürzte Schreibweise für "currentscore = currentscore + 1" (d.h. der aktuelle Wert von currentscore wird um 1 erhöht).

Führt ihr das Spiel jetzt aus, passiert erstmal noch nichts - es gibt zwar die Methode, mit der der Punktestand erhöht wird, aber ihr wisst ja noch nicht, wann diese Methode ausgeführt werden soll.

Gehen wir zurück in das ScoreTrigger-Skript, das wir letztes mal angelegt haben und ergänzen es noch ein wenig:

Gleich zu Beginn fügt ihr folgendes ein:

    public GameObject scoreObject;
    ScoreCountController scoreTrigger;

Speichert das Skript und wechselt zurück zu Unity. Dort könnt ihr, nachdem ihr das Spielerobjekt ausgewählt habt, im Inspektor den ScoureCount auf das neu erschienene Feld ziehen:

Generic Episode Image

"ScoreCountController scoreTrigger;" ist ein Platzhalter, der es euch später ermöglicht, auf die Funktionen aus dem eben angelegten Skript zuzugreifen und beispielsweise Methoden, wie RaiseScore(); zu verwenden.

Gestaltet hierfür die Start-Methode wiefolgt:

    void Start () {

        scoreTrigger = scoreObject.GetComponent<ScoreCountController>();
      

    }

Mit GetComponent<T>(); könnt ihr auf die Komponente des Typs "T" (in unserem Fall "ScoreCountController") eines Spiels zugreifen und damit arbeiten. Hier weist ihr also die Skript-Komponente ScoreCountController vom ScoreObject dem "scoreTrigger" zu und könnt via scoreTrigger mit den Methoden arbeiten ... solange sie öffentlich, also public sind.

Zu guter Letzt geht ihr jetzt noch in die OnTriggerEnter2D-Methode, die wir ebenfalls im letzten Teil angelegt haben. Direkt unter "Debug.Log("Score!"); fügt ihr folgende Zeile ein:

 

scoreTrigger.RaiseScore();
Debug.Log(scoreTrigger.currentscore);

Das Debug.Log zeigt euch den jeweils aktuellen Punktestand an, da wir noch kein UI-Element haben, welches dies sichtbar macht.

Punktestand zwischen Szenen übernehmen

Um recht einfach einen Spielstand zwischen Szenen übernehmen zu können - sogar zwischen Spielsessions - gibt es ein Feature namens "PlayerPrefs". Hiermit könnt ihr einfache Datensätze hinterlegen und abfragen.  

Im ScoreCountController-Skript fügt ihr also noch folgende Methode hinzu:

    public void SaveScore()
    {
        PlayerPrefs.SetInt("currentscore", currentscore);
    }

So wird der jeweils aktuelle Punktestand in den Spielspeicher geschrieben, wenn die Methode aufgerufen wird.

Jetzt legt ihr ein GameOver-Skript für den Spieler an - wenn der Spieler in die Wand kracht, soll er auf einen Game Over-Screen kommen. 

Also, neues Skript und auf den Spieler ziehen. Bereitet es bitte genauso vor wie das ScoreTrigger-Skript, bis auf die Trigger-Methode.

Statt dessen schreibt ihr rein:

void OnCollisionEnter2D(Collision2D otherObject)
    {
        if (otherObject.gameObject.tag == "Wand")
        {
            scoreTrigger.SaveScore();
        }
    }

 

Nach der SaveScore-Methode könnt ihr andere Methoden aufrufen, die euch entweder ins nächste Level oder zum Game Over-Bildschirm befördern.

In der neuen Szene könnt ihr den Punktestand dann via

 

 int lastscore = PlayerPrefs.GetInt("currentscore");

auslesen.

So habt ihr einen kleinen Punktemechanismus.

Probiert doch einmal aus, das bisher gelernte so anzuwenden, dass ihr auch den jeweils höchsten erreichten Punktestand speichern und gar anzeigen könnt!

 

The Discussion

Add Your 2 Cents