Відповіді:
Я, як правило, не думаю про зйомку пам'яті, але я просто складаю список, які значення потрібно зберігати між сеансами і зберігати ці значення у зовнішній файл.
Це, звичайно, залежить від потреб вашої конкретної гри, але зазвичай я просто зберігаю стан поточного рівня (тобто, де всі вороги, яке їхнє здоров'я тощо), а потім речі вищого рівня, наприклад, який рівень гравця вже завершено.
Ця відповідь стосується 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;
}
}
}
Для ТД я б, мабуть, економив виключно між хвилями. Таким чином, все, що вам потрібно думати, - це вежі. Поставте кілька точок автоматичного збереження в рівнях, не більше 10 хвилин, але менше, мабуть, краще.
Звичайно, якщо ваші рівні досить короткі, ви можете просто зберегти нічого, крім статусу кампанії.
Коли я маю на увазі поточний стан гри, я маю на увазі знімок пам'яті в момент збереження. Вам потрібно вміти відтворити це з даних, які ви збираєтеся зберігати на вашому жорсткому диску.
Найпростіше просто серіалізувати всі ваші класи, у яких є дані, які повинні бути стійкими, і скинути їх на жорсткий диск, по суті виконуючи дамп пам'яті. Проблема з цим полягає в тому, що зміна класів змінить кількість / типи серіалізованих значень і порушить старі збереження. Також тому, що ви економите все, це збільшує час завантаження. Його ефективніше позначити окремі поля, які фактично потрібні для відновлення поточного "знімка пам'яті" за допомогою будь-якої системи атрибутів, яку використовує ваш серіалізатор / IDE. Потім відновіть "знімок пам'яті" з цих збережених даних.
Також я ніколи раніше не використовував Unity, щоб у ньому було щось вбудоване. Однак це типовий підхід.