Jump to content
Unity Insider Forum

Wie speichere ich Daten von einem kleinen Open-World Spiel?


lenn0707070

Recommended Posts

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

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

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

Archiviert

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

×
×
  • Neu erstellen...