Jump to content
Unity Insider Forum

Save/ Open Scene


nordseekrabe

Recommended Posts

Moin, 

konnte bislang bei meiner Suche zum o.g. Thema nicht fündig werden. Meine Frage ist: wie kann ich per Script die Methoden Save Scene As und Open Scene aus dem Unity-Menue "File" einsetzen ?  Dabei ist mein Gedanke, vor einem Szenenwechsel den aktuellen Stand der laufenden Szene per Scripting zu speichern, die dann unter neuem Namen auch jederzeit in diesem Stadium wieder geladen werden könnte (open scene). Geht das überhaupt ?

Wie immer besten Dank für Eure Anregungen !   Gruß   Nordseekrabbe 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moinsen 

Redest du jetzt davon im Editor selbst die Szene zuspeichern oder änderungen die beim kompilierten Spiel gemacht wurden ?

Wenn es darum geht gebaute sachen oder stats wie leben/ausdauer und spieler Position zuspeichern , musst du schon selber eine speichermethode basteln.

Für einfache Sachen reichen Playerprefs.

Für Speicher Varianten wie in Fallout oder The Elder Scrolls musst du schon mit Scriptableobjects, SharpConfig oder System.IO arbeiten. 

Zum Thema Scriptableobjects und Dingen wie SharpConfig werde ich bald paar tutorials auf deutsch produzieren.

Es gibt zwar genug in textform aber in einem Video vermittelt man es meiner Meinung nach besser.

Man kennt ja den Spruch "Das Auge isst mit" genau so lernt das Auge auch mit.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

und danke für die beiden Antworten. Ich glaube, dass ich da einen Gedankenfehler hatte, da die beiden Methoden (Save As und Open Scene) nicht "in game" funktionieren. Aber genau das benötige ich wohl. Bislang fehlt mir noch eine Idee, wie man Aktivitäten des Players, abgearbeitete Rätsel in einer Szene speichern könnte. Wen aus Game in Scene wechsele, sind ja alle Veränderungen weg. Inventar, Scores und Punktergebnisse oder ähnliches kann ich mir zur Speicherung mit PlayerPrefs oder Scriptableobjects  einigermaßen vorstellen. Aber, z. B. in einer Szene hat der Player ein Rätsel gelöst und erhält dafür ein Objekt ins Inventar. Dieses Objekt zu speichern sollte mir noch gelingen. Aber wie sage ich dem Spiel, bzw. der Szene, das Rätsel ist jetzt gelöst, du musst nicht bei jedem neuen Besuch in dieser Szene dieses Problem nochmals lösen. z.B. im Kühlschrank ist ein Stück Torte, das der Player sich nimmt, jetzt sollte der Kühlschrank für das gesamte Spiel leer bleiben. z.B. der Player hat verschiedene Objekte gesammelt, mit deren Hilfe gelingt es ihm, eine abgesperrte Tür zu öffnen. Ist das einmal erledigt, darf er diese Aktion nicht bei jedem neuen Besuch in der Szene nochmals ausführen müssen. Speicherung von ausgeführten Aktionen, das ist , glaube ich, mein Problem. Es war doch immer so einfach, bei Indy oder Monkey Island oder all' den anderen Spielen, F5 gedrückt und das Spiel war gesichert, falls man beim nächsten Problem "in den Brunnen" fällt.

Gruß     Nordseekrabbe

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Minuten schrieb nordseekrabe:

Moin,

und danke für die beiden Antworten. Ich glaube, dass ich da einen Gedankenfehler hatte, da die beiden Methoden (Save As und Open Scene) nicht "in game" funktionieren. Aber genau das benötige ich wohl. Bislang fehlt mir noch eine Idee, wie man Aktivitäten des Players, abgearbeitete Rätsel in einer Szene speichern könnte. Wen aus Game in Scene wechsele, sind ja alle Veränderungen weg. Inventar, Scores und Punktergebnisse oder ähnliches kann ich mir zur Speicherung mit PlayerPrefs oder Scriptableobjects  einigermaßen vorstellen. Aber, z. B. in einer Szene hat der Player ein Rätsel gelöst und erhält dafür ein Objekt ins Inventar. Dieses Objekt zu speichern sollte mir noch gelingen. Aber wie sage ich dem Spiel, bzw. der Szene, das Rätsel ist jetzt gelöst, du musst nicht bei jedem neuen Besuch in dieser Szene dieses Problem nochmals lösen. z.B. im Kühlschrank ist ein Stück Torte, das der Player sich nimmt, jetzt sollte der Kühlschrank für das gesamte Spiel leer bleiben. z.B. der Player hat verschiedene Objekte gesammelt, mit deren Hilfe gelingt es ihm, eine abgesperrte Tür zu öffnen. Ist das einmal erledigt, darf er diese Aktion nicht bei jedem neuen Besuch in der Szene nochmals ausführen müssen. Speicherung von ausgeführten Aktionen, das ist , glaube ich, mein Problem. Es war doch immer so einfach, bei Indy oder Monkey Island oder all' den anderen Spielen, F5 gedrückt und das Spiel war gesichert, falls man beim nächsten Problem "in den Brunnen" fällt.

