Как сделать сохранение в игре

Добавил пользователь Евгений Кузнецов
Обновлено: 19.09.2024

Как сохранять и загружать данные игры в Unity

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

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

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

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

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

Приступая к работе

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

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

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

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

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

Схема использования сериализации в Unity

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

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

Player Prefs

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

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

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

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

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

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

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

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

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

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

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

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

Настройка параметров скрипта PlayerSettings в окне Inspector редактора Unity

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

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

Установка функции-обработчика для кнопки переключения в окне Inspector редактора Unity

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

Выбор метода для обработки события нажатия кнопки в окне Inspector редактора Unity

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рассматриваем комментарий за комментарием:

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

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

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

Рассмотрим код детально:

Сохранение данных с помощью JSON

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

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

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

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

Вывод данных сохранения в консоль редактора Unity

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

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

Куда двигаться дальше?

Вы можете скачать итоговые файлы проекта вверху страницы.

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

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

Эта облачная синхронизация имеет и другие преимущества. Вы можете запустить игру на одной консоли или ПК и продолжить играть в нее на другом устройстве, сохраняя свой прогресс на всем пути без необходимости пересылать данные назад и вперед на USB-накопителях.

, Если вы хотите вернуться к игре через несколько лет — или если выйдет новая игра, в которой используются старые игровые сейфы, как в играх Mass Effect — ваши игровые сейфы будут сохранены и ждут вас в Интернете.

Настройка облачных хранилищ на консолях

Большая часть этой статьи будет посвящена сохранению игр для ПК, потому что геймеры на ПК обладают гораздо большей гибкостью. Однако пользователи Xbox 360 и PlayStation 3 также могут хранить свои сохраненные игры в облаке. Разница в том, что есть только один способ сделать это на каждой консоли. Для этого вам понадобится учетная запись Xbox LIVE Gold или PlayStation Plus.

Wii U от Nintendo не поддерживает облачную синхронизацию для сохранения игр. Оба Xbox One

и PlayStation 4

5 способов, которыми геймеры могут сохранить прогресс игры в облаке xbox one

будет предлагать такие функции, и мы надеемся, что они будут интегрированы еще более плавно.

Играть в игру со встроенной синхронизацией

Многие игры синхронизируют свои собственные данные сохранения в облаке, особенно последние. Сервис Steam от Valve предлагает функцию Steam Cloud, которую используют многие игры. Steam Cloud позволяет играм синхронизировать сохраненные файлы и сохранять их в Интернете с вашей учетной записью Steam. В отличие от консолей, вам не нужно платить за подписку, чтобы использовать эту функцию.

В Steam вы можете проверить наличие игр, поддерживающих Steam Cloud, выполнив поиск в виде списка или выяснив, рекламирует ли их страница в Steam Store функцию сохранения в облаке.

5 способов, которыми геймеры могут сохранить прогресс игры в облаке, посмотреть, какие игры поддерживают Steam Cloud6

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

Связать папки для сохранения игр с облачным хранилищем

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

Чтобы обойти это, вы можете попытаться создать специальную символическую ссылку на Dropbox, Google Drive или SkyDrive.

папка. (Обратите внимание, что этот трюк не работает, если вы используете SkyDrive в Windows 8.1). Установите ссылку на папку сохранения игры в папке облачного хранилища, и служба будет обманом синхронизирована с папкой сохранения игры. Вы можете настроить символические ссылки на нескольких компьютерах одинаково — ваши файлы сохранения будут синхронизироваться между ними.

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

5 способов, которыми геймеры могут сохранить прогресс игры в облаке.

Даже команда mklink включена в Windows. Но использование GameSave Manager будет самым простым вариантом — он знает, где многие игры сохраняют свои файлы, и синхронизирует Функция ссылки позволит вам легко это настроить.

Синхронизируйте вашу игру Сохранить папку напрямую

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

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

SugarSync-Select-папка

Резервное копирование Сохранить файлы автоматически

Вместо того, чтобы синхронизировать любые изменения немедленно, вы можете просто делать регулярные резервные копии. Например, вы можете использовать GameSave Manager для настройки резервного копирования по расписанию. GameSave Manager будет работать в указанное вами время, создавая резервные копии файлов сохранения выбранных вами игр и размещая их в любом месте. Вы можете выбрать, чтобы GameSave Manager помещал файлы резервных копий в папку облачного хранилища, и выбранная вами служба синхронизировала бы их нормально.

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

Есть ли у вас какие-то другие приемы для сохранения сохраненных игр в облаке? Оставьте комментарий и поделитесь им!

