回答:
私は通常、メモリのスナップショットの観点では考えていませんが、セッション間で保存する必要がある値のリストを作成し、それらの値を外部ファイルに保存するだけです。
これはもちろん特定のゲームのニーズに依存しますが、通常は現在のレベルの状態(つまり、すべての敵がどこにいるのか、彼らの健康状態など)を保存してから、プレイヤーのレベルのような高レベルのものを保存しますすでに完了しています。
この答えはUnity3d固有のものです。
Unityでは、ほとんどのクラスはシリアル化可能です。つまり、完全なUnityオブジェクトをディスクにストリーミングできることを意味します。次のUnityScript-Codeは、オブジェクトをシリアル化し、ディスクに保存して再度ロードする方法です(ロード後にオブジェクトをキャストする必要があります)。
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;
}
}
}
TDの場合、おそらく波の間だけを保存します。そうすれば、あなたが考えなければならないのは塔だけです。レベルに10分以内のレベルに自動保存ポイントをいくつか入れますが、それより少ない方がおそらく望ましいでしょう。
もちろん、レベルが十分に短い場合は、キャンペーンのステータスのみを保存できます。
ゲームの現在の状態を参照するとき、保存の瞬間のメモリスナップショットを参照しています。HDDに保存するデータからそれを再作成できる必要があります。
永続的である必要があるデータを持つすべてのクラスをシリアル化し、HDDにダンプするだけで、メモリダンプを実行するのが最も簡単です。これに伴う問題は、クラスを変更すると、シリアル化された値の数/タイプが変更され、古い保存が破損することです。また、すべてを保存しているため、読み込み時間が長くなります。シリアライザ/ IDEが使用する属性システムで現在の「メモリスナップショット」を再構築するために実際に必要な個々のフィールドをマークする方が効率的です。次に、保存したデータから「メモリスナップショット」を再構築します。
また、Unityを使用したことがないため、Unityに何かが組み込まれている場合があります。しかし、これは典型的なアプローチです。