Gruß     Nordseekrabbe

Das muss alles von Hand geschehen ^^ so eine save funktion wie einfach F5 drücken gibts nicht ohne das sie jemand coded xD
Wie gesagt ich werd dir die Tage mal paar Tutorials zu dem Thema zukommen lassen ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

schon mal einen großen Dank an Poldi007.  Werde mich morgen eingehend mit den Scripts beschäftigen. Auf den ersten, schnellen Blick hin fürchte ich, dass hierbei auch "nur" Objekte gespeichert werden können. Für mich wäre aber wichtig, abgelaufene Aktionen, gelöste Rätsel zu speichern. Vielleicht noch einmal ein Beispiel:

Der Spieler sammelt verschiedene Objekte in verschiedenen Szenen und sammelt sie im Inventar. Wenn er diese Objekte (z.B. Teilcode) beisammen hat, kann er mit dem nun  kompletten Code ein Zahlenschloss öffnen und eine neue Szene damit erreichen. Diesen Ablauf muss man nun speichern, damit nicht bei einem weiteren Besuch  der Zahlenschlosstür das gleiche Procedere erforderlich ist, um in die Szene zu gelangen, denn diese wird ja als von Anfang an gespeicherte Szene beim Neustart wieder ausgewählt. Vielleicht gibt es ja eine Chance mit der Methode "IsDirty()", da muss ich aber noch einiges dazu in Erfahrung bringen.

 Eine gute Nacht wünscht            Nordseekrabbe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

 

vor 15 Minuten schrieb nordseekrabe:

Moin,

schon mal einen großen Dank an Poldi007.  Werde mich morgen eingehend mit den Scripts beschäftigen. Auf den ersten, schnellen Blick hin fürchte ich, dass hierbei auch "nur" Objekte gespeichert werden können. Für mich wäre aber wichtig, abgelaufene Aktionen, gelöste Rätsel zu speichern. Vielleicht noch einmal ein Beispiel:

Der Spieler sammelt verschiedene Objekte in verschiedenen Szenen und sammelt sie im Inventar. Wenn er diese Objekte (z.B. Teilcode) beisammen hat, kann er mit dem nun  kompletten Code ein Zahlenschloss öffnen und eine neue Szene damit erreichen. Diesen Ablauf muss man nun speichern, damit nicht bei einem weiteren Besuch  der Zahlenschlosstür das gleiche Procedere erforderlich ist, um in die Szene zu gelangen, denn diese wird ja als von Anfang an gespeicherte Szene beim Neustart wieder ausgewählt. Vielleicht gibt es ja eine Chance mit der Methode "IsDirty()", da muss ich aber noch einiges dazu in Erfahrung bringen.

 Eine gute Nacht wünscht            Nordseekrabbe

Es klingt eher so als hättest du das wissen in Sachen coding um es zu lösen aber dir fällt kein richtiger weg ein oder ?

Du kannst auch als beispiel das nehmem.

public class doortonewscene : Monobehaviour

{

public bool erledigt = false;

void update ()

{

if (erledigt == true)

{

DoorOpen();

}

else 

{

//geschlossen

}

 

}

}

 

Einfach eine bool bei dem Schloss oder bei der tür abfragen.

Wenn sie true ist dann ist das Rätsel gelöst und wenn sie false ist dann muss ers noch  lösen. 

Einfach die bool speichern ob sie true oder false ist.

Kannst das selbe auch mit nem int machen: if (erledigt == 1) mach irwas else mach nix wenn es 0 oder nicht 1 ist.

 

Hoffe du verstehst wie ichs meine  ^^

Gute Nacht ^^

Und sorry das ichs nicht als code eingefügt hab aber am handy zeigt er die Möglichkeit nicht an ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

vielleicht ein richtiger Ansatz, Tarantel. Du meinst, wenn ich vor dem Szenenwechsel mit PlayerPrefs Dooropen == true speichere und bei erneutem Loadscene() dieser Szene ein Load(PlayerPrefs) mitstarten lasse, sollte es eigentlich funktionieren !? Muss ich heute testen !! Erstmal danke schön und allen einen zufriedenstellenden Tag

