Как сохранить проект юнити на флешку
Главная » Как сохранять и загружать данные игры в Unity
Как сохранять и загружать данные игры в Unity
Узнайте, как сохранять и загружать игру в Unity с помощью PlayerPrefs, Serialization и JSON. Дополните свой пользовательский опыт знаниями о том, как сохранять и загружать данные.
Но как создать файл сохранения и что в нем должно быть? Вам также нужно использовать файл сохранения, чтобы отслеживать настройки игрока? Как насчет отправки сохранений в интернет, чтобы их можно было позже загрузить на другое устройство?
В этом уроке вы узнаете:
- Что такое сериализация и десериализация.
- Что такое PlayerPrefs и как его использовать для сохранения настроек игрока.
- Как создать файл сохранения игры и сохранить его на диск.
- Как загрузить файл сохранения игры.
- Что такое JSON и как его использовать.
Приступая к работе
Скачайте стартовый проект вверху страницы. Вы будете реализовывать код для сохранения и загрузки игры, а также логику сохранения настроек игроков.
Важные концепции сохранения
Есть четыре ключевых концепций сохранения в Unity:
PlayerPrefs: это специальная система кэширования для отслеживания простых настроек игрока между игровыми сессиями. Многие начинающие программисты ошибаются, полагая, что они могут использовать данную технологию как систему сохранения игры, но это плохая практика. Это следует использовать только для отслеживания простых вещей, таких как графика, настройки звука, данные для входа в систему или другие основные данные, связанные с пользователем.
Десериализация: это именно то, на что похоже. Это противоположность сериализации, а именно преобразование потока байтов в объект.
Player Prefs
Откройте проект, затем откройте сцену с именем Game и нажмите на кнопку воспроизведения.
Чтобы начать игру, нажмите на кнопку New Game. Чтобы воспроизвести игру, вы просто перемещаете мышь, и пистолет будет следовать за вашим движением. Нажмите левой кнопкой мыши, чтобы выстрелить и поразить цели (которые переворачиваются вверх и вниз через различные промежутки времени), чтобы получить игровой счет. Попробуйте и посмотрите, какой счет вы сможете набрать за тридцать секунд. Чтобы вызвать меню в любое время, нажмите кнопку esc на клавиатуре.
Какой бы забавной ни была эта игра, без музыки она могла бы быть немного суховата. Вы могли заметить, что есть переключатель музыки, но он был выключен. Нажмите на play, чтобы начать новую игру, но на этот раз установите переключатель Music на включенное положение, и при запуске игры вы услышите музыку. Убедитесь, что колонки компьютера включены!
Изменить настройки музыки было просто, но нажмите на кнопку воспроизведения еще раз, и вы заметите проблему: музыка больше не проверяется. Несмотря на то, что вы меняли настройки музыки ранее, это изменение не отслеживалось. Это то, в чем PlayerPrefs преуспевает.
Создайте новый скрипт с именем PlayerSettings в папке Scripts. Поскольку вы будете использовать некоторые элементы пользовательского интерфейса, добавьте следующую строку вверху файла с другими пространствами имен:
Затем добавьте следующие переменные:
Они будут отслеживать объекты Toggle и AudioSource.
Затем добавьте следующую функцию:
После настройки скрипт будет:
- Проверять, есть ли в PlayerPrefs кэшированная настройка для ключа «music». Если там нет значения, он создает пару ключ-значение для музыкального ключа со значением 1. Он также включает переключатель и включает AudioSource. Это будет запущено при первом запуске игры. Значение 1 используется, потому что вы не можете сохранить логическое значение (но вы можете использовать 0 как false и 1 как true).
- Проверять ключ «music», сохраненный в PlayerPrefs. Если значение установлено на 1, в проигрывателе была музыка, поэтому он включает музыку и устанавливает переключатель в положение «включено». В противном случае он отключает музыку и переключатель.
Теперь сохраните изменения в скрипте и вернитесь в Unity.
Добавьте скрипт PlayerSettings в игровой объект Game. Затем разверните игровой объект UI, а затем игровой объект Menu, чтобы открыть его дочерние элементы. Затем перетащите игровой объект Music в поле Toggle скрипта PlayerSettings. Затем выберите игровой объект Game и перетащите AudioSource в поле MyAudio.
Музыка настроена на работу при запуске игры (поскольку в функции Awake есть код), но вам все равно нужно добавить код, если игрок изменяет настройки во время игры. Откройте скрипт PlayerSettings и добавьте следующую функцию:
Это почти то же самое, что и код, который вы написали ранее, за исключением одного важного отличия. Он проверяет состояние переключателя музыки, а затем соответствующим образом обновляет сохраненную настройку. Чтобы этот метод был вызван и, следовательно, чтобы он мог выполнять свою работу, вам необходимо установить метод обратного вызова для игрового объекта Toggle. Выберите игровой объект Music и перетащите игровой объект Game на поле объекта в разделе OnValueChanged:
Выберите раскрывающийся список, в котором сейчас указано No Function, и выберите PlayerSettings -> ToggleMusic (). Когда кнопка переключения в меню нажата, она вызывает функцию ToggleMusic.
Теперь у вас есть все необходимое, чтобы отслеживать настройку музыки. Нажмите Play и попробуйте, включив или выключив переключатель музыки, затем завершите сеанс воспроизведения и начните новый сеанс воспроизведения.
Теперь настройки музыки сохранены правильно! Отличная работа, но возможности сериализации только начинаются.
Сохранение игры
Использовать PlayerPrefs было довольно просто, не так ли? С его помощью вы сможете легко сохранить в нем другие настройки, такие как графические настройки плеера или информацию для входа (например, токены Facebook или Twitter), а также любые другие настройки конфигурации, которые имеет смысл отслеживать для игрока. Однако PlayerPrefs не предназначен для отслеживания сохраненных игр. Для этого вы захотите использовать сериализацию.
Первым шагом к созданию файла сохранения игры является создание класса файла сохранения. Создайте скрипт с именем Save и удалите наследование MonoBehaviour . Удалите также стандартные методы Start () и Update () .
Затем добавьте следующие переменные:
Чтобы сохранить игру, вам нужно будет отслеживать, где находятся существующие роботы и к какому типу они относятся. Два списка выполняют эту задачу. Для количества попаданий и выстрелов вы просто сохраните их как целые числа.
Вам нужно добавить еще один очень важный фрагмент кода. Над объявлением класса добавьте следующую строку:
Такая запись называется атрибутом, и это метаданные для кода, которые сообщают Unity, что класс можно сериализовать, и означают, что вы можете превратить объект в поток байтов и сохранить в файл на диске.
Примечание. Атрибуты имеют широкий спектр применения и позволяют прикреплять данные к классу, методу или переменной (эти данные известны как метаданные). Вы даже можете определить свои собственные атрибуты для использования в коде. Сериализация использует атрибуты [SerializeField] и [System.Serializable] , чтобы знать, что писать при сериализации объекта. Другие варианты использования атрибутов включают настройки для модульных тестов и внедрения зависимостей, которые выходят за рамки этого урока, но их стоит изучить.
Весь скрипт сохранения save должен выглядеть так:
Затем откройте скрипт Game и добавьте следующий метод:
Этот код создает экземпляр класса Save, который вы создали ранее, а затем устанавливает значения из существующих роботов. Он также сохраняет выстрелы и попадания игроков.
Кнопка Save подключена к методу SaveGame в скрипте Game, но кода в SaveGame пока нет. Замените функцию SaveGame следующим кодом:
Рассматриваем комментарий за комментарием:
- Создать экземпляр Save со всеми данными текущего сеанса, сохраненными в нем.
- Создать BinaryFormatter и FileStream, передав путь для сохраняемого экземпляра Save. Он сериализует данные (в байты), записывает их на диск и закрывает FileStream. Теперь на вашем компьютере будет файл с именем gamesave.save. Файл .save использовался только в качестве примера, и вы могли использовать любое расширение для имени сохранения файла.
- Это просто сбрасывает игру, так что после сохранения игроком все находится в состоянии по умолчанию.
Чтобы сохранить игру, нажмите Escape в любой момент во время игры и нажмите кнопку Save. Вы должны заметить, что все сбрасывается, и в выводе консоли отображается примечание о том, что игра была сохранена.
LoadGame в скрипте Game связана с кнопкой Load. Откройте скрипт игры и найдите функцию LoadGame . Замените его следующим:
Рассмотрим код детально:
Сохранение данных с помощью JSON
Внешние скобки представляют родительский объект, который является JSON. Если вы знакомы со структурой данных Dictionary , то JSON похож. Файл JSON представляет собой сопоставление пар ключей и значений. Итак, в приведенном выше примере есть 3 пары ключ-значение. В JSON ключи всегда являются строками, но значения могут быть объектами (т.е. дочерними объектами JSON), массивами, числами или строками. Значение, установленное для ключа «message» - «hi», значение ключа «age» - число 22, а значение ключа «items» представляет собой массив с двумя строками в нем.
Сам объект JSON представлен типом String. Передав эти данные в виде строки, любой язык может легко воссоздать объект JSON из строки в качестве аргумента конструктора. Очень удобно и очень просто.
У каждого языка есть свой способ создания объекта из этого формата. Начиная с Unity 5.3 существует собственный метод для создания объекта JSON из строки JSON. Вы создадите JSON-представление рекорда игрока, а затем распечатаете его на консоли. Но вы расширяете эту логику, отправляя JSON на сервер.
В скрипте Game есть метод с именем SaveAsJSON, который подключен к кнопке SaveAsJSON. Замените SaveAsJSON следующим кодом:
Это создает экземпляр Save, как и раньше. Затем он создает строку JSON, используя метод ToJSON в классе JsonUtility. Затем он выводит результат на консоль.
Если вы хотите преобразовать этот JSON в экземпляр Save , вы должны просто использовать:
Именно так вы поступили бы, если бы захотели загрузить файл сохранения из интернета, а затем загрузить его в свою игру. Но настройка веб-сервера - это совсем другой процесс! А пока похлопайте себя по плечу, потому что вы только что выучили несколько приемов, которые . избавят вас от неприятностей в следующей игре!
Куда двигаться дальше?
Вы можете скачать итоговые файлы проекта вверху страницы.
Теперь вы получили мощный инструмент для создания отличных игр, позволяющий игрокам сохранять и загружать свои игры с помощью магии сериализации. Вы также узнали, что такое JSON и как его можно использовать для сохранения в облаке. Вы также узнали, для чего используется PlayerPrefs (настройки!) И для чего он не используется (сохранение игры).
Одна из самых важных вещей в игре – сохранение пользовательских данных: настроек и игровых результатов. Когда-то игры были короткими, и сохранять там было особенно нечего. В лучшем случае игра записывала самый высокий балл для составления рейтинга. Но технологии стремительно развивались, и геймдев не оставался в стороне.
Сейчас нам нужно хранить тонны данных, включая прогресс и статистику игрока. Эта потребность актуальна как для игр с огромным открытым миром, так и для простых линейных приключений. Зачастую требуется несколько сессий, чтобы завершить игру, значит, нужен способ сохраниться и вернуться позже к тому же моменту. Даже для простых коротких игр может быть полезно записывать какую-то информацию.
Unity предлагает сразу два способа сохранять игровые данные – попроще и посложнее:
- Попроще – встроенная система PlayerPrefs. Устанавливаете значение для ключа, нажимаете Save – и все готово.
- Посложнее – сериализация данных и запись в файл для дальнейшего использования.
У обоих методов есть преимущества и недостатки, поэтому для конкретного случая важно выбрать правильный вариант. Для демонстрации нам потребуется некоторая минимальная конфигурация. Создадим новый проект в Unity, за основу для простоты возьмем 2D-шаблон.
Создание нового проекта в Unity
Добавим два скрипта – SavePrefs и SaveSerial – для реализации двух методов.
Начнем с более простого способа – SavePrefs .
Кликните два раза по скрипту, чтобы открыть его в редакторе Visual Studio.
Для начала можно закомментировать или удалить методы Start и Update , так как они не потребуются для демонстрации сохранения данных. Затем нам понадобятся несколько переменных.
С помощью метода OnGui создадим пользовательский интерфейсдля визуального управления этими переменными.
- Две кнопки – для увеличения значений intToSave и floatToSave .
- Текстовое поле – для переменной stringToSave .
- Несколько лейблов для отображения текущих значений переменных.
- Три кнопки действий, чтобы сохранить, загрузить и сбросить данные.
Сохранение
Создадим метод SaveGame , который будет отвечать за сохранение данных:
Должно быть, вам интересно, где сейчас физически находятся эти данные. Они записываются в файл в папке проекта. В Windows его можно найти по адресу HKEY_CURRENT_USER\Software\Unity\UnityEditor\[company name]\[project name] . Именно отсюда запускается игра из редактора. В exe-файле их можно найти по адресу HKEY_CURRENT_USER\Software\[company name]\[project name] . На Mac OS согласно документации файлы PlayerPrefs находятся в папке
/Library/Preferences , в файле с названием unity.[company name].[product name].plist .
Переменные PlayerPrefs в файловой системе Windows
Загрузка
Загрузка сохраненных данных – это, по сути, сохранение наоборот. Необходимо взять значения, хранящиеся в PlayerPrefs и записать их в переменные.
Хорошей практикой является предварительная проверка наличия нужных ключей. Для этого предназначен метод HasKey . Достаточно проверить хотя бы один ключ из установленных в методе SaveGame , чтобы понимать, есть ли у пользователя сохраненные данные.
Сброс
Для удаления всех данных, хранящихся в PlayerPrefs , нужно использовать метод PlayerPrefs.DeleteAll .
В методе ResetData мы очищаем хранилище, а также обнуляем все переменные.
Теперь проверим весь этот код в деле. Сохраните файл и вернитесь в редактор Unity. Прикрепите скрипт SavePrefs к какому-нибудь объекту, например, к Main Camera .
Прикрепление скрипта SavePrefs
Теперь запустите игру и начните взаимодействовать с GUI-элементами. Изменяйте переменные, нажимая на кнопки и заполняя текстовое поле. Когда будете готовы, сохраните данные кнопкой Save Your Game . После этого остановите и перезапустите игру и нажмите на кнопку Load Your Game . Если вы всё сделали правильно, значения переменных немедленно изменятся на те, что вы сохранили в предыдущем запуске.
Чтобы очистить PlayerPrefs , кликните Reset Save Data .
Использование PlayerPrefs для сохранения данных. Скриншот работающего проекта
Недостатки
Этот способ кажется простым и эффективным. Почему бы всегда не использовать PlayerPrefs для сохранения пользовательских данных?
Из-за его невысокой безопасности. Вы точно не захотите сохранять таким способом данные, в которые не должен вмешиваться игрок: например, количество доступной игроку игровой валюты, или статистика.
Из названия понятно, что PlayerPrefs предназначен для хранения пользовательских предпочтений и других неигровых данных. Например, этот метод идеально подходит для записи настроек интерфейса: цветовой темы, размера элементов и т. п.
Другая проблема – в недостаточной гибкости. В PlayerPrefs вы можете сохранять только числа и строки, поэтому он не подходит для данных, имеющих сложную структуру.
К счастью, у нас есть еще один способ, более гибкий и безопасный.
Для демонстрации сложного способа сохранения данных в Unity откроем скрипт SaveSerial .
Снова определим переменные и создадим интерфейс для управления ими. Метод OnGUI похож на тот, что мы только что писали:
Для сериализации данных потребуется добавить несколько директив using :
Сохранение
Создадим новый сериализуемый класс SaveData , который будет содержать сохраняемые данные.
Скрипт SaveSerial
Обратите внимание, три переменные в классе SaveData соответствуют переменным из класса SaveSerial . Для сохранения мы будем передавать значения из SaveSerial в SaveData , а затем сериализовать последний.
Добавим в класс SaveSerial метод SaveGame :
Объект BinaryFormatter предназначен для сериализации и десериализации. При сериализации он отвечает за преобразование информации в поток бинарных данных (нулей и единиц).
FileStream и File нужны для создания файла с расширением .dat . Константа Application.persistentDataPath содержит путь к файлам проекта: C:\Users\[user]\AppData\LocalLow\[company name] .
Загрузка
Метод LoadGame – это, как и раньше, SaveGame наоборот:
Сброс
Наконец, реализуем метод для сброса сохранения. Он похож на тот ResetData , который мы написали для очистки PlayerPrefs , но включает в себя пару дополнительных шагов.
Скрипт метода сериализации готов, теперь его можно проверить в деле. Сохраните код, вернитесь в Unity и запустите игру. Привяжите скрипт SaveSerial к объекту Main Camera (не забудьте деактивировать предыдущий).
Деактивация скрипта Save Prefs
После запуска вы увидите тот же самый интерфейс, что и раньше. Попробуйте изменить переменные и сохранить игру.
В этот раз файл будет сохранен по "постоянному пути данных" игры. В Windows это C:\Users\username\AppData\LocalLow\project name , в Mac –
/Library/Application Support/companyname/productname согласно документации.
Перезапустите игру и загрузите данные, нажав на кнопку Load Your Game . Значения переменных должны измениться на те, что вы сохранили ранее.
Также вы можете удалить все сохраненные данные кнопкой Reset Save Data .
Использование сериализации для сохранения данных. Скриншот работающего проекта
Сохранение данных – важная часть большинства игр, за исключением лишь некоторых специфических исключений (например, игры с очень короткими игровыми сессиями или механикой перманентной смерти, в которой после каждого проигрыша вся игра сбрасывается к началу).
Помните о том, что PlayerPrefs – это простой способ сохранить настройки и предпочтения пользователя, но его не следует использовать для записи важных игровых данных.
Сериализация и запись в файл – более сложный путь, но он дает вам бóльшую гибкость и безопасность.
Какие именно данные сохранять и каким способом – зависит от особенностей проекта.
как я упаковываю заказы для своего малого бизнеса ✨
Я хочу скопировать свой существующий проект Unity в новый пустой проект Unity. Похоже, что все ссылки на объекты и многие сценарии неправильно настроены / присутствуют в Иерархии в моих сценах.
Я только скопировал папку с ресурсами / package.json в новый проект Unity, потому что остальные файлы грязные и кэшировали много бесполезной информации.
Где находятся файлы с подробным описанием сцен? Я хочу скопировать это, чтобы я мог запускать свои сцены со всеми ссылками на объекты и сценариями, установленными на правильные игровые объекты.
Убираться
В общем, вам всегда понадобится Assets и ProjectSettings папка.
Все остальное вы можете удалить, и Unity воссоздаст / перекомпилирует их, когда вы снова откроете проект.
Также см. За кулисами
При резервном копировании проекта или добавлении проекта в репозиторий контроля версий вы должны включить основную папку проекта Unity, содержащую как Активы а также ProjectSettings папки. Вся информация в этих папках имеет решающее значение для работы Unity..
Как говорят имена
- Assets все ваши активы, такие как сценарии, изображения, сборные конструкции и т. д., включая сцены.
- ProjectSettings все общие настройки вашего проекта, касающиеся таких вещей, как качество, физика, струны плеера и т. д.
Для меня также некоторые из Library/*.asset файлы имеет смысл хранить .. они хранят, например, настройки сборки, целевой платформы и т. д., поэтому мне не нужно настраивать их / переключать платформу с нуля каждый раз, когда я "перезагружаюсь". Конечно, вам решать, хотите ли вы это сделать.
Вы также можете использовать любую другую систему контроля версий . или, конечно, также удалить соответствующие папки и файлы вручную, но я всегда использую GIT для моих проектов.
Также обратитесь к разделу Использование внешних систем управления версиями с Unity для получения общей информации о настройке для управления версиями вашего проекта (ов).
Поэтому, когда я хочу очистить репозиторий перед копированием, я обычно использую следующее как *.gitignore (есть и более полные версии, например, с Github).
Все, что здесь перечислено, можно практически удалить и будет повторно скомпилировано при следующем открытии проекта в Unity. (Строки, начинающиеся с ! - это исключения, которые я добавил, потому что, как я сказал, имеет смысл сохранить и их.)
Если это еще не сделано, сначала инициализируйте запущенный репозиторий.
это покажет некоторые предупреждения для каждого файла, который указан в .gitignore но вы можете игнорировать эти предупреждения. Он только говорит что-то подобное, например
Вы пытаетесь добавить игнорируемый файл в коммит, и он будет пропущен
сделать вашу первую фиксацию.
Теперь, наконец, ты можешь бежать
который удаляет все файлы, не отслеживается (поэтому убедитесь, что у вас всегда есть все файлы, хотеть держать хотя бы постановочный ( git add ) или лучше было бы совершено первым) или будет проигнорирован *.gitignore .
-f
Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean откажется удалять файлы или каталоги, если не задано -f, -n или -i. Git откажется удалять каталоги с подкаталогом или файлом .git, если не указан второй -f.-d
удалять неотслеживаемый каталоги в дополнение к неотслеживаемый файлы. Если неотслеживаемый каталог управляется другим репозиторием Git, он не удаляется по умолчанию. Дважды используйте параметр -f, если вы действительно хотите удалить такой каталог.-Икс
Не используйте стандартные правила игнорирования, считываемые из .gitignore (для каждого каталога) и $ GIT_DIR / info / exclude, но по-прежнему используйте правила игнорирования, указанные с параметрами -e. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это можно использовать (возможно, в сочетании с git reset) для создания нетронутого рабочего каталога для тестирования чистой сборки.
Миграция с помощью UnityPackage
Другой вариант перемещения сцен или частей активов между двумя разными проектами - использование пакета UnityPackage.
Из вашего текущего проекта экспортируйте UnityPackage
Выдержки из Документов:
альтернативно шагать 2 вы также можете Щелкните правой кнопкой мыши на Assets папка в Project View и найти Экспортный пакет в контекстном меню.
а затем в новом проекте Импортируйте UnityPackage
В качестве альтернативы шагу 2 а также 4 вы даже можете просто перетащить unitypackage файл в Assets папку через редактор Unity.
- 1 В дополнение к этому исчерпывающему ответу, когда что-то отсоединяется, это признак того, что вам удалось потерять скрытые файлы .meta, и Unity присвоила всем новые свежие идентификаторы. Если вы убедитесь, что вы копируете активы, включая метафайлы, и перемещаете версию вверх (это смешанный мешок при спуске версии), все должно быть связано
Мне пришлось внести некоторые изменения, чтобы он работал на Unity 19.4:
По сути, я не игнорировал всю папку библиотеки и игнорировал только следующее:
Вот процедура, которой вы должны следовать:
- Сделайте резервную копию вашего проекта на всякий случай.
- Поместите прилагаемый файл .gitignore в корневой каталог вашего проекта.
- Выполните следующие команды:
* Обратите внимание, что опция -X написана с заглавной буквы в команде git clean, это позволяет избежать удаления любой пустой и неотслеживаемой папки.
Чтобы убедиться, что все в порядке:
- Загрузите свой проект Unity и убедитесь, что все по-прежнему работает правильно
- Еще раз запустите git clean -Xfd, чтобы очистить файлы проекта, перестроенные Unity.
Опять же, спасибо derHugo за подробный ответ, который был использован для работы над последними выпусками Unity.
В этом уроке вы узнаете, как сохранять и загружать игру в Unity, используя PlayerPrefs, Serialization и JSON.
Но как создать файл сохранения и что в нем должно быть? Нужно ли при этом использовать файл сохранения, чтобы отслеживать настройки плеера? Или может лучше использовать облачное хранилище для сохранений, чтобы в случае необходимости их можно было позже загрузить на другое устройство?
В этом уроке вы узнаете:
- Что такое сериализация и десериализация.
- Что такое PlayerPrefs и как его использовать для сохранения настроек игрока.
- Как создать файл сохранения игры и сохранить его на диск.
- Как загрузить файл сохраненной игры.
- Что такое JSON и как вы можете его использовать.
Примечание: Если вы новичок в Unity или хотите приобрести больше навыков, то вам следует ознакомиться с другими учебниками по Unity, где вы можете узнать много интересной и полезной информации.
Введение
Загрузите стартовый проект здесь. Вы будете использовать специальный код для сохранения и загрузки игры, а также изучите логику сохранения настроек игроков.
Важные концепции сохранения
Существует четыре ключевых понятия которыми можно охарактеризовать процесс сохранения в Unity:
PlayerPrefs: это специальная система кеширования для отслеживания простых настроек игрока между игровыми сессиями. Многие начинающие программисты ошибаются, думая, что они могут использовать этот инструмент в качестве системы сохранения игр. Его следует использовать только для отслеживания простых вещей, таких как графика, настройки звука, информация для входа в систему или другие основные данные, относящиеся к пользователю.
Десериализация: Это процесс, противоположный сериализации, а именно преобразование потока байтов в объект.
Player Prefs
Откройте проект, который вы скачали, запустите сцену с именем Game и затем нажмите play.
Чтобы начать игру, нажмите кнопку «New Game». В этой игре вам необходимо использовать мышку для перемещения. Нажмите левую кнопку мыши, чтобы выстрелить и поразить цели (которые перемещаются вверх и вниз через различные промежутки времени), получать очки за каждое удачное попадание. Попробуйте и посмотрите, сколько очков вы сможете получить за 30 секунд. Чтобы вызвать меню в любое время, нажмите клавишу escape.
Эта игра довольна забавная и даже увлекательная, но без музыкального сопровождения немного скучновата. Возможно, вы заметили, что есть музыкальный переключатель, но он был выключен. Нажмите «Play», чтобы начать новую игру, но на этот раз нажмите «Music» и установите значение «On», чтобы вы могли услышать музыку, когда начнете игру. Убедитесь, что ваши колонки или наушники подключены!
Для начала создайте новый скрипт с именем PlayerSettings в папке Scripts. Поскольку вы будете использовать некоторые элементы пользовательского интерфейса, добавьте следующую строку вверху:
Именно они будут отслеживать объекты Toggle и AudioSource.
Далее добавьте следующую функцию:
Эти настройки означают:
- Осуществляется проверка, есть ли в PlayerPrefs кэшированная настройка для кнопки «music». Если там нет никакого значения, то создается несколько ключ-значений для кнопки звука со значением 1. Кроме того, тут происходит включение и выключение переключателя AudioSource. Эти настройки будут использованы при первом запуске игры. Значение 1 используется, потому что вы не можете сохранить какое-то определенное логическое значение (но вы можете использовать 0 как false и 1 как true).
- Тут идет проверка ключа «music», сохраненного в PlayerPrefs. Если значение установлено на 1, значит на проигрывателе была включена музыка, поэтому активируется режим воспроизведения звуков и соответствующий переключатель. В противоположном случае музыку наоборот выключается, а тумблер переходит в отметку OFF.
Теперь сохраните изменения в вашем скрипте и вернитесь в Unity.
Добавьте скрипт PlayerSettings в GameObject и разверните пользовательский интерфейс GameObject. Далее вам нужно открыть меню GameObject, чтобы увидеть его дочерние элементы. Перетащите объект Music GameObject в поле Toggle сценария PlayerSettings, выберите GameObject Game и перетащите AudioSource в поле MyAudio.
Музыка настроена на работу во время игры (так как в функции «Awake» есть код), но вам все равно нужно добавить еще один код, если игрок меняет настройки во время игры. Для этого снова откройте скрипт PlayerSettings и добавьте следующую функцию:
Эти настройки означают почти то же самое, что и код, который вы написали ранее, за исключением того, что в этом случае есть одно важное отличие. Этот код сначала проверяет состояние переключателя музыки, а затем соответствующим образом обновляет сохраненную настройку. Для того, чтобы этот метод был вызван и, следовательно, чтобы он мог выполнять свою функцию, вам нужно установить метод обратного вызова в Toggle GameObject. Выберите MusicObject Music и перетащите GameObject Game поверх поля объекта в разделе OnValueChanged:
Теперь к раскрывающемуся списку, в котором в данный момент написано «No Function», и выберите PlayerSettings ⇒ ToggleMusic (). Таким образом, когда во время игры пользователь активирует кнопку переключения в меню, появится функция ToggleMusic.
Теперь у вас есть все необходимые настройки, которые нужны чтобы отслеживать опции звуков. Нажмите «Play» и попробуйте изменить настройки музыки, включив или выключив соответствующий переключатель в меню.
Сохранение игры
Согласитесь, возможности и настройка PlayerPrefs не вызывает больших затруднений в использовании. С его помощью вы сможете легко сохранять другие данные, такие как графические настройки проигрывателя или информацию для входа в систему (например, токены Facebook или Twitter), и любые другие параметры конфигурации, которые нужно отслеживать для проигрывателя. Однако PlayerPrefs не предназначен для отслеживания сохранений в игре. Для этого нужно использовать сериализацию.
Первым шагом к созданию файла сохранения игры является создание класса файла сохранения. Создайте новый скрипт с именем Save и удалите пункты MonoBehaviour, Start () и Update ().
Теперь вам необходимо добавить следующие переменные:
Чтобы сохранить игру, вам нужно отслеживать, где находятся существующие роботы и какого они типа. За это должны отвечать два списка с целыми данными о количестве попаданий и числе выстрелов.
Есть еще один очень важный фрагмент кода, который вам также нужно добавить:
Этот код дает команду Unity, что данный класс можно сериализовать, а это означает, что вы можете превратить его в поток байтов и сохранить как файл на диске.
Примечание: все эти атрибуты имеют широкий спектр применения и позволяют привязывать данные к классу, методу или определенной переменной. Вы даже можете определить свои собственные атрибуты для использования в вашем коде. Сериализация использует атрибуты [SerializeField] и [System.Serializable], которые определяют, что происходит при сериализации объекта.
Ваш скрипт Save должен выглядеть следующим образом:
Теперь откройте скрипт Game и добавьте еще один метод:
Этот код создаст новый экземпляр класса Save, который вы делали ранее, а затем установит значения исходя из количества существующих роботов. Кроме того, произойдет сохранение количества выстрелов игрока и попаданий.
Кнопка «Save» была подключена к методу SaveGame в скрипте Game, но в SaveGame все еще нет кода. Замените функцию SaveGame следующим кодом:
Рассмотрим все по пунктам:
- Создается экземпляр Save со всеми данными текущего сеанса, сохраненными в нем.
- Создается BinaryFormatter и FileStream, передав путь для сохранения экземпляру Save. Тут же происходит процесс сериализации данных в байты, с последующим их сохранением на диск и закрытием FileStream. Теперь на вашем компьютере будет файл с именем save. Вы можете использовать любое расширение для имени файла сохранения.
- Идет сброс настроек игры в состояние по умолчанию.
LoadGame в скрипте Game подключен к кнопке Load. Откройте скрипт Game, найдите функцию LoadGame и замените ее следующим значением:
Рассмотрим процесс более подробно:
Сохранение данных с помощью JSON
Сам объект JSON представлен типом String. Передав эти данные в виде строки, любой язык может легко воссоздать объект JSON из строки в качестве аргумента конструктора. Это действительно очень удобно и очень просто. У каждого языка есть свой способ создания объекта из этого формата. Начиная с Unity 5.3, существует собственный метод для создания объекта JSON из строки JSON.
В скрипте Game есть метод SaveAsJSON, который подключен к кнопке Save As JSON. Вам нужно заменить следующим кодом:
Это создает экземпляр Save и строку JSON с использованием метода ToJSON в классе JsonUtility.
Запустите игру и попробуйте уничтожить несколько целей, чтобы набрать очки. Теперь нажмите Escape, чтобы вызвать меню и используйте кнопку Save As JSON, чтобы увидеть созданную вами строку JSON:
Если вы захотите преобразовать этот JSON в экземпляр Save, то вам нужно будет использовать строку:
Таким образом вы сможете загрузить файл сохранения из Интернета, а затем добавить его в свою игру.
Что делать дальше?
Вы можете скачать законченный проект тут.
Вы узнали, как использовать довольно мощный инструмент для создания качественных игр, позволяя игрокам сохранять и загружать свои игры с помощью возможностей сериализации. Вы также узнали, что такое JSON и как его использовать для реализации облачного сохранения.
Если вы хотите узнать больше о возможностях Unity, то вам следует обратиться к другим урокам, посвященным этому движку. Если вы уверенно владеете Unity и хотите стать настоящим разработчиком, то советуем вам прочитать книгу Unity Games by Tutorials, с помощью которой вы сможете сделать 4 полноценных игры с нуля.
Читайте также: