Antworten:
Ich denke im Allgemeinen nicht an einen Speicherauszug, sondern erstelle eine Liste der Werte, die zwischen Sitzungen gespeichert werden müssen, und speichere diese Werte in einer externen Datei.
Dies hängt natürlich von den Bedürfnissen Ihres Spiels ab, aber normalerweise speichere ich einfach den aktuellen Status (dh wo sich alle Feinde befinden, wie ihre Gesundheit ist usw.) und dann höherstufige Dinge wie die Levels des Spielers ist bereits abgeschlossen.
Diese Antwort ist Unity3d-spezifisch .
In Unity sind die meisten Klassen serialisierbar. Dies bedeutet, dass Sie vollständige Unity-Objekte auf die Festplatte streamen können. Mit dem folgenden UnityScript-Code können Sie ein Objekt serialisieren, auf der Festplatte speichern und erneut laden (nach dem Laden müssen Sie das Objekt umwandeln):
import System;
import System.IO;
import System.IO.Stream;
import System.Runtime.Serialization;
import System.Runtime.Serialization.Formatters.Binary;
class SaveLoad {
public static function SaveFile(filename:String, obj:Object):void {
try {
Debug.Log("Writing Stream to Disk.", SaveLoad);
var fileStream:Stream = File.Open(filename, FileMode.Create);
var formatter:BinaryFormatter = new BinaryFormatter();
formatter.Serialize(fileStream, obj);
fileStream.Close();
} catch(e:Exception) {
Debug.LogWarning("Save.SaveFile(): Failed to serialize object to a file " + filename + " (Reason: " + e.ToString() + ")");
}
}
public static function LoadFile(filename:String):Object {
try {
Debug.Log("Reading Stream from Disk.", SaveLoad);
var fileStream:Stream = File.Open(filename, FileMode.Open, FileAccess.Read);
var formatter:BinaryFormatter = new BinaryFormatter();
var obj:Object= formatter.Deserialize(fileStream);
fileStream.Close();
return obj;
} catch(e:Exception) {
Debug.LogWarning("SaveLoad.LoadFile(): Failed to deserialize a file " + filename + " (Reason: " + e.ToString() + ")");
return null;
}
}
}
Für einen TD würde ich wohl ausschließlich zwischen den Wellen sparen. Auf diese Weise müssen Sie nur an die Türme denken. Setzen Sie einige automatische Speicherpunkte in die Ebenen, nicht mehr als 10 Minuten dazwischen, aber weniger ist wahrscheinlich vorzuziehen.
Wenn Ihre Levels kurz genug sind, können Sie natürlich nur den Kampagnenstatus speichern.
Wenn ich mich auf den aktuellen Stand des Spiels beziehe, beziehe ich mich auf den Speicherauszug zum Zeitpunkt des Speicherns. Sie müssen in der Lage sein, dies anhand der Daten, die Sie auf Ihrer Festplatte speichern möchten, wiederherzustellen.
Am einfachsten ist es, alle Klassen mit Daten, die persistent sein müssen, zu serialisieren und auf die Festplatte zu sichern. Dabei wird im Wesentlichen ein Speicherauszug ausgeführt. Das Problem dabei ist, dass das Ändern Ihrer Klassen die Anzahl / Typen der serialisierten Werte ändert und alte Speicherungen aufbricht. Auch weil Sie alles speichern, erhöht sich die Ladezeit. Es ist effizienter, einzelne Felder zu markieren, die tatsächlich benötigt werden, um den aktuellen "Speicher-Snapshot" mit dem von Ihrem Serializer / Ihrer IDE verwendeten Attributsystem wiederherzustellen. Erstellen Sie dann den "Speicher-Snapshot" aus diesen gespeicherten Daten neu.
Außerdem habe ich Unity noch nie benutzt, sodass möglicherweise etwas eingebaut ist. Dies ist jedoch der typische Ansatz.