wünscht     Nordseekrabbe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

wie kann ich diese Prämisse erfüllen : eine Variable "interaktivitaet.begehbar = false" wird durch das richtige Vorgehen durch den Player zur Variablen "interaktivitaet.begehbar = true" und soll genau so für den Rest des Spieles bleiben ??? Geht das nicht nur über die Speicherung der neuen Variablen ?

Gruß    Nordseekrabbe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin, eine kleine Ergänzung meinerseits.....mit dem Hinweis von Sascha wurde mir heute Abend klar, dass ich wohl eine "static" Variable mit einer "const" Variablen gleichgesetzt habe. Also habe ich irrtümlich geglaubt, eine static Variable könne nicht verändert werden. Damit ergeben sich wahrscheinlich einige neue Optionen. Danke, Sascha  und viel Spaß beim Fußball

Gruß   Nordseekrabbe  

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum benutzt du eigentlich static also in welchen Zusammenhang? 

Weil static lohnt sich nur wenn die variable einmal vorkommt wie beispielsweise bei settings für ton/grafik usw.

Achso nochwas.

Falls fu versuchen solltest eine bool in den Playerprefs zuspeichern musst du sie in einen int umwandeln oder du fragst nur ab ob sie existiert und sagst exist ist True  und wenn sie nicht existiert ist es immer false.

Also zum false setzen wird sie einfach gelöscht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 14.11.2018 um 22:36 schrieb nordseekrabe:

Moin,

schon mal einen großen Dank an Poldi007.  Werde mich morgen eingehend mit den Scripts beschäftigen. Auf den ersten, schnellen Blick hin fürchte ich, dass hierbei auch "nur" Objekte gespeichert werden können. Für mich wäre aber wichtig, abgelaufene Aktionen, gelöste Rätsel zu speichern. Vielleicht noch einmal ein Beispiel:

Der Spieler sammelt verschiedene Objekte in verschiedenen Szenen und sammelt sie im Inventar. Wenn er diese Objekte (z.B. Teilcode) beisammen hat, kann er mit dem nun  kompletten Code ein Zahlenschloss öffnen und eine neue Szene damit erreichen. Diesen Ablauf muss man nun speichern, damit nicht bei einem weiteren Besuch  der Zahlenschlosstür das gleiche Procedere erforderlich ist, um in die Szene zu gelangen, denn diese wird ja als von Anfang an gespeicherte Szene beim Neustart wieder ausgewählt. Vielleicht gibt es ja eine Chance mit der Methode "IsDirty()", da muss ich aber noch einiges dazu in Erfahrung bringen.

 Eine gute Nacht wünscht            Nordseekrabbe

Moin,

Ich bin mir nicht sicher, aber du könntest vielleicht die Neue Szene als Unity Szene speichern. Wenn das Schloss gelöst wurde, setzt du mit SetInt() Eine Variable ( In die Playerpfrefs !!!!) auf z.b. 1

Dann kannst einprogrammieren, dass, wenn die Variable aus den Playerprefs= 1 (mit GetInt) ist direkt die neue Szene geöffnet wird. 

 

Kann aber sein, dass ich einen Denkfehler begangen habe, bitte korrigiert mich.

Tschau, 

Poldi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 15.11.2018 um 11:30 schrieb Sascha:

PlayerPrefs speichern Sachen auf der Festplatte. Die zu missbrauchen, um Werte über einen Szenenswechsel hinweg zu behalten, ist alles andere als elegant.

Wenn ein Wert über einen Szenenwechsel hinweg bleiben soll, ist die erste Anlaufstelle eine simple statische Variable.

Am Anfang kann man ruhig playerprefs nutzen und später auf eigene save jsons und co umsteigen. 

Sicher ist es nicht das ist klar aber ich finde die Anfänge von Unity sind für quereinsteiger nicht so leicht wie man denkt und am anfang alles in die registry zuladen wenn es nur 5-10 Einträge sind ists für mich ok.

Ich kann ja mal schauen ob ich ein einfach zu verstehendes tutorial über das erstellen seiner eigenen save.dats machen kann.

Wenns auf yt ist werd ichs hier für alle posten.

Tutorials zu unity gibt es ja in Massen aber meist sind sie zu alt oder behandeln nur die basics.