Изображение предоставлено: Хория Варлан на Flickr, Сейи Огуниеми на Flickr

Не знаете как установить только что скаченное сохранение? Тогда эта инструкция специально для вас!

Рассматривать установку сейвов мы будем на примере игры Resident Evil: Revelations


Шаг 2. Ставим галочку на "Сохранить файл" и жмем "Ок".


Шаг 3. Выбираем место, куда сохранится наш сейв.
Я выбрал папку Gamesave, которая лежит на Рабочем столе.


Шаг 4. После того как файл скачался нажимаем по скаченному файлу правой кнопкой мыши, и распаковываем его.


Шаг 5. Должно получиться как на скриншоте ниже.


Шаг 6. Заходим в папку Resident Evil Revelations\storage и копируем файл DATA0.DAT.


Шаг 7. Теперь на странице, где вы скачивали сейв смотрим куда нужно скопировать этот файл.
В моем случае это C:\Users\%user-name%\AppData\Local\FLT\Steam\222480\remote
Users - на русском эта папка называется "Пользователи".
%user-name% - это имя пользователя. В моем случае это BigSmoke.


Шаг 8. Заходим в C:\Пользователи\BigSmoke\AppData\Local\FLT\Steam\222480\remote
и обязательно делаем резервную копию ваших сейвов, если они есть!

Шаг 9. Вставляем скопированный файл.
У кого-то папка "Users" может называться "Пользователи".
Если у вас нету папки AppData - смотрите здесь как сделать так, чтобы она появилась.


Шаг 9. Если у вас уже были сейвы, то windows спросит "Хотите ли вы перезаписать файл?" Отвечайте "Да".

Все, вы установили сохранение!

Покупаю только те, в которые без лицензии особо не поиграешь (например, GTA 5 Online, Battlefield, COD и т.д.)

Покупаю только самые лучшие, несмотря на то, что можно поиграть и в пиратку (например, Ведьмак 3, CS 1.6 и т.д.)


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

Информация в статье актуальна только для персональных компьютеров под управлением ОС Windows, начиная с Vista и старше.

Вашему вниманию основной каталог, с которым надо работать

Вашему вниманию основной каталог, с которым надо работать Вашему вниманию основной каталог, с которым надо работать

Найти папку My Games тоже довольно просто

Найти папку My Games тоже довольно просто Найти папку My Games тоже довольно просто

Мало кто вообще знает о существовании такой папки. Однако если пройти по адресу C:Users%Имя Пользователя%Saved Games, то можно обнаружить сохранения от Crysis 2, Crysis 3, RAGE, Wolfenstein: The New Order, Wolfenstein: The Old Blood, Risen 3: Titan Lords, Command & Conquer 3 и другие.

Та самая папка

Та самая папка Та самая папка

Папка Roaming

    ;
    и Battle for Middle-Earth 2, и все аддоны;
  • все игры серии Total War, включая Total War: Shogun 2, Total War: Rome 2, Total War: Attila в подпапке The Creative Assembly;
  • профили некоторых игр Ubisoft — серия Assassin's Creed, серия Anno, серия Tom Clancy's;
    в подпапке с именем Colossal Order;
  • и некоторые другие.

Папка Program Data и LocalLow

Во втором случае нужна папка, расположенная по адресу C:Users%ИмяПользователя%AppDataLocalLow. Тут можно найти сохранения Warhammer 40,000: Regicide (в папке Hammerfall Publishing), а также сохранения инди-проектов, например, Armikrog (в папке PencilTestStudios).

Где инди-игры хранят сохранения?

Где старые игры хранят сохранения?

Где игры Origin хранят сохранения?

Где игры Uplay хранят сохранения?

Увы, но игры от Blizzard не хранят каких-либо существенных данных игрока на его персональном компьютере, все лежит на серверах компании.

Где игры Steam хранят сохранения?

Немного внимательности и все готово

Немного внимательности и все готово Немного внимательности и все готово

Теперь поговорим о пиратских играх

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

Игры от Blizzard, как уже выше упоминалось, стали сплошь сетевыми, так что пиратитить по факту нечего.

А вот с пиратскими Steam-играми придется повозиться, поскольку сохранения, как выше уже упоминалось, имеют цифровой код.

Тут можно найти любую игру, у которой есть цифровой код

Тут можно найти любую игру, у которой есть цифровой код Тут можно найти любую игру, у которой есть цифровой код

Ищите сохранения для игры? Обратитесь в наш FAQ с вопросом и наши пользователи вам оперативно ответят!

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