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.
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.
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.
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
undIHREDATENBANK
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_TIMESTAMPDies 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
undGetRank.php
.Das
Höchstpunktzahl
Abfrage ist einfach:SELECT * FROM Bewertung ORDER nach Punktzahl DESC, ts ASC LIMIT 10Dadurch 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 ändernX
undY
Position (zwischen0
und1
); 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 istGameObject
: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
undallowedToClick
. ImStart()
wir können einstellenfirstClick
zufalsch
undallowedToClick
zuwahr
.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 istIEnumerator
. DasAusbeute
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 Anzahl0
.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 werdenVARCHAR
Länge, wenn Sie Ihren Tisch gemacht haben. Hier haben wir unseren String-Builder,Spielername
, und zweiBooleaner
. 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 deaktivierenTop-text
; wir können das in einerfü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 erstelltplayerNameTemp
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 verwendetGetKey ()
(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 warten0,15
und0,05
Sekunden bzw. dann eingestelltRücktaste möglich
zuwahr
. Also nachdem unser Benutzer die Rücktaste für gedrückt gehalten hat0,15
Sekunden, solange sie noch die Rücktaste halten, wird ein Zeichen jedes Mal gelöscht0,05
Sekunden (solange derLä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 als0
, 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
'sName einsetzen()
Funktion, und früher haben wir angerufenSetScore ()
. 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
undNutzername
Variablen werden mithilfe zweier öffentlicher Funktionen festgelegtSetScore ()
undName einsetzen()
, die wir im vorherigen Abschnitt verwendet haben.Spitze: Es ist wirklich wichtig, dass Sie danach Fragezeichen setzen
AddScore.php
undGrabRank.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 (); elseDieses 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
undScores
.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 unsereScores
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; iUnd 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.