Ganz oft sehe ich auch viel zu lange video Reihen die dann kurz vor dem ende abgebrochen werden und dann gucken die Neulinge in die röhre.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Tarantel Vielleicht habe ich ja auch die Situation falsch verstanden, aber das meinte ich mit meiner Antwort nicht. PlayerPrefs zum Speichern von Dingen ist natürlich erstmal völlig okay. Die letzten paar Beiträge des Threads klangen aber stark danach, dass es hier nicht um das Speichern von Daten über mehrere Sessions hinweg (Spiel aus, Spiel wieder an) geht, sondern lediglich um das Speichern von Daten über einen Szenenwechsel hinweg. Mein Post bezog sich daher nicht auf PlayerPrefs vs. andere Möglichkeiten zum Speichern von Daten auf der Festplatte, sondern darauf, dass man bitte keine PlayerPrefs benutzen soll, wenn es nur darum geht, Daten bei einem Szenenwechsel nicht zu verlieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb Sascha:

@Tarantel Vielleicht habe ich ja auch die Situation falsch verstanden, aber das meinte ich mit meiner Antwort nicht. PlayerPrefs zum Speichern von Dingen ist natürlich erstmal völlig okay. Die letzten paar Beiträge des Threads klangen aber stark danach, dass es hier nicht um das Speichern von Daten über mehrere Sessions hinweg (Spiel aus, Spiel wieder an) geht, sondern lediglich um das Speichern von Daten über einen Szenenwechsel hinweg. Mein Post bezog sich daher nicht auf PlayerPrefs vs. andere Möglichkeiten zum Speichern von Daten auf der Festplatte, sondern darauf, dass man bitte keine PlayerPrefs benutzen soll, wenn es nur darum geht, Daten bei einem Szenenwechsel nicht zu verlieren.

Oh sry hab da dann auch was falsch verstanden ^^

Daten nur über einen Szenen wechsel zuspeichern da reicht doch ein Scriptableobject aus. Die behalten die Änderungen ja temporär bis die Anwendung geschlossen oder entladen wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei ScriptableObjects muss man aber auch vorsichtig sein. Die Änderung bleibt ja nicht mal nur während der Laufzeit, sondern im Editor noch nach Beenden des Play Modes bestehen. Gibt natürlich Möglichkeiten, das richtig und ordentlich zu machen (ISerializationCallbackReceiver und so), aber trotz allem eben mein Hinweis: Erstmal statische Variable.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Minuten schrieb Sascha:

Bei ScriptableObjects muss man aber auch vorsichtig sein. Die Änderung bleibt ja nicht mal nur während der Laufzeit, sondern im Editor noch nach Beenden des Play Modes bestehen. Gibt natürlich Möglichkeiten, das richtig und ordentlich zu machen (ISerializationCallbackReceiver und so), aber trotz allem eben mein Hinweis: Erstmal statische Variable.

Ja im Editor sind Änderungen permanent jedoch meinte ich nur die Nutzung als temporären Speicher im fertig kompilierten Spiel ^^

Dort kann es eigentlich ohne Bedenken genutzt werden. 

Ich nutze Scriptableobjects auch im dedizierten server um alle Spieler Daten temporär zuspeichern und beim speichern der daten werden alle daten aus den Scriptableobjects in die player.dat der einzelnen Spieler geschrieben. 

Ich finde es gut das man Scriptableobjects in unity nutzen kann ^^

Ich bin früher schier wahnsinnig geworden wenn ich solche dinge per Script oder lösen wollte.

Weil die daten permanent pro frame in die player.dat direkt zuschreiben ist einfach nur ein Ressourcen Grinder ^^

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Tarantel:

Weil die daten permanent pro frame in die player.dat direkt zuschreiben ist einfach nur ein Ressourcen Grinder ^^

Alter oO

vor 1 Minute schrieb Tarantel:

jedoch meinte ich nur die Nutzung als temporären Speicher im fertig kompilierten Spiel

Aber du testest dein Spiel ja immer noch im Play Mode bevor du es kompilierst. Muss man halt aufpassen dass der initiale Wert nicht relevant ist oder eben immer zurückgesetzt wird (s.o.). Mal bei Variante 1 von ständigen Updates der Werte in Commits mal ganz abgesehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Minuten schrieb Sascha:

Alter oO

Aber du testest dein Spiel ja immer noch im Play Mode bevor du es kompilierst. Muss man halt aufpassen dass der initiale Wert nicht relevant ist oder eben immer zurückgesetzt wird (s.o.). Mal bei Variante 1 von ständigen Updates der Werte in Commits mal ganz abgesehen.

Wie ist das "Alter oO" zuverstehen ^^

Ich kenne viele die das wirklich so gemacht haben und sich dann gewundert haben warum selbst ein großer Server einknickt ^^

Naja wenn man versucht tausende von variabel Änderungen pro frame zuspeichern ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...