Jump to content
Unity Insider Forum

Text soll beim Szenenwechsel nicht gelöscht werden


ShV

Recommended Posts

Ich habe in meinem Spiel eine Scoreanzeige, aber bei jedem Szenenwechsel wird sie gelöscht. Habe auch schon folgendes Script ausprobiert:

void Awake()
    {
        GameObject[] objs = GameObject.FindGameObjectsWithTag("Score");
        DontDestroyOnLoad(this.gameObject);
        Debug.Log("Nicht Zerstört");
    }

Aber dann bekomme ich die Meldung, dass es nur für root GameObjects funktioniert.

1. Was sind root GameObjects?

2. Wie kann ich verhindern, dass der Text gelöscht wird?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist sehr irritierend was da in Awake steht.

vor 6 Stunden schrieb ShV:

GameObject[] objs = GameObject.FindGameObjectsWithTag("Score");

Die Zeile sagt mir, dass du mehrere gameObjects mit dem Tag Score suchst. Aber meistens sind Scores ein gameObject z.B. da wo der Script ist und die Punkte eingetragen sind oder wie in deinem Fall Text-Component.

vor 6 Stunden schrieb ShV:

DontDestroyOnLoad(this.gameObject);

dann wird objs ignoriert und das getan. Aber was ist this.gameObject? Ist das das GameObject mit dem Text? Steht nirgends.


Nichtsdestotrotz wird das glaub ich nicht so, falls es mit Text-Component gemacht werden soll, funktionieren. Dafür müsstest du Canvas selbst immer mitnehmen. Die leichteste Möglichkeit wäre in dein Script static zu benutzen.

public static int GlobalScore = 0;

Muss jetzt nicht Global heißen. Statics sind immer und überall verfügbar. Jedoch ist die Einschränkung auf ein Variable, da man keine Objekte von der Klasse erstellt.

Etwas kompliziert wird als Objekt. Z.B:

public class ScoreData : Monobehaviour
{
	public int Score;
  
	void Awake()
	{
		DontDestroyOnLoad(gameObject); 
	}
}

Da kannst du dein Score speichern. Das GameObject muss bedacht platziert werden. Wenn du Beispiel in Hauptmenü das hast und immer wieder ins Hauptmenü gehst, wird immer ein GameObject mehr sein.

Hab öfters gelesen, dass Unity deswegen bemängelt wird, warum es kein preintro scene gibt genau für solche Dinge. Aber man kann das auch selbe machen. Also eine Scene ganz am Anfang habe und diese Dinge reinpacken und dann zu Hauptmenü wechseln.
Problem: Im Editor möchte man nicht immer von der ersten Scene beginnen (darum wollen andere das mit Preintro Scene intrigiert haben).

Deswegen kann man dafür wie @chrische5 erwähnt hat ScriptableObjects nehmen. Im Prinzip ist es so ähnlich wie ich das mit ScoreData mache, nur dass Unity die im Hintergrund instanziiert und lädt, wenn man sie braucht und dann ganzes Spiel lang verfügbar bleibt. Und da man als Asset das erstellen kann, kann man sie überall verwenden. Eigentlich perfekt für sowas.

Wenn du irgendeine Lösung davon ausgesucht hast kannst du nun weiteren Script schreiben. Und jedes mal, wenn die Scene lädt sucht er nach ScoreData und liest den Score und setzt den Text oder bei ScriptableObject muss du nur den Asset im Inspector reinschieben wie gewöhnlich. Musst dann auch nicht suchen lassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...