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

в 7:42, , рубрики: c++, save game, Unreal Engine, Программирование, разработка игр

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

Здравствуйте, меня зовут Дмитрий. Я занимаюсь созданием компьютерных игр на 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<uint8> 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 соответственен происходит загрузка.

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

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

Автор: deema35

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js