Home » C# » Как сделать сохранение и загрузку игры в Unity (Часть 2)
Как сделать сохранение и загрузку игры в Unity (Часть 1)

Как сделать сохранение и загрузку игры в Unity (Часть 2)

Часть 1

Сохранение игры

Использовать PlayerPrefs было достаточно просто, правда? С помощью PlayerPrefs вы можете легко сохранять и другие настройки, такие как настройки графики или данные входа в систему, и любые другие настройки конфигурации. Однако PlayerPrefs не предназначен для сохранения состояния игры. Для этого вы должны использовать сериализацию.

Первый шаг к созданию файла сохранения — создание класса сохранения игры. Создайте скрипт с именем Save и удалите наследование от MonoBehaviour, а также методы Start() и Update().

Затем добавьте следующие переменные:

Чтобы сохранить игру, вам нужно будет отслеживать, где находятся существующие роботы и какого они типа. Два списка выполняют эту функцию. Количество попаданий и выстрелов храним просто как int.

Есть ещё одна важная часть кода, которую вам нужно добавить. Выше объявления класса добавьте следующую строку:

Это атрибут, метаданные для вашего кода. Он говорит Unity, что класс может быть сериализован. Это означает, что вы можете превратить его в поток байтов и сохранить в файл на диске.

Примечание: Атрибуты имеют широкий диапазон применений и позволяют привязывать данные к классу, методу или переменной (метаданные). Вы даже можете определить свои собственные атрибуты для использования в своем коде. Сериализация использует атрибуты [SerializeField] и [System.Serializable]. Другие виды использования атрибутов включают настройки для Unit тестов и внедрения зависимостей, которые выходят за рамки данного урока, но их стоит изучить.

Весь скрипт Save должен выглядеть так:

Затем откройте скрипт Game и добавьте следующий метод:

Этот код создает экземпляр класса Save, который вы сделали ранее, затем устанавливает значение livingTargetPositions и livingTargetsTypes из существующих роботов. Так же он сохраняет выстрелы и попадания игрока.

Кнопка Save была подключена к методу SaveGame в скрипте, но в SaveGame пока нет кода. Заполните функцию SaveGame следующим кодом:

Разберём этот код комментарий за комментарием:

  • // 1 Создаётся экземпляр класса Save со всеми данными для текущей сессии, сохранёнными в нём.
  • // 2 Создаётся BinaryFormatter и FileStream передавая путь к экземпляру Save, который будет сохранён. Он сериализует данные (в байты) и записывает их на диск. Теперь на вашем компьютере будет файл gamesave.save. В качестве примера был использовано расширение .save, вы можете использовать любое расширение для имени файла сохранения.
  • // 3 Сброс игры к состоянию «по умолчанию».

Для сохранения игры, нажмите Escape во время воспроизведения и нажмите кнопку Save. Вы должны заметить, что всё сбрасывается, а в консоли отображается сообщение о том. что игры была сохранена.

Как сделать сохранение и загрузку игры в Unity (Часть 2)

Функция LoadGame в скрипте Game подключён к кнопке Load. Откройте скрипт Game и найдите функцию LoadGame. Замените её следующим кодом:

Рассмотрим подробнее:

  1. // 1 Проверка, существует ли файл сохранения. Если существует, производится обнуление роботов и счёта. В противном случае в консоль выводится сообщение об отсутствии файла сохранения.
  2. // 2 Так же как и при сохранении создаётся BinaryFormatter, только на этот раз поток байтов предоставляется для чтения. Поэтому в качестве аргумента передаётся просто путь к файлу сохранения. Создаётся объект Save и закрывается FileStream.
  3. // 3 Даже если у вас есть сохранённая информация, вам всё равно нужно преобразовать её в формат игры. Цикл проходит по сохранённым позициям живых роботов и добавляет их на сцену в нужное место. Для простоты таймеры сбрасываются, но вы можете изменить это.
  4. // 4 Обновление пользовательского интерфейса, для установки нужного количества выстрелов и попаданий, и присваивает значения переменным для продолжения подсчёта. Если этого не сделать, в следующий раз, когда игрок начнёт стрелять или попадёт в цель, значения будут установлены на 1.

Нажмите кнопку Play, немного поиграйте, а затем сохраните. Нажмите кнопку Load, и вы увидите, что игра загрузит врагов в том состоянии в котором они были до того как вы сохранили игру. Так же будут правильно установлены ваши выстрелы и попадания.

Как сделать сохранение и загрузку игры в Unity (Часть 2)

Сохранение данных в JSON

Есть ещё трюк, который вы можете использовать когда вы хотите сохранить данные — это JSON. Вы можете создать JSON представление вашей игры, сохранить его, отправить на сервер, а затем передать как String на другое устройство и преобразовать его из строки обратно в JSON. Этот урок не охватывает отправку/получение данных из интернета, но полезно знать, что использовать JSON — это невероятно просто.

Формат JSON немного отличается от кода C#, но он довольно прост. Вот пример JSON:

Внешние скобки образуют родительский объект, который и представляет JSON. Если вы знакомы со структурой данных словарь (Dictionary), то JSON аналогичен. JSON представляет собой отображение пары ключ-значение. Таким образом, приведённый пример имеет три пары ключ-значение. В JSON ключи всегда имеют тип данных String, но значениями могут быть объекты (напримсер дочерние объекты JSON), массивы, числа или строки. Значение для ключа message это hi, значение age — это номер 22, а значение items — это массив с двумя строками в нём.

Сам объект JSON представлен строковым типом. Передавая эти данные как String, любой язык может легко воссоздать объект JSON из строки в качестве аргумента конструктора. Очень удобно и очень просто.

Каждый язык имеет свой собственный способ создания объекта из этого формата. Начиная с Unity 5.3 существует собственный метод для создания объекта JSON из строки JSON. Вы можете создать JSON представление рекорда игрока, а затем вывести его в консоль. Можно расширить эту логику, отправив JSON на сервер.

В скрипте Game есть метод SaveAsJSON подключённый к кнопке Save As JSON. Замените код SaveAsJSON на следующий код:

Этот код создаёт экземпляр класса Save, как вы делали это ранее. Затем с использованием метода ToJSON создаётся JSON строка и выводится в консоль.

Запустите игру, поразите несколько целей, затем нажмите Escape, чтобы открыть меню. Нажмите кнопку Save As JSON button, и вы увидите созданную JSON строку в консоли.

Как сделать сохранение и загрузку игры в Unity (Часть 2)

Если вы хотите преобразовать JSON в экземпляр класса Save, выполните:

Это то, что нужно сделать, если бы файл сохранения был загружен из интернета. 

Что дальше?

Вы можете загрузить финальный проект здесь.

Вы получили мощный инструмент для создания отличных игр, позволяя вашим игрокам сохранять и загружать игру с помощью волшебства сериализации. Также вы узнали, что такое JSON. Ещё вы узнали для чего используется PlayerPrefs (сохранение настроек) и для чего PlayerPrefs не используется (сохранение игры).

Оригинал.