Réponses:
En général, je ne pense pas en termes d'instantané de mémoire, mais je fais plutôt une liste des valeurs qui doivent être enregistrées entre les sessions et enregistrez ces valeurs dans un fichier externe.
Cela dépend bien sûr des besoins de votre jeu spécifique, mais généralement, je sauvegarde simplement l'état du niveau actuel (c'est-à-dire où se trouvent tous les ennemis, quelle est leur santé, etc.), puis des éléments de niveau supérieur comme les niveaux du joueur est déjà terminée.
Cette réponse est spécifique à Unity3d .
Dans Unity, la plupart des classes sont sérialisables, ce qui signifie que vous pouvez diffuser des objets Unity complets sur le disque. Le code UnityScript suivant est un moyen de sérialiser un objet, de l'enregistrer sur le disque et de le charger à nouveau (après le chargement, vous devez convertir l'objet):
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;
}
}
}
Pour un TD, j'économiserais probablement exclusivement entre les vagues. De cette façon, vous n'avez qu'à penser aux tours. Mettez des points de sauvegarde automatique dans les niveaux, pas plus de 10 minutes entre, mais moins est probablement préférable.
Bien sûr, si vos niveaux sont suffisamment courts, vous ne pouvez tout simplement enregistrer que le statut de la campagne.
Lorsque je fais référence à l'état actuel du jeu, je fais référence à l'instantané de la mémoire au moment de la sauvegarde. Vous devez être en mesure de recréer cela à partir des données que vous allez stocker sur votre disque dur.
Il est plus simple de sérialiser toutes vos classes qui ont des données qui doivent être persistantes et de les vider sur le disque dur, en effectuant essentiellement un vidage de la mémoire. Le problème est que la modification de vos classes changera le nombre / types de valeurs sérialisées et rompra les anciennes sauvegardes. De plus, parce que vous enregistrez tout, cela augmente les temps de chargement. Il est plus efficace de marquer les champs individuels qui sont réellement nécessaires pour reconstruire l '"instantané de mémoire" actuel avec le système d'attributs utilisé par votre sérialiseur / IDE. Reconstruisez ensuite l '"instantané de mémoire" à partir de ces données enregistrées.
De plus, je n'ai jamais utilisé Unity auparavant, il peut donc y avoir quelque chose de intégré. Cependant, c'est l'approche typique.