HenriChinasky Geschrieben 30. Januar 2018 Melden Share Geschrieben 30. Januar 2018 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 More sharing options...
Sascha Geschrieben 30. Januar 2018 Melden Share Geschrieben 30. Januar 2018 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: Object.DontDestroyOnLoad benutzen, um ein GameObject vor dem Löschen zu schützen Eine statische Variable nutzen, denn diese sind nicht an die Objekte gebunden, die gelöscht werden 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 More sharing options...
HenriChinasky Geschrieben 31. Januar 2018 Autor Melden Share Geschrieben 31. Januar 2018 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 More sharing options...
Sascha Geschrieben 31. Januar 2018 Melden Share Geschrieben 31. Januar 2018 Joa, klingt richtig. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 31. Januar 2018 Melden Share Geschrieben 31. Januar 2018 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: PlayerPrefs (siehe http://wiki.unity3d.com/index.php/ArrayPrefs2) speichern oder in einer Datei serialisieren (binär oder JSON/XML) siehe https://unity3d.com/de/learn/tutorials/topics/scripting/persistence-saving-and-loading-data für ein Beispiel für binäre Speicherung Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 1. Februar 2018 Melden Share Geschrieben 1. Februar 2018 Weil ich gerade am selben Punkt bin. Statische Variablen werden dann in ein Script geschrieben, welches nicht in ein GameObjekt eingebunden ist, sondern was direkt angesprochen wird über die Klasse oder verstehe ich da was falsch? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 1. Februar 2018 Melden Share Geschrieben 1. Februar 2018 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 More sharing options...
HenriChinasky Geschrieben 1. Februar 2018 Autor Melden Share Geschrieben 1. Februar 2018 vor 23 Stunden schrieb Zer0Cool: Du kannst die statische Liste beim Beenden des Spiel beispielsweise in den: PlayerPrefs (siehe http://wiki.unity3d.com/index.php/ArrayPrefs2) speichern oder in einer Datei serialisieren (binär oder JSON/XML) siehe https://unity3d.com/de/learn/tutorials/topics/scripting/persistence-saving-and-loading-data für ein Beispiel für binäre Speicherung Super. Danke für eure Tipps! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.