Збереження і завантаження гри Unreal Engine



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

Спочатку вам необхідно визначити, які змінні ви збираєтеся зберігати робиться це так, для C++:

UPROPERTY(Збереження)


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

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 binary data to 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 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.