Сохранение и загрузка игры в Unreal Engine

9322a85d2f824646bfeb3682a3278488.jpg

Здравствуйте, меня зовут Дмитрий. Я занимаюсь созданием компьютерных игр на Unreal Engine в качестве хобби. Сегодня я расскажу как сохранить игру на диск, а потом загрузить её с диска.

Сначала вам необходимо определить какие переменные вы собираетесь сохранять делается это так, для C++:

UPROPERTY(SaveGame)

Для блюпринт:

image

После этого сохранение и загрузка осуществляется таким способом:
Сохранение:


      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 соответственен происходит загрузка.

Кроме того в плагине для редактирования квестов тоже появилась возможность сохранятся и загружаться (клавиши [ — сохранить, ] — загрузить),
→ вот он.

Почитать пор него можно здесь.

Комментарии (0)

© Habrahabr.ru