lenn0707070 Geschrieben 10. März 2021 Melden Share Geschrieben 10. März 2021 Ich arbeite gerade an einem Spiel indem man rumlaufen kann und Objekte einsammeln und wieder ablegen kann. Man soll das Spiel speichern können, sodass man bei seinem letzten Spielstand weiter spielen kann. Wie kriege ich das in Unity hin? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thariel Geschrieben 10. März 2021 Melden Share Geschrieben 10. März 2021 Ich speichere immer in XML Files mit System.Xml.Linq.XDocument Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. März 2021 Melden Share Geschrieben 11. März 2021 Ja, ist schon eine sehr mehrschichtige Frage. Zum einen das Thema, das @Thariel beantwortet: Welches Format wird genutzt? PlayerPrefs, eine Datei (Xml, Json, Yaml, ...?) oder vielleicht doch eine Datenbank (Sql oder was anderes)? Die Daten können auch auf einem Server verwaltet werden, aber ich nehme an, du möchtest lokal auf dem Rechner des Spielers speichern. Dann wäre da die Frage nach dem Inhalt des Spielstandes. Diese Frage hat direkt Einfluss darauf, welches Format sinnvoll ist. Wenn du einfach ein paar Zahlenwerte hättest (welches Level ist fregespielt, wieviele Münzen/Leben hat der Spieler), dann wäre PlayerPrefs auf jeden Fall unproblematisch. Je komplexer es wird, desto unpraktischer werden sie, auch wenn sie theoretisch alles könnten. XML-Dateien sind etwas... "schwerfällig" und werden schnell groß, weil da so viel Zeug drinsteht, was nicht direkt deine Daten sind. Dafür versteht .NET ohne weitere Pakete sofort, wie die Dinger funktionieren (siehe @Thariels Link). Für Json müsstest du dir schon eine Json-Bibliothek besorgen. Gibt's aber ein paar für, Json ist sehr verbreitet und wird von Unity-Devs gerne genutzt. Unity versteht Json sogar (JsonUtility), aber das ist so lala im Handling, wenn du mich fragst. Es macht auch in der Implementation einen spürbaren Unterschied, ob du einfach konstant X Sachen speicherst oder nicht. So als Beispiel die VR-Spiele von Owlchemy Labs; Job Simulator oder Virtual Rick-ality. Die speichern nicht wirklich viel, sondern nur in welchem Level du bist. Da gibt's aber halt soundso viele Objekte, und von denen könnte man einfach die Positionen speichern und fertig. Beim Spielstart besorgt sich jedes dynamische Objekt in der Szene seine Position aus dem Savegame und gut ist. In einem Spiel wie Skyrim dagegen kommen Objekte hinzu oder werden gelöscht. Da brauchst du dann ein anderes System, das eine variable Anzahl von Objekten beliebiger Art speichern und laden kann. Es muss also alle deine Prefabs kennen, von denen Instanzen geladen werden können, und diese dann spawnen. Wie deine Implementation aussieht, hat aber keinen Einfluss darauf, welchen Dateitypen du nehmen solltest. Xml, Json, Yaml... die speichern alle dasselbe ab, nur in unterschiedlicher Syntax. Ist ein bisschen, als ob du dich entscheidest, ob du deine Notizen auf deutsch oder englisch aufschreibst. Sobald du dir einmal für alle diese Fragen eine Antwort ausgesucht und bewusst gemacht hast, werden alle weiteren Schritte einfacher. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Dukel Geschrieben 11. März 2021 Melden Share Geschrieben 11. März 2021 Hier kommt noch die Frage, wie sicher soll das sein. Wenn man sein Leben und Geld in einer XML Datei speichert ist es ja relativ leicht, dieses anzupassen und zu cheaten. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. März 2021 Melden Share Geschrieben 11. März 2021 Verschlüsseln kann man alles Aber ja, die Frage kommt in der Tat obendrauf, guter Punkt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
lenn0707070 Geschrieben 11. März 2021 Autor Melden Share Geschrieben 11. März 2021 Danke für die Rückmeldungen. Ich habe noch eine Frage dazu. Ich habe auf Youtube ein Tutorial gefunden, wo man die daten in eine Binary-File speichert. Ist dies auch eine Gute Lösung? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 11. März 2021 Melden Share Geschrieben 11. März 2021 Hallo Grundsätzlich ist es egal, wenn du es entsprechend auslesen kannst. Wichtig ist, sich klar zu machen, was man speichern will. JSON und xml haben den Vorteil, dass du es auch lesen kannst. Das ist natürlich manchmal hilfreich. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. März 2021 Melden Share Geschrieben 11. März 2021 Wie gesagt... vor 10 Stunden schrieb Sascha: Wie deine Implementation aussieht, hat aber keinen Einfluss darauf, welchen Dateitypen du nehmen solltest. Xml, Json, Yaml... die speichern alle dasselbe ab, nur in unterschiedlicher Syntax. Ist ein bisschen, als ob du dich entscheidest, ob du deine Notizen auf deutsch oder englisch aufschreibst. Binary Files und Text Files sind auch nur dasselbe in grün. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
lenn0707070 Geschrieben 11. März 2021 Autor Melden Share Geschrieben 11. März 2021 Ich habe nun mithilfe eines Tutorials ein Speicher-System erstellt. Nun habe ich aber das Problem, dass ich es nicht hinbekomme, das dieser Skript nicht nur die Daten eines Objektes Speichert sondern die Daten vieler/mehrere Objekte speichert. Data Skript: using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] public class PlayerData { public float[] position; public bool isLamping; public PlayerData(Player player) { position = new float[3]; position[0] = player.transform.position.x; position[1] = player.transform.position.y; position[2] = player.transform.position.z; isLamping = player.isLamping; } } Save Skript: using UnityEngine; using System.IO; using System.Runtime.Serialization.Formatters.Binary; public static class SaveSystem { public static void SavePlayer(Player player) { BinaryFormatter formatter = new BinaryFormatter(); string path = Application.persistentDataPath + "/PlayerData.data"; FileStream stream = new FileStream(path, FileMode.Create); PlayerData data = new PlayerData(player); formatter.Serialize(stream, data); stream.Close(); } public static PlayerData LoadPlayer() { string path = Application.persistentDataPath + "/PlayerData.data"; if (File.Exists(path)) { BinaryFormatter formatter = new BinaryFormatter(); FileStream stream = new FileStream(path, FileMode.Open); PlayerData data = formatter.Deserialize(stream) as PlayerData; stream.Close(); return data; } else { Debug.LogError("Save file not found in " + path); return null; } } } and Button Skript: public void SavePlayer() { SaveSystem.SavePlayer(this); } public void LoadPlayer() { PlayerData data = SaveSystem.LoadPlayer(); Vector3 position = new Vector3(data.position[0], data.position[1], data.position[2]); FlashLight.SetActive(data.isLamping); transform.position = position; } Was müsste ich hier ändern um es möglich zu machen mehrere Objekte zu speichern? 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.