So programmieren Sie eine selbst gehostete PHP / SQL-Rangliste für Ihr Spiel

In diesem Artikel erstellen wir unsere erste MySQL-Bestenliste, die auf einer Website oder einem Webserver mit einfachem PHP und etwas SQL gehostet wird. Wir erstellen dann ein einfaches Unity-Beispiel in C # GUIText Objekte, um neue Werte in die Bestenliste aufzunehmen, zeigen die Top-Ten-Ergebnisse an und zeigen die Punktzahl und den Rang eines Benutzers an.


Einführung

Einzelspieler-Spiele machen Spaß, aber wenn Sie Ihren eigenen Highscore schlagen, kann dies langweilig werden. Das Hinzufügen einer Bestenliste zu Ihrem Spiel ist eine echte Motivation für die Spieler, ihre Punktzahlen zu verbessern und Ihr Spiel mehr zu spielen, und es kann sogar verwendet werden, um herauszufinden, ob Ihr Spiel zu einfach oder zu schwierig ist. In Spielen, die für immer andauern, können Ranglisten der einzige Grund sein, warum Ihre Spieler spielen. Wenn Sie über eine eigene Website oder einen eigenen Server verfügen, möchten Sie möglicherweise Ihre eigene Bestenliste hosten, sodass Sie die vollständige Kontrolle über Ihr Spiel haben.


Erstellen Sie Ihre Bestenliste

Zuallererst benötigen Sie eine SQL-Datenbank auf Ihrem Server oder Standort. Websites enthalten oft eine integrierte MySQL-Datenbank. Details dazu hängen von dem von Ihnen verwendeten Dienst ab. Sie sollten jedoch in der Lage sein, Ihren SQL-Host, Ihren Benutzernamen und Ihr Kennwort (sowie Ihren Datenbanknamen) in Ihrem Administrationsbereich oder Ihrer Registrierungs-E-Mail zu finden.

In diesem Beispiel wird phpMyAdmin verwendet, um auf die Datenbank zuzugreifen (direkt im Admin-Panel integriert). Sie möchten Ihre Datenbank öffnen und die Registerkarte SQL öffnen. Wenn Sie mehr Kontrolle über Ihren Server haben, können Sie eine neue Datenbank erstellen.

