1. Was haben wir vor in diesem Tutorial?
Ich möchte mit dir heute Schritt für Schritt ein paar Scripte schreiben, die dir ermöglichen Highscores in dein Spiel einzubinden.
Der Highscore Manager soll in der Lage sein verschiedene Highscores zu speichern, zum Beispiel für leichten, mittleren und schweren Spielmodus.
Wir brauchen 2 Skripte dazu, die später zusammen arbeiten sollen:
![Die drei C# Scripte, die wir benötigen](../Images/HighscoreClasses.png)
2. Verwaltung der Daten
In unserem HighscoreManager müssen wir später unsere Daten speichern, laden, einzelne Einträge ändern und sicher auch noch mehr.
Daher sollten wir als erstes darüber nachdenken, welche Daten wir brauchen und wie wir diese am besten organisieren.
Die erste Klasse (HighscoreEntry) dient dazu, einen einzelnen Highscoreeintrag zu speichern.
Diese einzelnen Einträge werden in der zweiten Klasse (HighscoreList) zusammengefasst und mit einer id identifizierbar gemacht
Die letzte Klasse dient dazu, die Daten zusammen zu fassen, um speichern und laden zu können.
Werbung (Affiliate - ich bekomme eine kleine Provision, dein Preis ändert sich nicht)
3. Die HighscoreManager-Klasse
Als erstes sollten wir überlegen welche Felder wir benötigen, denn wir müssen uns die verschiedenen Highscorelisten zunächst einmal speichern um Daten zu ergänzen.
Ausserdem wird es nötig sein, den Filename zu speichern, dazu den Spielernamen und wir wollen auch die maximale Anzahl von Einträgen bestimmen können.
Der PlayerName soll von ausserhalb der Klasse erreichbar und änderbar sein, deshalb legen wir eine Property dafür an.
Weiterhin wird der Pfad zum Speichern und Laden aus PersistentDataPath und unserem Filename zusammengebaut. Application.persistentDataPath ist auf jeder Plattform anders, je nach dem, wo Unity speichern darf im jeweiligen Betriebssystem.
Auf OnDestroy soll der Highscore gespeichert werden, daher rufen wir SaveHighscoreLists() auf. Diese Methode müssen wir dann noch schreiben.
Im nächsten Schritt gib es eine Methode, die eine Liste zurückgibt die mittels der id in der Gesamt-Highscoreliste gesucht wird.
Dann gibt es eine Methode, welche eine Highscoreliste per Id sucht (über die zuvor implementierte Methode). Diese wird anschließend sortiert.
Da dies hier ein Anfängertutorial ist, sortieren wir per BubbleSort-Algorithmus. Dabei wird ein Score in der Liste mit seinem Nachfolger verglichen. Wenn der Nachfolger größer ist, tauschen beide (oder andersrum, je nach Sortierrichtung). Und das solange, bis der Fall, dass ein Nachfolger größer ist, nicht mehr eintritt. Dann ist die Liste sortiert.
Die Schwierigkeit, hier eine fertige Sortiermethode von der Klasse List zu nutzen ist folgende: Die Klasse HighscoreEntry, die in der Liste gespeichert ist, beinhaltet nicht nur den Score sondern auch den Namen des Spielers. Wir müssten also angeben, nach welchen Kreterien hier sortiert werden soll. Das geht zwar auch, gehört aber nicht in dieses Anfängertutorial.
Die nächste Methode prüft, ob es sich wirklich um einen Highscore handelt und gibt einen entsprechenden Wahrheitswert (true oder false) zurück.
Anschließend nutzen wir die obige Methode, um zu schauen, ob es ein Highscore ist, der erzeugt werden soll. Wenn ja wird dieser Highscoreeintrag angelegt.
Die nachfolgende Methode gibt eine Highscoreliste in Form von drei Texten zurück: Ranking, Namen und Scores. Die Texte sind jeweils umgebrochen, man kann Sie also direkt in einem Unity-Text ausgeben.
Was jetzt noch fehlt, ist das Speichern und Laden. Dazu wird die SaveHighscoreData-Klasse genutzt. Diese wird beim Speichern in Json umgewandelt und mit File.WriteAllText geschrieben.
Bei Laden geschieht das ganze genau umgedreht. Das heißt der File wird zuerst gelesen als Json Datei und dann wird daraus eine Instanz von SaveHighscoreData erzeugt.
Hier nochmal die ganze Klasse "HighscoreManager" zusammengefasst:
4. Wie gehts jetzt weiter? Wie benutzte ich das im Spiel?
![Die Komponente HighscoreManager in Unity](../Images/highscoreManagerComponent.png)
Um den Manager zu nutzen, musst Du Ihn natürlich auf ein GameObject ziehen und entsprechend die Komponente einstellen.
![Beispiel für Leaderboard Canvas in Unity](../Images/leaderboardUI.png)
Anschließend könntest Du dir eine Nutzeroberfläche machen mit Unity-Canvas.
Dort hast du z.B. ein Textfeld, indem der Nutzer seinen Namen eingeben kann. Dies blendest Du nur ein, wenn Du zuvor geprüft hast, ob es ein Highscore ist.
Dann wartest Du auf die Eintragung des Namens und trägst den Highscore in die Liste ein.
Falls es kein neuer Highscore ist, zeigst Du gleich die Bestenliste an und stellst einen Button zum Weiterspielen zur Verfügung.
Das folgende Script macht schon einen Teil davon, den Rest schaffst Du selbst!
Viel Spaß!