답변:
나는 일반적으로 메모리 스냅 샷의 관점에서 생각하지 않지만 세션간에 저장해야 할 값의 목록을 만들고 해당 값을 외부 파일에 저장합니다.
이것은 물론 특정 게임의 요구에 달려 있지만 일반적으로 나는 현재 레벨의 상태 (예 : 모든 적의 위치, 건강 상태 등)를 저장 한 다음 플레이어의 레벨과 같은 상위 레벨 항목을 저장합니다 이미 완료되었습니다.
이 답변은 Unity3d 전용 입니다.
Unity에서 대부분의 클래스는 직렬화 가능하므로 완전한 Unity 객체를 디스크로 스트리밍 할 수 있습니다. 다음 UnityScript 코드는 오브젝트를 직렬화하고 디스크에 저장하여 다시로드합니다 (로드 후 오브젝트를 캐스트해야 함).
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;
}
}
}
게임의 현재 상태를 참조 할 때 저장하는 순간 메모리 스냅 샷을 참조합니다. HDD에 저장하려는 데이터에서 다시 만들 수 있어야합니다.
지속적이어야하는 데이터가있는 모든 클래스를 직렬화하고 HDD에 덤프하여 메모리 덤프를 수행하는 것이 가장 쉬운 방법입니다. 문제는 클래스를 변경하면 직렬화 된 값의 수 / 유형이 변경되고 이전 저장이 중단된다는 것입니다. 또한 모든 것을 저장하기 때문에 로딩 시간이 길어집니다. 시리얼 라이저 / IDE가 사용하는 속성 시스템을 사용하여 현재 "메모리 스냅 샷"을 다시 작성하는 데 실제로 필요한 개별 필드를 표시하는 것이 더 효율적입니다. 그런 다음 저장된 데이터에서 "메모리 스냅 샷"을 다시 작성하십시오.
또한 Unity를 사용해 본 적이 없으므로 내장 된 것이있을 수 있습니다. 그러나 이것이 일반적인 접근 방식입니다.