- Главная
- Форум
- База знаний (кратко, но по сути)
- Blueprint-классы
- Класс Save Game в Unreal Engine | сохранение игры |UE4, UE5
Класс Save Game в Unreal Engine | сохранение игры |UE4, UE5
Класс Save Game в Unreal Engine (UE4 и UE5) представляет собой специализированный класс, предназначенный для хранения игровых данных между игровыми сессиями (сохранения игры). Его основная задача — служить контейнером для информации, которую необходимо сохранить на диск и восстановить при следующем запуске игры. Благодаря этому игрок может продолжить прохождение с того места, где остановился, а различные элементы игрового мира сохраняют свое состояние.
По умолчанию все переменные игровых объектов (например, персонажей, противников и других Акторов) существуют только в оперативной памяти. Они доступны исключительно во время работы игры и полностью удаляются после ее завершения или перезагрузки уровня. Если не использовать систему сохранений, здоровье персонажа, количество собранных предметов, прогресс заданий и другие игровые данные при каждом запуске будут возвращаться к своим исходным значениям.
Класс Save Game решает эту проблему, выступая связующим звеном между оперативной памятью и постоянным хранилищем (жестким диском или SSD). При этом важно понимать, что он хранит не сами игровые объекты, а только данные, необходимые для восстановления их состояния.
Работа системы основана на механизме сериализации — преобразовании объекта или структуры данных в последовательность байтов, пригодную для записи на диск или передачи по сети. Перед сериализацией разработчик вручную копирует необходимые игровые данные (например, здоровье персонажа, количество ресурсов, координаты игрока или содержимое инвентаря) из объектов игрового мира в объект Save Game. После этого Unreal Engine сериализует объект и сохраняет его содержимое в файл формата .sav.
При загрузке выполняется обратный процесс — десериализация. Движок считывает файл сохранения, восстанавливает объект Save Game вместе со всеми его переменными, после чего разработчик переносит сохраненные значения обратно в соответствующие игровые объекты.
Объект Save Game поддерживает хранение большинства сериализуемых типов данных. К ним относятся целые и вещественные числа (Integer, Float), логические переменные (Boolean), строки (String), имена (Name), векторы (Vector), повороты (Rotator), трансформации (Transform), цвета (Color), перечисления (Enum), структуры (Struct), массивы (Array), словари (Map), множества (Set), а также пользовательские структуры. На практике чаще всего сохраняют здоровье персонажа, игровую валюту, уровень игрока, координаты, содержимое инвентаря, прогресс выполнения заданий, пользовательские настройки и состояние различных объектов игрового мира.
При этом сохранять ссылки на объекты игрового мира (Actor Reference, Character Reference, Component Reference, Widget Reference и т. п.) нельзя. После завершения игры эти объекты уничтожаются, а при следующем запуске создаются заново, поэтому сохраненные ссылки становятся недействительными. Вместо них следует сохранять данные, позволяющие восстановить объект: уникальный идентификатор, имя (Name), класс (Class), трансформацию (Transform) или другие необходимые параметры.
В большинстве случаев в Blueprint процесс сохранения состоит из четырех последовательных этапов.
- Создается объект Save Game с помощью узла Create Save Game Object. На этом этапе в оперативной памяти создается пустой экземпляр класса.
- Созданный объект заполняется актуальными игровыми данными. Например, в него копируются текущее здоровье персонажа, количество игровой валюты, координаты, содержимое инвентаря или список выполненных заданий.
- Вызывается узел Save Game to Slot или Async Save Game to Slot, который сериализует объект Save Game и записывает его содержимое в файл формата .sav с указанным именем.
- При загрузке выполняется обратная последовательность действий. Узел Load Game from Slot считывает файл сохранения, восстанавливает объект Save Game вместе со всеми его переменными, после чего сохраненные значения копируются обратно в игровые объекты.
Процесс настройки системы сохранений на основе класса Save Game в Blueprint
1. Создание Blueprint-класса Save Game
Перед использованием системы необходимо создать собственный Blueprint-класс, наследующийся от SaveGame. Для этого в Content Browser выбирают команду «Blueprint Class», после чего в качестве родительского класса указывают SaveGame. Созданный Blueprint можно назвать, например, BP_MySaveGame.
После создания класса в него добавляют все переменные, которые должны сохраняться между игровыми сессиями: здоровье персонажа, количество ресурсов, позицию игрока, массив инвентаря, список выполненных заданий и любые другие необходимые данные. Затем данный Blueprint необходимо скомпилировать и сохранить.
Саму логику сохранения обычно размещают в Character, Player Controller, меню паузы или системе контрольных точек. Однако наиболее подходящим местом считается класс Game Instance, поскольку его экземпляр существует на протяжении всей игровой сессии и не уничтожается при смене уровней. Рекомендуется вынести всю функциональность в отдельные функции SaveGame() и LoadGame().
Независимо от места реализации логика работы системы остается одинаковой. Вместо ссылок на игровые объекты следует сохранять только данные, необходимые для восстановления их состояния: координаты, значения переменных, уникальные идентификаторы и пользовательские структуры.
2. Создание объекта сохранения
Первым этапом логики сохранения является создание объекта сохранения с помощью узла Create Save Game Object. В его параметре Save Game Class необходимо указать созданный ранее класс, например BP_MySaveGame. Сам узел после своего выполнения в параметре Return Value возвращает объект BP_MySaveGame, существующий только в оперативной памяти, внутри которого будут доступны все пользовательские переменные, добавленные ранее на первом этапе.
3. Заполнение объекта Save Game
После создания объекта необходимо перенести в него текущее состояние игры.
Для этого получают доступ к игровым объектам. Чаще всего это выполняется с помощью Cast к нужному Blueprint-классу (например, Cast to BP_PlayerCharacter). Если система должна работать с различными типами объектов без жесткой зависимости от их классов, вместо Cast можно использовать Blueprint Interface.
Получив доступ к объекту, считывают необходимые значения: здоровье персонажа, количество игровой валюты, координаты, содержимое инвентаря, прогресс выполнения заданий и другие данные. Затем эти значения записывают в соответствующие переменные объекта Save Game с помощью узлов Set (Set PlayerHealth, Set PlayerGold, Set PlayerTransform и т. д.).
Именно на этом этапе текущее состояние игрового мира переносится в объект Save Game, который впоследствии будет сериализован и сохранен на диск.
4. Сохранение данных
После заполнения объекта вызывается узел Save Game to Slot.
В его параметр Save Game Object передается заполненный объект BP_MySaveGame, в параметре Slot Name указывается имя файла сохранения (например, SaveSlot1), а параметр User Index обычно оставляют равным 0.
После выполнения узла Unreal Engine сериализует объект Save Game и записывает его содержимое в файл формата .sav.
Если объем сохраняемых данных достаточно велик, рекомендуется использовать узел Async Save Game to Slot. Он выполняет сохранение в отдельном потоке, благодаря чему позволяет избежать кратковременных зависаний игры во время записи данных на диск.
Unreal Engine использует систему слотов сохранения. Слот представляет собой строку, которая используется в качестве имени файла сохранения. Например, это могут быть SaveSlot1, SaveSlot2, QuickSave или AutoSave.
Такой подход позволяет реализовать несколько игровых профилей, ручные сохранения, быстрые сохранения и систему автосохранения. Чтобы избежать ошибок, рекомендуется хранить имя слота в отдельной константе или переменной и использовать одно и то же значение как при сохранении, так и при загрузке.
Во время разработки файлы сохранений обычно располагаются в папке: Project / Saved / SaveGames.
В готовой игре место хранения зависит от операционной системы и платформы. При этом Unreal Engine автоматически выбирает подходящую директорию, поэтому разработчику, как правило, не требуется самостоятельно работать с файловыми путями.
5. Загрузка сохранения
Загрузка данных обычно выполняется при запуске игры или уровня, например в событии Event Begin Play, либо после выбора игроком пункта «Продолжить игру».
Перед загрузкой рекомендуется проверить существование файла сохранения с помощью узла Does Save Game Exist, используя то же имя слота, которое применялось при сохранении. Если узел возвращает значение True, выполнение продолжается через Branch, после чего вызывается узел Load Game from Slot.
Узел Load Game from Slot считывает файл сохранения и возвращает объект базового типа Save Game. Чтобы получить доступ к пользовательским переменным, этот объект необходимо привести к созданному ранее классу с помощью узла Cast to BP_MySaveGame.
После успешного приведения становятся доступны все сохраненные переменные. Их значения можно считывать с помощью узлов Get (например, Get PlayerHealth, Get PlayerGold, Get PlayerTransform) и использовать для восстановления состояния игры.
Для применения сохраненных данных необходимо получить доступ к соответствующим игровым объектам. Обычно это выполняется с помощью Cast к нужному Blueprint-классу (например, Cast to BP_PlayerCharacter) или через Blueprint Interface, если система должна поддерживать работу с различными типами объектов без жесткой зависимости от их классов.
После получения доступа сохраненные значения записываются в игровые объекты с помощью соответствующих узлов Set. Например:
- значение PlayerHealth присваивается переменной здоровья персонажа;
- значение PlayerTransform применяется с помощью узла Set Actor Transform;
- данные инвентаря, прогресса заданий и других игровых систем восстанавливаются путем записи сохраненных значений в соответствующие переменные объектов.
После выполнения этих действий состояние игры полностью будет соответствовать моменту, в который и было выполнено сохранение.
Подводя итог
В итоге, несмотря на большое количество используемых узлов Blueprint, принцип работы системы сохранений достаточно прост.
Во время сохранения текущее состояние игровых объектов копируется в объект Save Game, который затем сериализуется и записывается в файл формата .sav.
При загрузке выполняется обратная последовательность действий. Unreal Engine считывает файл сохранения, восстанавливает объект Save Game, после чего разработчик переносит сохраненные значения обратно в игровые объекты. Таким образом, сам класс Save Game не взаимодействует с игровым миром напрямую и служит исключительно контейнером для данных, предназначенных для сериализации.
Важно учитывать, что объекты класса Save Game, в отличие от Actor или Character, не создаются движком автоматически при запуске уровня и не существуют в игровом мире. Каждый раз перед сохранением необходимо вручную создать экземпляр этого класса с помощью узла Create Save Game Object, заполнить его переменные и только затем вызвать Save Game to Slot.
При загрузке объекта вручную его уже создавать не требуется. Узел Load Game from Slot самостоятельно считывает файл сохранения, создает объект Save Game, восстанавливает все его переменные и возвращает готовый экземпляр. После этого остается только считать сохраненные значения и применить их к соответствующим игровым объектам.
Таким образом, вся система сохранений сводится к двум операциям:
- копированию данных из игровых объектов в объект Save Game перед сохранением;
- обратному копированию данных из объекта Save Game в игровые объекты после загрузки.
И вообще, для простоты можно запомнить такую аналогию: объект Save Game — это просто почтовый конверт. Вы должны сами положить в него письмо (данные), отправить его на почту (диск), а потом вынуть письмо из пришедшего конверта и прочитать его.
===============
Зарегистрироваться в ЛК и скачать книгу по Blueprint: [Blueprint. Взгляд с высоты «птичьего полёта»]
