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

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

Игры становятся все длиннее и длиннее, а некоторые бывают продолжительностью более 100 часов. Невозможно ожидать, что игроки смогут сделать всё, что может предложить игра за один заход. Именно поэтому позволять игроку сохраняться — одна из важнейших функций вашей игры.

Но как создать файл сохранения и что должно быть в нём? Нужно ли использовать файл сохранения, что бы отслеживать настройки игрока? Как отправлять настройки в Интернет, что бы их можно было загрузить на другом устройстве?

В этом уроке вы узнаете:

  • Что такое сериализация и десериализация.
  • Что такое PlayerPrefs и как использовать его для сохранения настроек игрока.
  • Как создать файл сохранения и сохранить его на диск.
  • Как загрузить файл сохранения игры.
  • Что такое JSON и как его использовать.

Предполагается, что у вас есть некоторые базовые знания в работе с Unity, вам ничего не понадобится кроме этого. Даже если вы новичок в С#, вы не должны беспокоится об этом.

Примечание: Если вы новичок в Unity или хотите больше навыков Unity, вы должны прочитать другие наши уроки по Unity, где вы можете узнать о Unity и C#.

Начинаем

Здесь загрузите стартовый проект. Вы будите писать код для сохранения и загрузки игры, а также логику для сохранения настроек игрока.

Важные концепции сохранения

В Unity есть четыре ключевых концепции сохранения:

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

Сериализация: это магия, которая заставляет работать Unity. Сериализация — это преобразование объекта в поток байтов. Это может показаться расплывчатым объяснением, но взгляните на эту картинку:
Как сделать сохранение и загрузку игры в Unity (Часть 1)

Что такое  “object”? В данном случае «object» — это любой скрипт или файл в Unity. Фактически, всякий раз, когда вы создаёте скрипт MonoBehaviour, Unity использует сериализацию и десериализацию для преобразования этого файла в С++ код, а затем обратно в код С#, который вы видите в окне инспектора. Если вы когда-нибудь добавляли  [SerializeField], чтобы что-то появилось в инспекторе, у вас есть представления как это происходит.

Примечание. Если вы Java или веб-разработчик, вы можете быть знакомы с концепцией, известной как маршаллинг. Сериализация и маршаллинг не синонимы. О сравнении маршаллинга с сериализацией можно прочитать тут.

Десериализация: Это именно то, на что похоже. Это противоположность сериализации, а именно превращение потока байтов в объект.

JSON: Это означает JavaScript Object Notation, удобный формат для отправки и получения данных, которые не зависят от конкретного языка. Например, у вас вожет быть веб-сервер, работающий на Java или PHP. Вы не можете просто отправить объект C#, но вы можете отправить JSON-представление этого объекта и позволить серверу воссоздать локализованную версию этого объекта. Вы узнаете больше об этом формате в предыдущем разделе, но сейчас просто знаю, что это просто способ форматирования данных, чтобы сделать его мультиплатформенным для чтения (как XML). Когда речь идет о преобразовании в JSON и обратно, эти термины представляют собой сериализацию JSON и десериализацию JSON соответственно.

Player Prefs

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

Откройте проект, затем откройте сцену под названием «Game», а затем нажмите запустить.

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

Чтобы начать игру, нажмите кнопку «New Game». Чтобы играть, просто двигайте мышью, а пистолет будет следить за вашим движением. Нажмите левую кнопку мыши, чтобы выпустить пулю и поразить цель для получения очков. Попробуйте и посмотрите, как много очков вы сможете набрать за 30 секунд. Чтобы выйти в меню, нажмите клавишу escape.

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

Эта игра была бы намного лучше с музыкой. Возможно, вы заметили, что есть переключатель музыки, но он отключён. Нажмите кнопку Play для запуска игры заново, но на этот раз нажмите на переключатель Music, что бы установить его в положение Вкл, и вы услышите музыку, когда начнёте игру.

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

Изменение настроек музыки было простым, но нажмите кнопку Play ещё раз, и вы заметите проблему: переключатель музыки опять не активен. Тогда как ранее вы изменили эту настройку, но ничего не изменилось. Это как раз та проблема с которой PlayerPrefs отлично справится.

Создайте новый скрипт с именем PlayerSettings в папке Scripts. Поскольку вы будете использовать некоторые элементы пользовательского интерфейса, добавьте следующую строку вверху, рядом с другими пространствами имён.

Далее, добавьте следующие переменные.

Они будут отслеживать объекты Toggle и AudioSource.
Далее добавьте следующую функцию:

1. Проверьте, имеет ли PlayerPrefs кешированную настройку music. Если там нет значения, создаётся пара ключ-значение для ключа music со значением 1. Так же переключатель устанавливается  в положение вкл. и включается AudioSource. Это будет выполнятся при первом запуске игры. Значение 1 используется, потому что вы не можете сохранить логическое значение (но вы можете использовать 0 как false, а 1 — как true).

2. Проверяется ключ music, сохраненный в PlayerPrefs. Если значение 1, плеер включается и переключатель устанавливается в положение вкл. В противном случае музыка отключается и отключает переключатель.

Теперь сохраните изменения в скрипте и вернитесь в Unity.

Добавьте скрипт PlayerSettings в объект Game. Затем разверните объект UI, а затем объект Menu, что бы показать его потомков. затем перетащите объект Music в поле Toggle скрипта PlayerSettings. Затем выберите объект Game и перетащите AudioSource в поле MyAudio.

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

Настройки музыки начинают работать когда игра запускается (поскольку код находится в функции Awake), но вам всё равно нужно добавить код, если игрок изменит настройку во время игры. Откройте скрипт PlayerSettings и добавьте следующую функцию:

Это почти то же самое, что и код, который вы написали ранее, за исключением одного важного отличия. Он проверяет состояние переключателя музыки, а затем обновляет сохранённую настройку. Чтобы этот метод был вызван и работал, вам нужно установить колбэк в объект Toggle. Выберите объект Music и перетащите объект Game в поле раздела OnValueChanged:

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

Откройте список на котором в настоящий момент написано No Function, и выберите PlayerSettings -> ToggleMusic(). Когда переключатель в меню нажат, он вызывает функцию ToggleMusic.

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

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

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

Теперь настройка музыки сохранилась! Отличная работа — но вы только начинаете осваивать возможности сериализации.

Часть 2