Unity сохраняет настройки в файл

Обновлено: 02.07.2024

Unity классифицирует большую часть информации о сохранении на изменения сцены и изменения всего проекта.

  • Чтобы сохранить все изменения сцены и изменения всего проекта, выберите «Файл» > «Сохранить» (или «Сохранить как»). Это самый быстрый способ сохранить все сразу.
  • Чтобы сохранить изменения всего проекта, но не изменения сцены, выберите «Файл» > «Сохранить проект».

Примечание. Исключение из этого поведения возникает, когда вы редактируете в Prefab Mode. В этом случае Файл > Сохранить сохраняет изменения только в открытом префабе. Он не сохраняет изменения сцены или изменения всего проекта.

Unity также сразу же сохраняет некоторую информацию, пока вы работаете в редакторе. Дополнительные сведения см. в разделе Немедленное сохранение ниже.

Сцена меняется

К изменениям сцены относятся модификации GameObjects. Фундаментальный объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Глоссарии в Сцене Сцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Дополнительную информацию
см. в глоссарии , например, когда вы:

  • Добавить, переместить или удалить игровой объект
  • Изменить параметры игрового объекта в инспекторе

Изменения в рамках всего проекта

Общие для проекта изменения в Unity применяются ко всему проекту, а не к конкретной сцене. Если вы хотите сохранить настройки всего проекта без сохранения изменений сцены, выберите «Файл» > «Сохранить проект». Это может оказаться полезным, если, например, вы создаете временную сцену для проверки некоторых изменений.

