Jump to content
Unity Insider Forum

Variabel von Scene zu Scene


Unity54

Recommended Posts

In einem Kartenspiel, sollen verschiedenen Kartenserien gespielt werden können.SceneSelectScript.cs

In der Scene Kartenspiel ist bereits eine Kartenserie eingebunden. Um verschiedene

Serien zu spielen, wurde eine Menu-Scene erstellt, mittels deren per Buttonklick

in das Kartenspiel gewechselt werden kann.

Nun sollte eine Variabel in der Menu-Scene (z.B. thema1, thema2,...) geschrieben werden,

die im Kartenspiel ersichtlich ist, um danach verschiedenen Bilderserien zu laden.

Wie muss die Variable im Menu deklariert werden, damit sie in der Kartenspiel Scene

Erscheint und ausgewertet werden kann?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dafür kann man sogenannte Managerklassen (z.b. Player / Settings etc) erstellen die man dann an ein szenenpersistentes GameObject hängt:
https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

Untiy zerstört beim Laden einer neuen Szene normalerweise alle Szenenobjekte. Über diese Methode wird dieses GameObject dann aber nicht zerstört und bleibt zwischen den Szenenwechseln erhalten. Hängst du nun ein entsprechendes Skript an ein solches GO, dann bleiben auch dessen Variablen szenenübergreifend erhalten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Von Dateien würde ich dringend abraten, von "Managerobjekten" auch.

Du kannst einfach eine statische Variable definieren:

public static Typ variablenname;

und fertig. Denk daran, dass statische Variablen nur einmal pro Programm und nicht einmal pro Objekt existieren.

ScriptableObjects, wie von @chrische5 beschrieben, gehen auch, erfordern aber etwas initialen Mehraufwand, um sie für die Benutzung als Laufzeit-Datenhalter fitzumachen. Kannst aber z.B. Soda benutzen, da ist die Arbeit schon für dich erledigt :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum keine Managerobjekte bzw. Controllerobjekte? Finde ich eine gute Variante, allerdings muss man hier auch wissen wie man diese verwendet:
Man definiert sich eine Preload-Szene und speichert solche Objekte in dieser Szene. Beim Gamestart wird diese Szene als 1. geladen und alle Objekte dieser Szene bleiben in allen anderen Szenen persistent vorhanden.

Zusätzlich kann man hier noch eine Speicherung der Daten einbauen wenn Unity beendet wird (und diese dann auch wieder laden wenn das Game gestartet wird)
Klar kann man auch Singleton-Klassen für diese Managerobjekte erzeugen, aber ist oft gar nicht notwendig.

Wenn man allerdings nur wenige Variablen szenenübergreifend benötigt kann man diese auch static im Skript machen. Allerdings sollte man hier auch wissen was man tut, man sollte sich darüber im klaren sein, dass es Klassenvariablen sind.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Zer0Cool:

Man definiert sich eine Preload-Szene

So ein Ding ist halt so das übelste, was ich so kenne. Damit machst du die Funktionalität deiner Systeme davon abhängig, dass eine komplett woanders liegende Szene auf eine bestimmte Art eingerichtet ist. Play Mode Tests werden so dermaßen umständlich, dass sie sich überhaupt nicht mehr lohnen. Von Testbarkeit fang ich am besten gar nicht an. Das letzte Mal, als ich gesehen habe, dass jemand so ein Ding jemand anderem empfohlen hat, hab ich erstmal nen Blogeintrag geschrieben :Phttp://blog.13pixels.de/2019/unity-game-initialization/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schöner Artikel wie ich finde und sind einige interessante Sachen dabei :). Und ich denke auch für einfache Klassen wie die beschriebene Audiosource macht es so auch viel Sinn. Aber der am Ende beschriebene Nachteil ist für mich keine Kleinigkeit. Oft zieht man ein Asset in eine Scene (z.b. einen Spieler-Controller oder ein komplettes Wettersystem) und konfiguriert ihn dann nach. Dieser hat oft 100 Stellschrauben an denen man drehen kann bis der Controller entsprechend eingestellt (konfiguriert) ist. Diese Änderungen sind dann aber nur in der entsprechenden Szene bekannt (und werden über das Speichern der Szene persistiert). Der ganze schöne Ansatz mit dem dynamischen Laden funktioniert dann nicht mehr ohne weiteres, da man ja die "customisierten" Einstellungen irgendwo ablegen und dann nachladen muss. Hier müsste man dann diese Daten beispielsweise in Scriptable Objects auslagern damit es wieder einigermaßen funktioniert (was bei Kaufassets zu immenser Arbeit ausarten kann) oder diese über einen anderen Weg speichern (GameSettings-XML-File etc.).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

schön all die Vorschläge die so zu meiner Problematik gemacht werden. Aber als blutiger Unity Lehrling hilft das mir nicht so wirklich weiter.

Am meisten Vertrauen habe ich zu Sascha und möchte seinen Vorschlag mit

public static Typ variablenname

realisieren.

Bei mir habe ich deklariert

public static string thema;

danach weise ich, bevor ich mittels Buttonklick die Spielscene lade, der Variable thema einen Wert zu

z.B.  thema = bilderserie1;

Im Script Mischen (in der Spielszene), müsste ich jetzt den Inhalt von thema kennen, um verschiedene Bilderserien zu laden.

Als  Schritt 1: public static string thema; in der Menuscene schreiben ist getan

Für die nächsten nötigen Schritte bin ich überfordert. Bestimmt hilft mir Sascha weiter.

Danke für das Verständnis und die Hilfestellung.

SceneSelectScript.cs mischen.cs

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst an jeder Stelle des Projekt, zu jedem Zeitpunkt, auf eine statische Variable zugreifen.

Nehmen wir eine beliebige statische Variable in einer beliebigen Klasse (diese Klasse darf auch ein MonoBehaviour sein, muss aber nicht):

public class Foo
{
  public static string bar;
}

Dann kannst du jederzeit und überall (soll heißen: gerne auch in einer völlig anderen Klasse!) schreiben:

Foo.bar = "Hallo";

und gleichermaßen kannst du den Wert auslesen:

Debug.Log(Foo.bar);
myText.text = Foo.bar;

Also einfach "Klassenname.feldName" schreiben und ab gehts.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...