Сохранение и загрузка игры в Unreal Engine
Здравствуйте, меня зовут Дмитрий. Я занимаюсь созданием компьютерных игр на Unreal Engine в качестве хобби. Сегодня я расскажу как сохранить игру на диск, а потом загрузить её с диска.
Сначала вам необходимо определить какие переменные вы собираетесь сохранять делается это так, для C++:
UPROPERTY(SaveGame)
Для блюпринт:
После этого сохранение и загрузка осуществляется таким способом:
Сохранение:
FMemoryWriter MemoryWriter(ObjectData, true);
FObjectAndNameAsStringProxyArchive Ar(MemoryWriter, false);
Ar.ArIsSaveGame = true; //Set achive is savegame
Ar.ArNoDelta = true;
Object->Serialize(Ar);
Загрузка:
FMemoryReader MemoryReader(ObjectData, true);
FObjectAndNameAsStringProxyArchive Ar(MemoryReader, false);
Ar.ArIsSaveGame = true; //Set achive is savegame
Ar.ArNoDelta = true;
Object->Serialize(Ar);
Как можно видеть сохранение от загрузки отличается лишь тем какой архив мы используем FMemoryWriter — при сохранение и FMemoryReader при загрузке.
Object — Это экземпляр класса значения переменных которого мы хотим сохранить.
ObjectData — Это массив байт который мы записываем в файл или читаем из файла.
ArIsSaveGame — Этот флаг говорит о том что архив используется для сохранения переменных помечены как SaveGame.
ArNoDelta — Этот флаг нужно установит что-бы не возникла ошибка, которая возникает если значение переменной сначала устанавливается в конструкторе класса, а затем на панели свойств класса. При сохранение переменной значение которой равно значению в конструкторе, и последующей загрузке, будет загружено значение из панели свойств.
После того как все значения переменных сохранены в архив нужно записать этот архив в файл. Делается это так:
Сохранение:
FFileHelper::SaveArrayToFile(Data, *SavePath)
Загрузка:
FFileHelper::LoadFileToArray(Data, *SavePath)
Кроме того чтобы сэкономить место на диска можно сохранять и загружать файлы в сжатом виде:
Сохранение:
TArray CompressedData;
FArchiveSaveCompressedProxy Compressor(CompressedData, ECompressionFlags::COMPRESS_ZLIB);
// Compresed
Compressor << Data;
//send archive serialized data to binary array
Compressor.Flush();
FFileHelper::SaveArrayToFile(CompressedData, *SavePath)
Загрузка:
FFileHelper::LoadFileToArray(CompressedData, *SavePath)
// Decompress File
FArchiveLoadCompressedProxy Decompressor(CompressedData, ECompressionFlags::COMPRESS_ZLIB);
//Decompress
Decompressor << Data;
При использование сжатия мы должны создать промежуточный архив FArchiveSaveCompressedProxy — для сжатия данных и FArchiveLoadCompressedProxy — для восстановления данных.
Собственно, на этом все
→ вот пример
Здесь при нажатии s происходит сохранение всех акторов на карте которые являются наследниками класса ISaveObject_StoryGraph. При нажатии l соответственен происходит загрузка.
Кроме того в плагине для редактирования квестов тоже появилась возможность сохранятся и загружаться (клавиши [ — сохранить, ] — загрузить),
→ вот он.
Почитать пор него можно здесь.