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

Добавил пользователь Alex
Обновлено: 10.09.2024

Как сделать многоуровневую игру в Unity? Или игру, в которой игрок может перемещаться (телепортировать) между локациями?

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

Шаг 1. Создать сцены для каждого уровня и пр. составляющих игры. Продумать понятную и гибкую систему идентификации файлов сцен

Например, сцены могут иметь следующие имена:

  • StartScene – стартовая сцена игры. Это может быть сцена, в которой игрок знакомится с правилами игры, может изменить некоторые начальные настройки, выбрать персонажа и т.д.
  • Layer1,Layer2,Layer3, … — сцены, соответствующие 1-му, 2-му, 3-му и т.д. уровням игры.
  • EndGame – конечная сцена, которая загружается в финале игры.

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

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

а) игрок набрал определённое количество баллов. Это условие имеет смысл проверять каждый кадр в методе Update();

б) игрок добрался до определенного места в игре. Например, пришёл к заданной двери. Соответственно на объекте двери необходимо поставить коллайдер, и при входе в этот коллайдер должна будет выполняться загрузка сцены;

Family Island - меню выбора островов для путешествий и приключений

Family Island — меню выбора островов для путешествий и приключений

Когда речь идёт не столько об уровнях игры, сколько о разных локациях, между которыми игрок имеет возможность перемещаться. Пример такой игры – Family Island – там игрок может путешествовать на различные острова.

Candy Crush Saga — карта игры с выбором уровней

Второй вариант геймплея с аналогичным функционалом – наличие в реализации отдельной сцены с картой игры. Кликая по определённым зонам-кнопкам этой игры, игрок загружает соответствующий уровень (при условии, что этот уровень для него открыт). Наиболее популярный пример такой игры – Candy Crush Saga и ей подобные.

Шаг 3. Написание функции (метода) загрузки соответствующей сцены.

Для загрузки сцен в движке Unity предусмотрен метод LoadScene (…) из класса SceneManager пространства имён UnityEngine.SceneManagement.

Это значит, что в классе (скрипте), в котором будет выполняться загрузка сцены с помощью указанного метода, должна быть прописана директива:

Далее, при вызове метода следует указывать и имя класса:

У данного метода есть несколько перегрузок (вариантов вызова с различными наборами параметров), подробнее о которых можно почитать в официальной документации Unity.

Наиболее простые способы вызова метода следующие.

Вариант 1 – с явным указанием имени загружаемой сцены в качестве параметра. Например:

Вариант 2 – с указанием индекса загружаемой сцены в качестве параметра. Например:

Индекс – это число-порядковый номер сцены, который автоматически присваивается в окне настроек Build Settings:

Окно настроек Build Settings Unity

Окно настроек Build Settings

Один из возможных вариантов скрипта следующий:

Этот скрипт должен быть на объектах-дверях или телепортах. На них же должен стоять коллайдер-триггер.

Шаг 4. Заполнить раздел Scenes In Build в окне настроек Build Settings, внеся туда все сцены, которые необходимо будет загружать

Пример этого окна представлен выше. Чтобы его вызвать, используется главное меню, пункты File -> Build Settings...


Меню File -> Build Settings… Unity


В этом уроке вы узнаете, как сохранять и загружать игру в Unity, используя PlayerPrefs, Serialization и JSON.

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

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

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

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

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

Введение

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

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

Существует четыре ключевых понятия которыми можно охарактеризовать процесс сохранения в Unity:

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

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


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

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

Player Prefs

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

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




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

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

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

Эти настройки означают:

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

Добавьте скрипт PlayerSettings в GameObject и разверните пользовательский интерфейс GameObject. Далее вам нужно открыть меню GameObject, чтобы увидеть его дочерние элементы. Перетащите объект Music GameObject в поле Toggle сценария PlayerSettings, выберите GameObject Game и перетащите AudioSource в поле MyAudio.


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




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

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

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

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

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

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

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

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

Ваш скрипт Save должен выглядеть следующим образом:

Теперь откройте скрипт Game и добавьте еще один метод:

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

Рассмотрим все по пунктам:

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


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 полноценных игры с нуля.

Описанный ниже подход работает на любой платформе, поддерживаемой Unity, кроме Web Player. Для получения информации о сохранении игровых данных в веб-плеере, взгляните на официальную документацию.

Подготовка к сериализации

Мы будем ссылаться на этот сценарий из других скриптов, а потому сделаем класс статичным, добавив ключевое слово static между public и class. Также не забудем удалить два автоматически созданных метода, поскольку нам не потребуется крепить скрипт ни к какому игровому объекту.

Полученный сценарий должен выглядеть вот так:

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

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

Отлично, теперь мы готовы к сериализации данных!

Создание класса, с возможностью сериализации

Игры, похожие на Final Fantasy (то есть многие RPG), предлагают игроку выбрать класс персонажа. Например, рыцарь, разбойник или маг. Создайте новый скрипт, назовите его Game и объявите в нем переменные:

