Respostas:
Geralmente, não penso em termos de um instantâneo de memória, mas apenas faço uma lista de quais valores precisam ser salvos entre as sessões e salve esses valores em um arquivo externo.
Isso depende, é claro, das necessidades do seu jogo específico, mas geralmente eu simplesmente salvo o estado do nível atual (ou seja, onde estão todos os inimigos, qual é a saúde deles, etc.) e, em seguida, coisas de nível superior, como o nível do jogador já foi concluído.
Esta resposta é específica do Unity3d .
No Unity, a maioria das classes é serializável, ou seja, você pode transmitir objetos completos do Unity para o disco. O código UnityScript a seguir é uma maneira de serializar um objeto, salve-o em disco e carregue-o novamente (após o carregamento, você deve converter o objeto):
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;
}
}
}
Para um TD, provavelmente salvaria exclusivamente entre ondas. Dessa forma, tudo o que você precisa pensar são as torres. Coloque alguns pontos de salvamento automáticos nos níveis, não mais do que 10 minutos entre, mas menos provavelmente é preferível.
Obviamente, se seus níveis forem curtos o suficiente, você poderá salvar apenas o status da campanha.
Quando me refiro ao estado atual do jogo, estou me referindo ao instantâneo da memória no momento da gravação. Você precisa recriar isso a partir dos dados que deseja armazenar no seu HDD.
É mais fácil apenas serializar todas as classes que possuem dados que precisam ser persistentes e despejá-las no HDD, executando essencialmente um despejo de memória. O problema é que alterar as classes alterará o número / tipos de valores serializados e interromperá os salvamentos antigos. Também porque você está salvando tudo, aumenta o tempo de carregamento. É mais eficiente marcar campos individuais que são realmente necessários para reconstruir o "instantâneo da memória" atual com qualquer sistema de atributos usado pelo serializador / IDE. Em seguida, recrie o "instantâneo da memória" a partir dos dados salvos.
Também nunca usei o Unity antes, por isso pode ter algo embutido. No entanto, essa é a abordagem típica.