Risposte:
In genere non penso in termini di un'istantanea della memoria, ma piuttosto faccio solo un elenco di quali valori devono essere salvati tra le sessioni e salvarli in un file esterno.
Questo dipende ovviamente dalle esigenze del tuo gioco specifico, ma di solito semplicemente salvo lo stato del livello attuale (cioè dove sono tutti i nemici, qual è la loro salute, ecc.) E quindi cose di livello superiore come a quali livelli il giocatore ha già completato.
Questa risposta è specifica per Unity3d .
In Unity, la maggior parte delle classi è serializzabile, ciò significa che è possibile eseguire lo streaming di oggetti Unity completi su disco. Il seguente codice UnityScript è un modo per serializzare un oggetto, salvarlo su disco e caricarlo di nuovo (dopo il caricamento è necessario eseguire il cast dell'oggetto):
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;
}
}
}
Per un TD probabilmente risparmierei esclusivamente tra le onde. In questo modo tutto ciò a cui devi pensare sono le torri. Inserisci alcuni punti di salvataggio automatico nei livelli, tra non più di 10 minuti, ma probabilmente è preferibile meno.
Ovviamente se i tuoi livelli sono abbastanza brevi non potresti semplicemente salvare altro che lo stato della campagna.
Quando mi riferisco allo stato attuale del gioco, mi riferisco all'istantanea della memoria al momento del salvataggio. Devi essere in grado di ricrearlo dai dati che memorizzerai sul tuo HDD.
È più semplice serializzare tutte le classi che contengono dati che devono essere persistenti e scaricarle sull'HDD, eseguendo essenzialmente un dump della memoria. Il problema è che l'alterazione delle classi cambierà il numero / tipi di valori serializzati e interromperà i vecchi salvataggi. Anche perché stai salvando tutto ciò aumenta i tempi di caricamento. È più efficiente contrassegnare i singoli campi che sono effettivamente necessari per ricostruire l'attuale "istantanea della memoria" con qualsiasi sistema di attributi utilizzato dal serializzatore / IDE. Quindi ricostruire lo "snapshot di memoria" da quei dati salvati.
Inoltre non ho mai usato Unity prima, quindi potrebbe avere qualcosa incorporato. Tuttavia, questo è l'approccio tipico.