Общие изменения проекта включают:

  • Настройки проекта Широкий набор настроек, которые позволяют настроить поведение физики, звука, сети, графики, ввода и многих других областей вашего проекта. Подробнее
    см. в глоссарии: Unity сохраняет изменения в настройках проекта в папке Library при сохранении проекта. Он сохраняет настройки в следующих файлах:
    • Ввод: InputManager.asset
    • Теги и слои: TagManager.asset
    • Аудио: AudioManager.asset
    • Время: TimeManager.asset
    • Проигрыватель: ProjectSettings.asset
    • Физические характеристики: DynamicsManager.asset
    • Физика 2D: Physics2DSettings.asset
    • Качество: QualitySettings.asset
    • Графика: GraphicsSettings.asset
    • Сеть: NetworkManager.asset
    • Редактор: EditorUserSettings.asset
    • Используйте класс SerializedObject с SerializedProperties.
    • Используйте класс Undo для записи изменений.
    • Если ничего из вышеперечисленного не работает, вы также можете использовать SetDirty.

    Немедленное сохранение

    Есть некоторые изменения, которые Unity сразу же сохраняет на диск, когда они происходят. К ним относятся следующие:


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

    Обновлено 23 июня 2021 г. В рамках Unite Now 2020 я создал сеанс с советами по сохранению данных в Unity. В нем рассматриваются некоторые из распространенных способов сохранения и загрузки данных в вашем проекте Unity, но это ни в коем случае не исчерпывающий список. Другими словами, существует больше способов сериализации данных, чем вам когда-либо понадобится, и каждый подход решает определенную проблему и имеет свой собственный набор сильных и слабых сторон. В этом сообщении блога будут рассмотрены те же самые распространенные методы, которые я обсуждал на сеансе Unite Now.

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

    PlayerPrefs относительно легко реализовать, для этого требуется всего несколько строк кода, но они поддерживают только значения типа Float, Int и String, что усложняет сериализацию больших и сложных объектов.Целеустремленный пользователь может преодолеть это ограничение, преобразовав свои сохраненные данные в какой-либо формат, представленный одним из этих основных типов, но я не рекомендую этого делать, так как есть лучшие инструменты для хранения ваших данных.

    Наконец, поскольку каждое приложение Unity хранит все свои PlayerPrefs в одном файле, оно не очень подходит для обработки нескольких файлов сохранения или облачных сохранений, которые требуют, чтобы вы сохраняли и получали данные сохранения из разных мест.

    JSON – это удобный для чтения формат данных. То есть он легко понятен как людям, так и машинам, что имеет как преимущества, так и недостатки. Гораздо проще отлаживать сохраненные данные или создавать новые данные для тестирования, когда вы можете прочитать и понять их, но, с другой стороны, игрокам также легко читать и изменять данные. Возможность чтения и изменения данных полезна, если вы поддерживаете моддинг, но вредна, если вы хотите предотвратить читерство. В дополнение к этим проблемам, поскольку JSON является текстовым форматом, его анализ на машинах обходится дороже. То есть он медленнее читается и использует больше памяти, чем бинарные альтернативы. Итак, если у вас много данных, вы можете рассмотреть варианты, которые не основаны на тексте. Каждый вариант использования уникален, и именно такие компромиссы заставляют разработчиков создавать множество других форматов данных.

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

    JsonUtility – это встроенный API Unity для сериализации и десериализации данных JSON. Подобно PlayerPrefs, его также относительно легко реализовать. Однако, в отличие от PlayerPrefs, вы должны сами сохранять данные JSON либо в файле, либо по сети. Самостоятельное управление хранилищем данных упрощает управление несколькими файлами сохранения, поскольку вы можете хранить каждый файл в другом месте. Чтобы упростить задачу, я написал базовый файловый менеджер, который доступен в этом репозитории примеров.

    Важно отметить, что JsonUtility не является полнофункциональной реализацией JSON. Если вы привыкли работать с данными JSON, вы можете заметить отсутствие поддержки определенных функций. Если вам интересно сравнить производительность различных решений JSON, попробуйте этот проект сравнительного анализа. Имейте в виду, что лучше всего проводить тестирование на целевом устройстве, если это возможно.

    Те же ограничения ограничивают JsonUtility, что и внутренний сериализатор Unity: если вы не можете сериализовать поле в Инспекторе, вы не сможете сериализовать его в JSON. Чтобы обойти эти ограничения, вы можете создать типы Plain Old Data (или PODS) для хранения всех ваших сохраненных данных. Когда придет время сохранять, перенесите данные из их типов среды выполнения в POD и сохраните их на диск. При необходимости вы также можете создавать собственные обратные вызовы сериализации для поддержки типов, которые сериализатор Unity не поддерживает по умолчанию.

    Что касается темы JsonUtility, EditorJsonUtility — еще один полезный инструмент. В то время как JsonUtility работает для любого объекта на основе MonoBehaviour или ScriptableObject, EditorJsonUtility будет работать для любого типа движка Unity. Таким образом, вы можете создать JSON-представление любого объекта в редакторе Unity или пойти другим путем и создать ресурс из файла JSON.

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

    Двоичные инструменты

      является эффективным бинарным сериализатором. Он эффективен и относительно прост в использовании. Как и JSON, он доступен почти на всех платформах, поэтому вы можете использовать его для отправки данных по сети для связи с внутренними серверами. Вы можете прочитать больше об этом здесь. и Protobuf-net — еще один подобный бинарный сериализатор. Это также быстро и эффективно. Google разработал его как эффективную альтернативу существующим форматам, таким как XML. Подобно JSON и MessagePack, он также хорошо подходит для общения по сети. — это библиотека DotNet для непосредственного хранения ваших объектов в двоичном формате. Однако BinaryFormatter имеет опасные уязвимости в системе безопасности, и его следует избегать. Повторяю, не используйте BinaryFormatter. Узнайте больше об угрозах безопасности здесь.

    Текстовые инструменты

      — хорошо поддерживаемый и популярный подключаемый модуль, доступный в магазине Unity Asset Store. Это позволяет вам сохранять все ваши данные без написания кода, что отлично подходит для начинающих. Он также имеет мощный и гибкий API, что делает его идеальным для опытных пользователей. Это не бесплатно, но оно того стоит, если вы ищете полнофункциональное готовое решение. — это бесплатная реализация JSON с открытым исходным кодом для всех платформ DotNet.В отличие от встроенной JsonUtility, она полнофункциональна. Однако за это приходится платить, потому что он значительно менее эффективен, чем встроенный JsonUtility. Стандартная версия не поддерживает все платформы Unity, но в Unity Asset Store доступна модифицированная версия с добавленной поддержкой. является альтернативным форматом данных. Как и JSON, он относительно удобочитаем и имеет некоторые функции, которые могут быть полезны для вашего конкретного приложения, например, пространства имен. DotNet имеет встроенную поддержку XML.

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

    Если вам нужна реальная безопасность, лучше всего хранить данные на сервере, где пользователи не смогут их изменить. Чтобы это работало, приложение не должно отправлять какие-либо данные напрямую на сервер, потому что пользователи все равно могут манипулировать ими. Вместо этого приложение может только отправлять команды на сервер, позволять серверу изменять данные, а затем отправлять результаты обратно в приложение. Поэтому, если безопасность данных жизненно важна для вас, лучше узнать об этом как можно скорее, потому что это повлияет на архитектуру вашего проекта.

    Дополнительную информацию о сериализации см. на странице руководства. Если вы хотите увидеть это в действии, ознакомьтесь с сопутствующей сессией Unite Now.

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

    • Чтобы сохранить все текущие изменения сцены и всего проекта, выберите «Файл» > «Сохранить» (или «Сохранить как»).
    • Чтобы сохранить изменения всего проекта, но не изменения сцены, выберите «Файл» > «Сохранить проект».

    Примечание. Если вы редактируете в режиме Prefab, при сохранении через File > Save изменения сохраняются только в открытом Prefab. Выйдите из Prefab Mode, чтобы сохранить более широкие изменения.

    Unity автоматически сохраняет некоторую информацию, пока вы работаете в редакторе. Дополнительные сведения см. в разделе Автоматическое сохранение.

    Сцена меняется

    К изменениям сцены относятся модификации GameObjects. Фундаментальный объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
    См. в Глоссарии в Сцене Сцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
    см. в глоссарии. Например:

    • Если вы добавляете, перемещаете или удаляете игровой объект.
    • Если вы изменяете параметры игрового объекта в окне Inspector A Unity, в котором отображается информация о выбранном в данный момент игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Подробнее
      См. в окне Глоссария.

    Изменения в рамках всего проекта

    Общие для проекта изменения в Unity применяются ко всему проекту, а не к конкретной сцене. Например, если вы создаете временную сцену для проверки изменений, вы можете сохранить проект, а не сцену.

    Общие изменения проекта включают:

    Настройки проекта Широкий набор настроек, которые позволяют настроить поведение физики, звука, сети, графики, ввода и многих других областей вашего проекта. Дополнительная информация
    См. в глоссарии: когда вы сохраняете свой проект, Unity сохраняет изменения в настройках проекта в папке библиотеки в следующих файлах:

    • Ввод: InputManager.asset
    • Теги и слои: TagManager.asset
    • Аудио: AudioManager.asset
    • Время: TimeManager.asset
    • Проигрыватель: ProjectSettings.asset
    • Физические характеристики: DynamicsManager.asset
    • Физика 2D: Physics2DSettings.asset
    • Качество: QualitySettings.asset
    • Графика: GraphicsSettings.asset
    • Сеть: NetworkManager.asset
    • Редактор: EditorUserSettings.asset

    Настройки сборки: Unity сохраняет изменения в настройках сборки в папке библиотеки как EditorBuildSettings.asset .

    Измененные ресурсы: когда вы сохраняете настройки для всего проекта, Unity сохраняет все несохраненные ресурсы.

    Примечание. Некоторые типы ресурсов имеют кнопку "Применить" в Инспекторе. Unity не сохранит их, пока вы не выберете «Применить».

    Грязные ресурсы: Unity сохраняет грязные ресурсы, то есть файлы на вашем диске, измененные в программе, но еще не сохраненные. Вы можете использовать пользовательские редакторы и скрипты. Фрагмент кода, который позволяет вам создавать свои собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Дополнительная информация
    См. в глоссарии, чтобы пометить объект как грязный одним из следующих способов:

    Узнайте, как сохранять и загружать игру в Unity с помощью PlayerPrefs, сериализации и JSON.Дополните опыт вашего пользователя, разрешив ему сохранить свою игру.


    Сохраните игру с помощью Unity

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

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

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

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

    Начало работы

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

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

    Есть четыре основных понятия сохранения в Unity:

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

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

    Иллюстрация сериализации

    Примечание. Если вы являетесь Java-разработчиком или веб-разработчиком, вы можете быть знакомы с концепцией, известной как маршаллинг. Сериализация и маршалинг в общих чертах являются синонимами, но если вам интересно, в чем может быть строгое различие, сериализация — это преобразование объекта из одной формы в другую (например, объект в байты), тогда как маршалинг — это получение параметров из одного места в другое. другой.

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

    Настройки игрока

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

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

    Меню

    Чтобы начать игру, нажмите кнопку Новая игра. Чтобы играть в игру, вы просто двигаете мышью, и пистолет будет следовать за вашим движением. Щелкните левой кнопкой мыши, чтобы выстрелить пулей и поразить мишени (которые переворачиваются вверх и вниз через различные промежутки времени), чтобы получить очки. Попробуйте и посмотрите, какой высокий балл вы сможете набрать за 30 секунд. Чтобы вызвать меню в любое время, нажмите клавишу выхода.

    игра в процессе

    Какой бы веселой ни была эта игра, без музыки она могла бы быть немного суховатой. Вы могли заметить, что есть переключатель музыки, но он был выключен. Нажмите «Воспроизвести», чтобы начать новую игру, но на этот раз нажмите на переключатель «Музыка», чтобы он был установлен на «Вкл.», и вы услышите музыку при запуске игры. Убедитесь, что динамики включены!

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

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

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

    Они будут отслеживать объекты Toggle и AudioSource.

    Далее добавьте следующую функцию:

    При настройке это будет:

    1. Проверьте, есть ли в PlayerPrefs кешированная настройка для клавиши «музыка». Если там нет значения, он создает пару ключ-значение для музыкального ключа со значением 1. Он также включает переключатель и включает AudioSource. Это будет запущено при первом запуске игры. Значение 1 используется, потому что вы не можете хранить логическое значение (но вы можете использовать 0 как ложь и 1 как истину).
    2. Это проверяет ключ «музыка», сохраненный в PlayerPrefs. Если установлено значение 1, в проигрывателе была включена музыка, поэтому он включает музыку и устанавливает переключатель в положение «включено». В противном случае музыка отключается, а переключатель отключается.

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

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

    Переключить музыку(). При нажатии кнопки-переключателя в меню вызывается функция ToggleMusic.

    Выбор правильного метода

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

    Меню игры

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

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

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

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

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

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

    Есть еще один очень важный фрагмент кода, который вам нужно добавить. Над объявлением класса добавьте следующую строку:

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

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

    Весь сценарий сохранения должен выглядеть следующим образом:

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

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

    Кнопка "Сохранить" связана с методом "Сохранить игру" в сценарии игры, но кода в "Сохранить игру" пока нет. Замените функцию SaveGame следующим кодом:

    Комментарий за комментарием:

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

    Чтобы сохранить игру, нажмите Escape в любой момент во время игры, а затем нажмите кнопку Сохранить. Вы должны заметить, что все сбрасывается, а в выводе консоли отображается примечание о том, что игра сохранена.

    Консольный вывод

    LoadGame в сценарии игры связан с кнопкой "Загрузить". Откройте скрипт Game и найдите функцию LoadGame. Замените его следующим:

    Подробно об этом:

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

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

    Игра в процессе

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

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

    Внешние скобки представляют собой родительский объект, который является JSON. Если вы знакомы со структурой данных Dictionary, то JSON аналогичен. Файл JSON представляет собой сопоставление пар ключ-значение. Таким образом, в приведенном выше примере есть 3 пары ключ-значение. В JSON ключи всегда являются строками, но значения могут быть объектами (т. е. дочерними объектами JSON), массивами, числами или строками. Клавише «сообщение» присвоено значение «привет», значение клавиши «возраст» — число 22, а значение клавиши «элементы» — массив с двумя строками в нем.

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

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

    Сценарий игры содержит метод SaveAsJSON, связанный с кнопкой "Сохранить как JSON". Замените SaveAsJSON следующим кодом:

    При этом создается экземпляр сохранения, как вы делали ранее. Затем он создает строку JSON, используя метод ToJSON в классе JsonUtility. Затем он выводит вывод на консоль.

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

    Консольный вывод

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

    Это то, что вы сделали бы, если бы захотели загрузить файл сохранения из Интернета, а затем загрузить его в свою игру. Но настройка веб-сервера — это совсем другой процесс! А пока похлопайте себя по спине, потому что вы только что изучили несколько приемов, которые… избавят от проблем в следующей игре (стон)!

    Куда идти дальше?

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

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

    Если вы преданный поклонник Unity и хотите стать полноценным разработчиком, ознакомьтесь с нашей книгой Unity Games by Tutorials, в которой вы создадите 4 полноценные игры с нуля. В одной из глав даже рассказывается, как использовать JSON в качестве загрузчика уровней!

    Если у вас есть какие-либо вопросы или комментарии по этому руководству, присоединяйтесь к обсуждению ниже!

    Читайте также: