2016-08-03 8 views
0

Ich arbeite an meinem Einheitsprojekt und habe High-Scores von 1-9 in meinen PlayerPrefabs gespeichert. Ich bekomme sie so:Einheit, wie Highscores 1-9 angezeigt werden?

private SortedList<string, int> GetHighScores() 
{ 
    SortedList<string, int> tempList = new SortedList<string, int>(); 

    for (int i = 1; i < 10; i++) 
    { 
     string tempName = "Highscore " + i; 
     tempList.Add(tempName, PlayerPrefs.GetInt(tempName)); 
    } 

    return tempList; 
} 

Allerdings, wie kann ich sie auf eine gute Weise anzeigen?
Ich denke, ich könnte 1 Textobjekt für jede High-Score erstellen, aber das würde eine Menge Spiele-Objekte erstellen und scheint eine schlechte Idee.

Antwort

1

Sie sollten die Text Komponente nicht OnGUI() oder irgendetwas aus der GUI Klasse verwenden.

Wie kann ich sie jedoch auf eine gute Weise anzeigen? Ich denke, ich könnte 1 Textobjekt für jeden High-Score erstellen, aber das würde eine Menge von Spiele-Objekten erstellen und scheint eine schlechte Idee.

Object Pooling hätte hier gut, aber, da Sie nur9 Texte benötigen, erstellen Sie einfach Arrays von Texts. Wenn Sie hohe Punktzahlen anzeigen möchten, laden Sie Ihre Punktzahlen, indem Sie die GetHighScores()-Funktion aufrufen, dann das Array mit Texts durchlaufen und das Ergebnis speichern. Sie können dann Text.enabled auf true setzen, um die Texts anzuzeigen.

Um die Ergebnisse auszublenden, führen Sie eine einfache Schleife über das Text-Array und setzen Sie dann jeweils eine leere Zeichenfolge und setzen Sie dann Text.enabled auf false.

Das Skript deblow implementiert, was ich oben sagte. Erstellen Sie einfach 9 Texte aus dem Editor, ändern Sie die High Scores-Größe in 9 und ziehen Sie jede in die Element-Slots der Reihe nach.

public Text[] highScores; 

public void hideHighScore() 
{ 
    for (int i = 0; i < 9; i++) 
    { 
     highScores[i].text = ""; 
     highScores[i].enabled = false; 
    } 
} 

public void showHighScore() 
{ 
    SortedList<string, int> hScores = GetHighScores(); 
    for (int i = 0; i < 9; i++) 
    { 
     string tempName = "Highscore " + (i + 1); 
     highScores[i].text = hScores[tempName].ToString(); 
     highScores[i].enabled = true; 
    } 
} 

private SortedList<string, int> GetHighScores() 
{ 
    SortedList<string, int> tempList = new SortedList<string, int>(); 

    for (int i = 1; i < 10; i++) 
    { 
     string tempName = "Highscore " + i; 
     tempList.Add(tempName, PlayerPrefs.GetInt(tempName)); 
    } 
    return tempList; 
} 

Da Sie die Menge der Daten kennen, die Sie speichern müssen, die 9 ist, gibt es keinen Grund SortedList oder List zu verwenden. Sie können dafür einfach ein Array verwenden und verhindern, dass bei der Verwendung von SortedList die unnötige Speicherzuweisung durchgeführt wird.

+0

Ich hätte nie gedacht, dass Sie einfach Text [] sauber und einfach machen können, und ich werde von einer sortierten Liste zu einem Array wechseln. Prost. –

+0

Sie können wahrscheinlich alle Text-UI-Objekte in einen Container einfügen und deaktivieren/aktivieren. Und bei Deaktivierung müssen Sie es wahrscheinlich nicht einmal ändern, weil Sie es vor der Aktivierung ändern. –

+0

@GunnarB. Ja, Er könnte das tun. Setzen Sie es in ein Panel und aktivieren oder deaktivieren Sie das Panel. Er braucht auch nicht 'highScores [i] .text =" ";. Ich hatte es dort, um Text leer zu machen, während deaktiviert. Ich bin mir nicht sicher, ob das nützlich ist. – Programmer

0

Für Anfänger 9 Textobjekte ist nicht so viel, aber Sie könnten nur einen machen und die Werte auf verschiedenen Zeilen haben.

Sie können den Wert auch mit GUI anzeigen.

int s1 = 43, s2 = 32; 

void OnGUI() { 

    GUI.Label(new Rect(20, 20, 100, 500), "Score 1: "+s1+"\n Score 2: "+ s2); 

} 

Sie können auch eine Anzeigetafel erstellen, wenn Sie zum Beispiel TAB gedrückt halten wie in Battlefield und Call Of Duty und aktivieren/deaktivieren.

+0

Ich hatte gehofft, ich könnte alle Highscores von meinem PlayerPrefab bekommen sie in eine Liste und einfach sie in einer FOR-Schleife Schleife und drucken Sie es so. Mit GUi.Label muss ich eine Variable für jedes Ergebnis erstellen, also s1, s2, s3, s4, s5, s6, s7, s8, s9. Welches ist eher hässlich imo. Aber wenn es keinen anderen Weg gibt, habe ich keine Option, denke ich. –

+0

@JoakimCarlsson Sie sollten Etiketten in einer for-Schleife erstellen können. Oder zu einem vorhandenen Label hinzufügen. –

+0

Sie können eine Funktion erstellen, die einen Parameter akzeptiert. Mit dem Wert, den Sie ändern, wird der PlayerPrefs-Wert in eine temporäre Variable gespeichert und der Text aktualisiert. Anschließend wird diese Funktion jedes Mal aufgerufen, wenn Sie den Wert ändern. Wenn Sie viele Werte haben, sollten Sie das Laden/Speichern aus einer .txt-Datei berücksichtigen, da PlayerPrefs nicht vollständig mit vielen Werten stabil ist. – LongarMD