Обратите внимание на строчку [System.Serializable] , которая говорит движку, что этот скрипт может быть сериализован. Круто, не так ли? Как говорит официальная документация, Unity умеет сериализовать следующие типы данных:

  • Все базовые типы (int, string, float, bool и т.д.).
  • Некоторые встроенные типы (Vector2, Vector3, Vector4, Quaternion, Matrix4x4, Color, Rect и LayerMask).
  • Все классы, унаследованные от UnityEngine.Object (GameObject, Component, MonoBehavior, Texture2D и AnimationClip).
  • Перечисляемый тип (Enums).
  • Массивы и списки типов данных, перечисленных выше.

Обратите внимание на класс Character. Его еще у нас нет — давайте создадим новый скрипт с таким названием:

Ничего странного не заметили? Да, мы действительно создали новый класс, внутри которого есть ровно одна строковая переменная. Мы, конечно же, могли использовать в скрипте Game переменные типа string вместо экземпляров класса Character. Но целью нашей статьи является не то, как сделать лучше, а рассказать, как можно решить нашу проблему.

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

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

А теперь напишем статическую функцию сохранения игры:

Разберемся с тем, что же выполняет эта функция. Сначала мы добавляем в ранее созданный список текующую игру. Так как в скрипте Game мы использовали статическую переменную current, то мы можем достаточно просто обратиться к ней: Game.current. После этого нам следует сериализовать список, для чего и создается экземпляр класса BinaryFormatter.

Далее при помощи класса FileStream мы создаем новый файл под названием savedGames.gd в специальной директории, в которой и должны храниться все игровые данные. Для названия файла сохранений будем использовать savedGames, а расширением будет gd (от словосочетания game data).

Примечание автора В качестве расширения файла вы можете использовать все, что угодно. Так, например, в играх The Elder Scrolls используется .esm.

Далее вызывается метод Serialize экземпляра класса BinaryFormatter, который и сохраняет в файл сериализованные данные. И на этом все — файл закрывается. Наша игра сохранена!

Загрузка игры

А здесь все довольно просто. Так как при сохранении игры мы создали файл и записали в него сериализованный список, то сейчас нам придется открыть его и десериализовать имеющиеся в нем данные:

Алгоритм предельно прост. Для начала мы проверяем, существует ли файл сохранений. Если существует, то мы создаем новый экземпляр класса BinaryFormatter, открываем файл savedGames.gd и записываем в список savedGames десериализованные данные, считанные из файла.

Обратите внимание на 5 строчку. Метод Deserialize вернет нам битовую последовательность и, присвоив списку savedGames то, что возвращает функция Deserialize, мы ни к чему хорошему не придем. И поэтому нам следует полученную битовую последовательность преобразовать (привести) к типу List .

Примечание автора Тип данных, к которому вы приводите десериализованные данные, может быть совершенно разным. Например: Player.lives = (int)bf.Deserialize(file); .

Вывод

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

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

В этом видео я расскажу о таком методе сохранения данных как PlayerPrefs в Unity. Так-же расскажу о таких свойствах .

Привет! В этом видео мы продолжим создавать игру на Android на движке Unity. Я покажу тебе как сделать систему .

Привет! В этом видео мы продолжаем создавать 3D Раннер на Unity. Сегодня мы добавим возможность подсчёта очков, .

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

Рассматриваем 3 варианта сохранения в юнити. Разбираем 3 варианта сохранения - PlayerPrefs, JSON, Binary .

Задать вопрос можно в телеграмм сообществе - t.me/unity_community Создание игры Space Shooter на Unity 3d.

Система сохранения с помощью PlayerPrefs больше подходит для не больших игр в Unity, далее мы будем рассматривать .

Продолжаем создание космического шутера на Unity. В этом видео добавим подсчет очков за уничтоженных врагов.

В данном видео-уроке мы создадим счетчик монет, т.е. научим нашего персонажа собирать монетки на сцене. И в конце .

Сегодня мы узнаем, как сохранить и загрузить игровые данные в Unity 3D при помощи метода PlayerPrefs, а также .

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

Всем привет! Я - Артем - разработчик в среде Unity3d. И я хотел бы поделиться своими знаниями с вами! В этом уроке я .

var score = 0; function OnTriggerEnter( other : Collider ) < Debug.Log("OnTriggerEnter() was called"); if (other.tag "coin") .

Было супер много вопросов по базе данных, да и в целом по всем фичам которые я назвал в прошлом ролике. Я решил .

Сегодня я расскажу как сохранять переменные в Unity через Player Prefs и JSON. Это очень просто! Оказывается) Если .

В этом видео я покажу как реализовать лучший счет / high score в Unity. Сделаю я это при помощи PlayerPrefs.

Как сделать сохранение игры в файл в Unity? Как сохранять Vector3 или Quaternion? Как сделать сохранение в файл на .

Сбор и сохранение монет Unity. Как сделать сбор монеток Unity. Я покажу как сделать подбор монет, сохранение монет и .

В этом видео я рассказываю как сделать библиотеку по сохранению и загрузки данных на С . Я рассказываю как .

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

Добавляем мотнетки и их подбор с счётом очков. About me Всем привет, с вами Meriler. Мне очень нравятся игры и их .

Unity 3D tutorial : saving and loading data/score in unity 5 using playerprefab. This is one of the way to save and load data in unity .

В этом ролике я подробно, коротко и ясно расскажу как сделать монеты (деньги, баллы или очки), расскажу как сделать .

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