Als nächstes fügen Sie die folgende SQL ein:

 CREATE TABLE Scores (Name VARCHAR (10) NOT NULL DEFAULT 'Anonym' PRIMARY KEY, Score INT (5) UNSIGNED NOT NULL DEFAULT '0', ts TIMESTAMP NICHT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE = InnoDB;

Dadurch wird eine Tabelle mit drei Variablen erstellt:

  • Name, die die Namen Ihrer Benutzer enthält und die 10 Zeichen enthält. Dies ist der Hauptbezeichner unserer Tabelle. Das bedeutet, dass nur eine Zeile pro Benutzername gespeichert werden kann.
  • Ergebnis, das hält die höchste Punktzahl jedes Benutzers. In diesem Beispiel handelt es sich um eine vorzeichenlose Variable, daher kann sie nur positiv sein. Wenn Sie negative Werte haben möchten, müssen Sie dies ändern.
  • ts, Ein Zeitstempel, mit dem wir die Reihenfolge unserer Bestenliste ändern können.

Wenn Sie nun SQL Server und nicht MySQL verwenden, können Sie dies immer noch verwenden TIMESTAMP, aber für den Wert müssen Sie verwenden VERABREDUNG BEKOMMEN() anstatt AKTUELLER ZEITSTEMPEL.

Eine zusätzliche Sache, die Sie beachten sollten: Wenn Sie ein sehr einfaches Spiel erstellen, möchten Sie möglicherweise keine Punkte an Namen binden (um zu ermöglichen, dass jeder Spieler mehrere Punkte in den Top 10 hat). Dies kann jedoch eine schlechte Idee sein. Vielleicht haben Sie einen Spieler, der so gut ist, dass er Ihre gesamten Top 10 dominieren kann! In diesem Fall wollen Sie nicht Name als Primärschlüssel, und Sie möchten auch Folgendes hinzufügen:

 id INT (8) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

Dadurch wird sichergestellt, dass für jede Partitur eine erkennbare neue Zeile hinzugefügt wird.

Klicken Gehen und du bist fertig! Dein Tisch ist jetzt fertig.


Einrichten Ihrer PHP-Dateien

Nun müssen Sie einige PHP-Dateien erstellen. Dies sind die mittleren Personen der Operation, die es Unity ermöglichen, auf Ihren Server zuzugreifen. Die erste PHP-Datei, die Sie benötigen, ist AddScore.php. Sie müssen die Serverinformationen von vorher kennen.

  

(Ersetzen SQLHOST, SQLUSER, SQLPASSWORD und IHREDATENBANK mit Ihren eigenen Informationen.)

Hier haben wir gerade versucht, eine Verbindung zur Datenbank herzustellen. Wenn die Verbindung fehlschlägt, wird Unity darüber informiert, dass die Anforderung nicht erfolgreich war. Nun möchten Sie einige Informationen an den Server weitergeben:

 $ username = mysql_real_escape_string ($ _ GET ['name'], $ db); $ score = mysql_real_escape_string ($ _ GET ['score'], $ db); $ hash = $ _GET ['hash']; $ privateKey = "ADDYOURKEY";

Der Hash wird verwendet, um Ihre Daten zu verschlüsseln und zu verhindern, dass Leute Ihre Bestenliste hacken. Sie wird in Unity und hier mit einem versteckten Schlüssel generiert. Wenn die beiden Hashes übereinstimmen, haben Sie Zugriff auf Ihre Datenbank.

 $ expected_hash = md5 ($ username. $ score. $ privateKey); if ($ expected_hash == $ hash) 

Hier erzeugen wir den Hash selbst und prüfen, ob der von Unity übergebene Hash identisch mit dem erwarteten Hash ist. Wenn ja, können wir Ihnen unsere Anfrage senden!

 $ query = "INSERT INTO Scores SET name = '$ name', score = '$ score', ts = CURRENT_TIMESTAMP

Dies ist die erste Hälfte unserer SQL-Abfrage. Es sollte ziemlich selbsterklärend sein; Der übermittelte Score und der Benutzername werden der Tabelle hinzugefügt und der Zeitstempel wird aktualisiert. Die zweite Hälfte ist komplizierter:

 ON DUPLICATE KEY UPDATE ts = if ('$ score'> score, CURRENT_TIMESTAMP, ts), score = if ('$ score'> score, '$ score', score); ";

Wir prüfen zunächst, ob der Benutzername (unser Primärschlüssel) bereits eine Zeile hat. Wenn dies nicht der Fall ist, wird unser Eintrag aktualisiert, anstatt einen neuen Eintrag einzufügen. Wir möchten den Zeitstempel und den Score aktualisieren, jedoch nur, wenn der neue Score höher ist!

Verwenden ob In diesen Anweisungen stellen wir sicher, dass die neuen Werte nur verwendet werden, wenn die neue Bewertung größer als die aktuelle Bewertung ist. Andernfalls werden die ursprünglichen Werte verwendet.

 $ result = mysql_query ($ query) oder die ('Abfrage fehlgeschlagen:'. mysql_error ()); ?>

Zum Schluss führen wir unsere Abfrage aus und schließen unser PHP.

Diese Datei wird auf unserem Server gespeichert. Sie müssen sich die URL merken. Ebenso müssen wir zwei weitere PHP-Dateien mit unterschiedlichen Abfragen erstellen, die wir aufrufen möchten TopScores.php und GetRank.php.

Das Höchstpunktzahl Abfrage ist einfach:

 SELECT * FROM Bewertung ORDER nach Punktzahl DESC, ts ASC LIMIT 10

Dadurch werden die ersten 10 Werte basierend auf der Punktzahl ermittelt, und für gleichrangige Plätze werden Spieler, die die höchste Punktzahl erreicht haben, am weitesten oben in der Tabelle platziert. Dieses Mal möchten wir auch Daten extrahieren, und fügen hinzu:

 $ result_length = mysql_num_rows ($ result); für ($ i = 0; $ i < $result_length; $i++)  $row = mysql_fetch_array($result); echo $row['name'] . "\t" . $row['score'] . "\n"; 

Dadurch werden unsere Ergebnisse extrahiert und tabelliert, sodass wir sie in Unity in Arrays einfügen können.

Endlich haben wir GrabRank:

 SELECT uo. *, (SELECT COUNT (*) FROM Scores ui WHERE (ui.score, -ui.ts)> = (uo.score, -uo.ts)) AS rank FROM Scores uo WHERE name = '$ name' ;

Dies gibt uns den Rang unseres Spielers in der Anzeigetafel. Wir können es dann durch Echo extrahieren $ row ['rank'].

Unser Quellcode enthält auch eine Desinfektionsfunktion, die verhindert, dass Benutzer Schimpfwörter in Ihre Bestenliste eingeben oder einen SQL-Injektionsangriff durchführen.


Ein einfaches Minispiel in Unity erstellen

Jetzt brauchen wir ein Spiel, um unser Highscore-Board zu verwenden! Wir werden nur testen, wie viele Klicks jeder Benutzer innerhalb von zehn Sekunden ausführen kann, aber Sie können Ihre Rangliste zu jedem Spiel hinzufügen.

Layout

Wir werden mit vier anfangen GUIText Objekte. Diese sollten der Einfachheit halber in der Mitte verankert sein. Sie können diese mit dem Pixelversatz anpassen, um sie an die richtige Stelle zu bringen. Wenn Sie jedoch möchten, dass sie ihre Position für jede Auflösung anpassen, ist es einfacher, die Auflösung zu ändern X und Y Position (zwischen 0 und 1); Andernfalls müssen Sie sie beim Start anpassen.

Sie müssen jedoch die Schriftgröße beim Start anpassen, wenn Sie alle Auflösungen verwenden möchten. Sie können dies schnell tun, indem Sie die Höhe des Bildschirms festlegen. Wir können dies tun, indem wir eine Klasse erstellen, die dies tut, und sie an alle unsere Textobjekte anhängen, aber es ist viel einfacher, dies alles von einer Klasse aus zu tun.

Es ist nicht wirklich wichtig, welches Objekt wir als "Manager" wählen, also können wir diese Klasse einfach auf unseren Klickschalter setzen. In unserem ersten Kurs schreiben wir also:

 void Start () foreach (GUIText chosentext in FindObjectsOfType (typeof (GUIText)) als GUIText []) chosentext.blah.fontSize = Mathf.FloorToInt (Screen.height * 0.08f); 

Dadurch wird jedes Textobjekt in der Szene gefunden und auf eine sinnvolle Größe skaliert.

Jetzt möchten wir, dass der Klickzähler größer als der andere Text ist. Wenn wir diese Klasse dort beibehalten, haben wir den zusätzlichen Bonus, mit dem wir auch prüfen können, ob der guiText fraglich ist der, der diesem angehängt ist GameObject:

 if (blah == guiText) blah.fontSize = Mathf.FloorToInt (Screen.height * 0.18f); sonstiges [etc.]

Gameplay

Die Klickkomponente des Spiels wird sehr einfach sein. Zu Beginn möchten wir nicht, dass der Timer bis zum ersten Klick heruntergezählt wird, also machen wir zwei privat bools in unserer Klasse - firstClick und allowedToClick. Im Start() wir können einstellen firstClick zu falsch und allowedToClick zu wahr.

Jetzt brauchen wir den Zähler, um die Klicks tatsächlich aufzuzeichnen. Dafür gibt es mehrere Möglichkeiten. Wir könnten eine Ganzzahlvariable beibehalten, die die Punktzahl verfolgt, oder wir könnten es etwas weniger effizient machen, aber in einer Zeile (und mit etwas so Einfachem müssen wir nicht wirklich optimieren, aber es ist eine gute Praxis). Also registrieren wir den Klick im Aktualisieren() Funktion und erhöhen Sie den Wert durch Lesen der Zeichenfolge.

 void Update () if (allowedToClick && Input.GetMouseButtonUp (0)) if (! firstClick) firstClick = true; StartCoroutine (Countdown ());  guiText.text = (System.Int32.Parse (guiText.text) + 1) .ToString (); 

Wie Sie hier sehen, wird die Inkrementierung erreicht, indem Sie die Zeichenfolge als Ganzzahl lesen, eine Eins hinzufügen und dann wieder in eine Zeichenfolge konvertieren. Sie werden hier auch sehen, dass wir eine Coroutine ausgeführt haben, sobald der Benutzer zum ersten Mal klickt, was den Countdown startet.

Wir verwenden Rekursion in dieser Funktion. Wir könnten auch hier eine Ganzzahl verwenden, die den Countdown-Wert für die Effizienz enthält, aber wir werden erneut die String-Manipulation verwenden.

 IEnumerator Countdown () Rendite zurückgeben neues WaitForSeconds (1); counter.guiText.text = (System.Int32.Parse (counter.guiText.text) - 1) .ToString (); if (counter.guiText.text! = "0") StartCoroutine (Countdown ());  else allowedToClick = false; GetComponent(). Setscore (System.Int32.Parse (guiText.text)); toptext.guiText.text = "Geben Sie Ihren Benutzernamen ein."; GetComponent() .enabled = true; 

Hinweis: Es ist wichtig, dass wir verwendet haben StartCoroutine () und hat diese Funktion nicht nur aufgerufen, weil es eine ist IEnumerator. Das Ausbeute Anweisung bewirkt, dass eine Sekunde gewartet wird, bevor eine Aktion ausgeführt wird. Es entfernt eins vom Zähler, und wenn der Wert nicht Null ist, ruft es sich erneut auf. Auf diese Weise zählt die Funktion bis zum Erreichen der Anzahl 0.

Namenseintrag

Danach stoppt der Benutzer das Klicken, fragt nach dem Benutzernamen und greift auf unsere zweite und dritte Klasse zu (die wir gerade schreiben werden). Wir werden sehen, was diese jetzt tun, beginnend mit NameEnter.

Im NameEnter () Wir werden es einem Benutzer erlauben, seinen Benutzernamen mit einigen Einschränkungen einzugeben. Zunächst möchten wir den Unterstrich darstellen _, Diese werden gelöscht, sobald sie ihren Namen eingeben. Außerdem möchten wir nicht, dass sie Charaktere wie verwenden können \ oder ', da diese unsere SQL-Abfragen durcheinanderbringen würden.

Wir werden einen String-Builder verwenden, um dies zu erstellen. Zuerst setzen wir einige Variablen an die Spitze unserer Klasse:

 private int MaxNameLength = 10; private StringBuilder Spielername; privater bool backspacepossible; private bool initialpress;

Das MaxNameLength sollte auf die gleiche Länge wie für Ihr gesetzt werden VARCHAR Länge, wenn Sie Ihren Tisch gemacht haben. Hier haben wir unseren String-Builder, Spielername, und zwei Booleaner. Der Erste, Rücktaste möglich, dient dazu, die Fähigkeit des Benutzers zu steuern, die Rücktaste gedrückt zu halten, um Zeichen zu löschen. Die zweite ist, um anzuzeigen, ob sie ihren Namen schon eingegeben haben.

Im Start(), Wir müssen uns um ein paar Dinge kümmern. Wir werden den gesamten Text außer dem aufgerufenen deaktivieren Top-text; wir können das in einer für jeden Schleife wie zuvor.

 void Start () foreach (GUIText-Text in FindObjectsOfType (typeof (GUIText)) als GUIText []) if (text.name! = "Toptext") text.guiText.enabled = false;  GetComponent() .enabled = false; playerNameTemp = neuer StringBuilder (); playerNameTemp.Append ("_"); backspacepossible = true; Anfangsdruck = falsch; 

Hier sehen Sie, dass wir ein paar Dinge getan haben. Wir haben unseren ersten Kurs deaktiviert (ClickTimes) da wir es nicht mehr benutzen. Wir haben auch eine Instanz von erstellt playerNameTemp und fügte es mit _, So können die Spieler sehen, wo sich ihr Name befindet, und wir haben unsere Variablen initialisiert.

Jetzt müssen wir dem Spieler erlauben, seinen Namen tatsächlich einzugeben. Am Ende von Aktualisieren() wir platzieren den folgenden Ausschnitt:

 guiText.text = playerNameTemp.ToString ()

Dadurch wird sichergestellt, dass der Text anzeigt, was unser String-Builder aufzeichnet.

Als nächstes behandeln wir die Zeicheneingabe:

 if (playerNameTemp.Length < MaxNameLength)  foreach (char c in Input.inputString)  if (char.IsLetterOrDigit(c) || c == '_' || c ==")  if (!initialpress)  initialpress = true; playerNameTemp.Remove(0, 1);  playerNameTemp.Append(c);   

Vorausgesetzt, die Länge des Zeichenfolgen-Generators ist geringer als die maximale Namenlänge, und solange der Benutzer Zeichen eingibt, die entweder Buchstaben, Ziffern, Leerzeichen oder Unterstriche sind (obwohl Sie möglicherweise nur alphanumerische Zeichen zulassen möchten), wird der String angezeigt mit der neuen Ziffer angehängt. In diesem Fall wird der ursprüngliche Unterstrich entfernt, bevor der neue Buchstabe hinzugefügt wird.

Nächster:

 if (playerNameTemp.Length> 0) if (Input.GetKeyDown (KeyCode.Backspace)) if (! initialpress) initialpress = true;  backspacepossible = false; StartCoroutine (BackspaceInitialHold ()); playerNameTemp.Remove (playerNameTemp.Length - 1, 1);  else if (backspacepossible && Input.GetKey (KeyCode.Backspace)) backspacepossible = false; StartCoroutine (BackspaceConstantHold ()); playerNameTemp.Remove (playerNameTemp.Length - 1, 1);

Solange in unserem String Builder keine Zeichen mehr vorhanden sind und ein Rückschritt möglich ist, kann der Benutzer Zeichen entfernen. Beachten Sie den Unterschied zwischen der ersten und der zweiten Anweisung. Der ehemalige Gebrauch GetKeyDown (), während letztere verwendet GetKey () (und prüft unseren bool). Der Unterschied ist, dass wir ein Zeichen jedes Mal löschen sollten, wenn der Benutzer die Rücktaste drückt, aber nicht ständig, wenn der Benutzer es gedrückt hält.

Die Coroutinen BackspaceInitialHold () und () einfach warten 0,15 und 0,05 Sekunden bzw. dann eingestellt Rücktaste möglich zu wahr. Also nachdem unser Benutzer die Rücktaste für gedrückt gehalten hat 0,15 Sekunden, solange sie noch die Rücktaste halten, wird ein Zeichen jedes Mal gelöscht 0,05 Sekunden (solange der Länge ist größer als Code> 0).

Außerdem legen wir fest, dass der Benutzer die erste Taste drückt, wenn dies die erste Schaltfläche ist, Erstpressung wird ausgelöst (es wird also nicht versucht, einen Charakter zu entfernen, sobald er etwas anderes drückt).

Um das Ganze abzurunden, müssen wir dem Benutzer erlauben, zu drücken Rückkehr um die Namenseingabe zu beenden.

 if (playerNameTemp.Length> 0 && initialpress) if (Input.GetKeyDown (KeyCode.Return)) foreach (GUIText-Text in FindObjectsOfType (typeof (GUIText)) als GUIText []) text.guiText.enabled = false;  GetComponent() .SetName (guiText.text); GetComponent() .enabled = true; aktiviert = falsch; 

Solange der Benutzer Eingaben gemacht hat und die Länge ist größer als 0, Der Name wird akzeptiert. Alle unsere Textobjekte werden gelöscht, wir deaktivieren diese Klasse und aktivieren die dritte Klasse, Highscore. Alle drei Klassen müssen im Editor auf unser Objekt gestellt werden.

Wir haben gerade angerufen Highscore's Name einsetzen() Funktion, und früher haben wir angerufen SetScore (). Jede dieser Funktionen legt einfach die Werte privater Variablen fest, die wir jetzt an unsere Bestenliste übermitteln.


Zugriff auf Ihre Bestenliste in Unity

Oben Highscore Wir möchten einige Variablen deklarieren. Zuerst:

 public GameObject BaseGUIText;

Dies ist das GUIText Fertig, dass wir unser Leaderboard auf Basis Sie sollten sicherstellen, dass der Text in der Mitte links verankert und nach links ausgerichtet ist. Sie können auch hier eine Schriftart auswählen.

 private string privateKey = "DER SCHLÜSSEL, DENEN SIE VOR GENANNT HABEN"; private Zeichenfolge AddScoreURL = "http://yoursite.com/AddScore.php?"; private Zeichenfolge TopScoresURL = "http://yoursite.com/TopScores.php"; private Zeichenfolge RankURL = "http://yoursite.com/GrabRank.php?"; private int Highscore; privater String-Benutzername; privater int rang;

Wir benötigen alle unsere Werte von vorhin - den von Ihnen generierten Schlüssel, die URLs, in die Sie Ihre PHP-Dateien hochgeladen haben, und so weiter. Das Highscore und Nutzername Variablen werden mithilfe zweier öffentlicher Funktionen festgelegt SetScore () und Name einsetzen(), die wir im vorherigen Abschnitt verwendet haben.

Spitze: Es ist wirklich wichtig, dass Sie danach Fragezeichen setzen AddScore.php und GrabRank.php! Damit können Sie Variablen an Ihre PHP-Dateien übergeben.

Wir müssen verwenden IEnumerators Hier können Sie unsere SQL-Abfragen bearbeiten, da wir auf eine Antwort warten müssen. Wir beginnen unsere erste Coroutine, AddScore (), sobald die Klasse aktiviert ist.

 IEnumerator AddScore (Stringname, Int Score) String Hash = Md5Sum (Name + Score + privateKey); WWW ScorePost = new WWW (AddScoreURL + "name =" + WWW.EscapeURL (name) + "& score =" + score + "& hash =" + hash); Rendite Rendite ScorePost; if (ScorePost.error == null) StartCoroutine (GrabRank (Name));  else Fehler (); 

Zuerst erstellen wir unseren Hash mit dem privaten Schlüssel und verwenden eine Funktion, um einen MD5-Hash auf dieselbe Weise wie PHP zu erstellen md5 (). Ein Beispiel dafür gibt es im Community-Wiki von Unity.

Wenn der Server aus irgendeinem Grund nicht erreichbar ist, führen wir eine Error() Funktion. Sie können auswählen, was in Ihrem Fehlerbehandlungsprogramm auftreten soll. Wenn die Partitur jedoch korrekt gepostet wird, starten wir unsere nächste Coroutine: GrabRank ().

 IEnumerator GrabRank (Name der Zeichenfolge) WWW RankGrabAttempt = new WWW (RankURL + "name =" + WWW.EscapeURL (name)); Rendite Rendite RankGrabAttempt; if (RankGrabAttempt.error == null) rank = System.Int32.Parse (RankGrabAttempt.text); StartCoroutine (GetTopScores ());  else Fehler (); 

Wieder greifen wir auf die Website zu und speichern dieses Mal den Rang, wenn sie erfolgreich besetzt wurden.

Jetzt können wir unsere letzte Coroutine verwenden. Dieser wird alles fesseln. Wir beginnen damit, ein letztes Mal auf die URL zuzugreifen:

 IEnumerator GetTopScores () WWW GetScoresAttempt = new WWW (TopScoresURL); Rendite Rendite GetScoresAttempt; if (GetScoresAttempt.error! = null) Error ();  else 

Dieses Mal möchten wir die Daten, die wir erhalten, in ein Array von Strings aufteilen. Zunächst können wir einen String-Split wie folgt verwenden:

 string [] textlist = GetScoresAttempt.text.Split (neue Zeichenfolge [] "\ n", "\ t", System.StringSplitOptions.RemoveEmptyEntries);

Dadurch wird sichergestellt, dass jedes Ergebnis ein neues Element in unserem String-Array ist, solange eine neue Zeile oder ein neuer Tab gefunden wird (was auch der Fall sein wird!). Wir teilen dies nun in zwei weitere Arrays auf Namen und Scores.

 string [] Namen = neue Zeichenfolge [Mathf.FloorToInt (textlist.Length / 2)]; string [] Scores = neue Zeichenfolge [Names.Length]; für (int i = 0; i < textlist.Length; i++)  if (i % 2 == 0)  Names[Mathf.FloorToInt(i / 2)] = textlist[i];  else Scores[Mathf.FloorToInt(i / 2)] = textlist[i]; 

Wir haben jetzt zwei neue Arrays erstellt, die jeweils halb so groß sind wie das erste Array. Wir teilen dann jede erste Saite in unsere auf Namen Array und jeder zweite in unsere Scores Array.

Jetzt möchten wir diese als Text anzeigen, daher müssen wir unsere drei Spalten positionieren. Wir werden sie auf den Bildschirm skalieren, damit sie in jede Auflösung passen. Zuerst geben wir die Anfangspositionen an, an denen unser Titel stehen wird:

 Vector2 LeftTextPosition = new Vector2 (0.22f, 0.85f); Vector2 RightTextPosition = new Vector2 (0.76f, 0.85f); Vector2 CentreTextPosition = new Vector2 (0.33f, 0.85f);

Und jetzt sind wir bereit, unsere Textobjekte basierend auf unseren zu erstellen BaseGUIText vorgefertigt Wir instanziieren die Titel einzeln und setzen ihren Text - zum Beispiel:

 GameObject Scoresheader = Instanziieren (BaseGUIText, neuer Vector2 (0.5f, 0.94f), Quaternion.identity) als GameObject; Scoresheader.guiText.text = "Highscores"; Scoresheader.guiText.anchor = TextAnchor.MiddleCenter; Scoresheader.guiText.fontSize = 35;

Sobald wir dies für alle unsere Titel getan haben, passen wir unsere Positionen so an, dass der neue Text weiter unten angezeigt wird.

 LeftTextPosition - = new Vector2 (0, 0.062f); RightTextPosition - = new Vector2 (0, 0.062f); CentreTextPosition - = new Vector2 (0, 0.062f);

Als nächstes führen wir eine zum Diese Schleife durchläuft die gesamte Top-10-Liste, setzt Namen, Rang und Punktzahl (und stellt sicher, dass der Text sinnvoll verankert ist). Anschließend werden die Positionen erneut angepasst. Bei jeder Wiederholung prüfen wir, ob der Rang des Benutzers dem angezeigten Rang entspricht, und färbt den Text in diesem Fall so um, dass die Bewertung des Benutzers gelb markiert ist:

 für (int i = 0; i 

Und schließlich prüfen wir, ob der Rang des Benutzers über 10 liegt. Wenn dies der Fall ist, schreiben wir ihre Punktzahl im elften Slot unten zusammen mit ihrem Rang und färben ihn gelb.

 if (rank> 10) GameObject Score = Instanziate (BaseGUIText, RightTextPosition, Quaternion.identity) als GameObject; Score.guiText.text = "" + Highscore; Score.guiText.anchor = TextAnchor.MiddleCenter; GameObject-Name = Instanziieren (BaseGUIText, CentreTextPosition, Quaternion.identity) als GameObject; Name.guiText.text = Benutzername; GameObject Rank = Instanziieren (BaseGUIText, LeftTextPosition, Quaternion.identity) als GameObject; Rank.guiText.text = "" + (Rang); Rank.guiText.anchor = TextAnchor.MiddleCenter; Score.guiText.material.color = Farbe.gelb; Name.guiText.material.color = Farbe.gelb; Rank.guiText.material.color = Farbe.gelb; 

Fazit

Voilà; unsere Bestenliste ist komplett! In den Quelldateien habe ich auch eine PHP-Datei eingefügt, die die Ränge über und unter dem Benutzernamen des Benutzers erfasst, sodass Sie ihnen genau zeigen können, wo sie sich auf der Tafel befinden.