Jump to content
Unity Insider Forum

Daten szenenübergreifend speichern: Playerprefs?


HenriChinasky

Recommended Posts

Hallo Leute,

ich bin gerade dabei ein System für unser Projekt zu entwickeln mit dem bestimmte Daten szenenübergreifend gesichert werden können.
Am besten ich erkläre es anhand eines Beispiels:

Der Spieler kann sich durch eine Scene bewegen in der es Gegner gibt. Der Spieler tötet einen Gegner. Im Anschluss betritt der Spieler ein Haus
in der Scene, welches wiederum eine eigene Scene darstellt. Aus Speichergründen wird hierfür nicht die additive Lademethode verwendet, also
die ursprüngliche Szene mit der Information, dass der Gegner getötet worden ist verschwindet. Wenn der Spieler dann wieder aus dem Haus
hinaus geht, soll der Gegner jedoch natürlich weiterhin tot sein.

Meine Lösung bisher war es jeden Gegner selbsttätig eine ID zuzuweisen zu lassen. Sobald der Gegner stirbt "registriert" er sich mit seiner ID
in einem Script und gibt dort an getötet worden zu sein. Seine ID wird daraufhin mit dem Befehl PlayerPrefs.SetInt(ID, 1) als tot gespeichert.
Sobald eine Scene geladen wird überprüft das Script ob die ID eines in der Scene vorhandenen Gegners bereits in den PlayerPrefs gespeichert 
und als tot registriert wurde. Funktioniert erst einmal wie geplant.

Das Problem stellt sich insofern, als dass mir diese Methode sehr unübersichtlich vorkommt und im späteren Verlauf Probleme machen könnte.
Zunächst muss ich jetzt schon bei jedem Spielstart die PlayerPrefs komplett löschen, da ich ja nicht sagen kann: Lösche nur alle Informationen
zu toten Gegnern und behalte diese, welche sich beispielsweise auf Grafikeinstellungen beziehen. Daher lautet meine Frage:

Gibt es eine einfachere Möglichkeit oder ein Asset, welches ihr empfehlen könnt, dass es mir ermöglich exakt dasselbe zu tun wie mit den
PlayerPrefs, nur dass ich vielleicht mehrere solcher Dateien erstellen kann, also eine Datei nur für Dinge die bei jedem Spielstart
zurückgesetzt werden und zusätzlich eine die andere Einstellungen und den Spielstand speichert?
Wie löst ihr solche Datensicherungen zwischen Scenes? Ich könnte natürlich ein zwischen den Scenes persistentes Script erstellen, dass
die getöteten Gegner in einer Liste speichert, aber dann wäre ich wieder Limitert, was das Beenden und Speichern des Spiels angeht.
Von Seiten der Engine kann PlayerPrefs ja wohl kaum für diese Aufgabe gedacht sein, oder?

Danke für Antworten und Anregungen,
Daniel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bitte einfach nicht Dateien dafür benutzen. Während das Programm läuft, kannst du alles, was du brauchst, in den RAM schreiben. Eine Datei auf die Festplatte zu tun ist unnötig.

Ein Szenenwechsel in Unity tut exakt eine Sache: Alle GameObjects löschen und alle, die in der neuen Szene sind, spawnen. Wenn dazwischen Daten erhalten bleiben sollen, gibt es exakt drei (sinnvolle!) Möglichkeiten:

  1. Object.DontDestroyOnLoad benutzen, um ein GameObject vor dem Löschen zu schützen
  2. Eine statische Variable nutzen, denn diese sind nicht an die Objekte gebunden, die gelöscht werden
  3. ScriptableObjects benutzen, denn sie sind nicht Teil der Szene

3 kann eine ziemlich schicke Lösung sein, braucht aber ein bisschen mehr Kenntnisse als 1 und 2.

Zwischen 1 und 2 würde ich grundsätzlich 2 empfehlen, wenn es nur um Daten geht. GameObjects sind ganz schöne überlast dafür und eigentlich nur dann sinnvoll, wenn an dem Objekt Unity-Funktionalität dranhängt (z.B. eine AudioSource, die auch nach Szenenwechsel weiter dieselbe Musik spielen soll).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort!

Du meinst also am sinnvollsten wäre es eine statische Liste zu erstellen, in welche sich die besiegten Gegner bei ihrem Tod eintragen.
Beim Laden der Scene überprüfe ich für jeden Gegner, ob er in der Liste vorhanden ist und kann so erkennen, ob er zerstört werden soll.
Klingt an sich sehr vernünftig, aber was, wenn ich dann beim Speichern des Spielstands doch einmal bestimmte Veränderungen an 
der Spielwelt beibehalten möchte? Wäre dann wohl eines der Assets wie EasySave eine Lösung, mit denen ich eben jene Listen
serialisiert speichern könnte, oder? Hätte ich eigentlich auch selbst drauf kommen können...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

aber was, wenn ich dann beim Speichern des Spielstands doch einmal bestimmte Veränderungen an 
der Spielwelt beibehalten möchte? 

Du kannst die statische Liste beim Beenden des Spiel beispielsweise in den:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Statische Variablen sind in jedem Fall nicht an Objekte gebunden - das ist die Kerneigenschaft von den Dingern. Da sie nicht an Objekte gebunden sind, ist es egal, wenn alle Objekte gelöscht werden. In was für einer Klasse deine statische Variable ist, und ob es von dieser Klasse Instanzen als Komponenten auf irgendwelchen GameObjects gibt, ist völlig egal.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 23 Stunden schrieb Zer0Cool:

Du kannst die statische Liste beim Beenden des Spiel beispielsweise in den:

Super. Danke für eure Tipps!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...