Odpowiedzi:
Zasadniczo nie myślę o migawce pamięci, ale po prostu tworzę listę wartości, które należy zapisać między sesjami, i zapisuję te wartości w zewnętrznym pliku.
Zależy to oczywiście od potrzeb konkretnej gry, ale zwykle po prostu zapisuję stan bieżącego poziomu (tj. Gdzie są wszyscy wrogowie, jakie jest ich zdrowie itp.), A następnie rzeczy na wyższym poziomie, takie jak poziom gracza już się zakończył.
Ta odpowiedź jest specyficzna dla Unity3d .
W Unity większość klas można serializować, co oznacza, że możesz przesyłać strumieniowo kompletne obiekty Unity na dysk. Poniższy kod UnityScript to sposób na serializację obiektu, zapisanie go na dysku i załadowanie go ponownie (po załadowaniu musisz rzutować obiekt):
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;
}
}
}
Dla niszczyciela prawdopodobnie zachowałbym wyłącznie między falami. W ten sposób musisz tylko pomyśleć o wieżach. Umieść kilka automatycznych punktów zapisu na poziomach, nie więcej niż 10 minut pomiędzy, ale prawdopodobnie lepiej jest mniej.
Oczywiście, jeśli twoje poziomy są wystarczająco krótkie, możesz po prostu zapisać tylko stan kampanii.
Kiedy odnoszę się do bieżącego stanu gry, mam na myśli migawkę pamięci w momencie zapisywania. Musisz mieć możliwość odtworzenia tego z danych, które będziesz przechowywać na dysku twardym.
Najłatwiej jest po prostu serializować wszystkie klasy, które mają dane, które muszą być trwałe, i zrzucić je na dysk twardy, zasadniczo wykonując zrzut pamięci. Problem polega na tym, że zmiana twoich klas zmieni liczbę / typy wartości zserializowanych i złamie stare zapisy. Również dlatego, że zapisujesz wszystko, co wydłuża czas ładowania. Bardziej efektywne jest oznaczanie poszczególnych pól, które są rzeczywiście potrzebne do odbudowania bieżącej „migawki pamięci” za pomocą dowolnego systemu atrybutów używanego przez serializator / IDE. Następnie odbuduj „migawkę pamięci” z zapisanych danych.
Nigdy też nie korzystałem z Unity, więc może mieć coś wbudowanego. Jest to jednak typowe podejście.