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

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

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

Unity дает возможность делать игры большому кругу людей заинтересованных в этом. Главной особенностью является то, что вам не нужны годы работы программистом или художником, чтобы начать делать небольшие и интересные игры. Существует несколько основных концепций рабочего процесса в Unity, которые необходимо понять. Однажды выучив и поняв их, вы будете делать игры в кратчайшие сроки. А то время что вы будете экономить – можно потратить на оттачивание и балансировку игры. Первые две концепции о которых я расскажу – это концепция сцены и игрового объекта.

Сцены.

Сцены содержат в себе меню и игровое окружение вашей игры. Они состоят из игровых объектов, о которых мы поговорим ниже. Думайте о каждой новой сцене как о новом уровне в своей игре. В каждой сцене вы размещаете окружение, украшения, препятствия, меню и прочее-прочее, по сути собирая свою игру по кусочкам (уровням).

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

Для того чтобы сохранить сцену необходимо либо в контекстном меню выбрать File/Save Scene , либо сочетанием клавиш Ctrl+S (Windows) и Cmd+S (Mac). Unity сохраняет ваши сцены как ассеты в папке Assets по умолчанию, но я рекомендую сделать внутри папки Assets отдельную папку для сцен и хранить их там. Это также значит, что ваши сцены вы можете увидеть в окне проекта, как и любой другой ресурс игры.

Открыть сцену можно двойным нажатием левой кнопки мыши в окне проекта по ранее сохраненному файлу сцены. Если при этом вы забыли сохранить текущую сцену – Unity спросит вас стоит ли это сделать перед ее закрытием.

Игровые объекты.

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

Чтобы наш игровой объект стал деревом, светом или врагом – необходимо придать ему свойства. Свойства мы придаем компонентами (в прошлой статье я уже касался этой темы и объяснял, что такое компонент в Unity). В зависимости от того, какой игровой объект вы хотите создать, вы добавляете необходимые для этого компоненты. Можно также представить игровой объект как пустую кастрюлю, а компоненты ингредиентами, составляющими рецепт вашей игры. Unity имеет большое количество готовых компонентов, а также есть возможность создавать свои с помощью написания пользовательских скриптов (это очень обширная тема которую я еще затрону в будущих статьях).

При создании игрового объекта на него автоматически вешается компонент Transform , это единственный компонент, который невозможно удалить с игрового объекта так как он представляет его в пространстве сцены. Любой другой компонент можно удалить или добавить на игровой объект по своему желанию.

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

Чтобы изменять параметры компонента, нужно выбрать необходимое поле в окне инспектора и ввести туда необходимые данные (например, для компонента Transform мы можем ввести координаты расположения игрового объекта). Также через контекстное меню мы можем копировать компоненты и вставлять их на другие игровые объекты, а если на нем уже был такой компонент, то он предложит одно из двух действий, либо вставить его как новый, либо просто копировать значения из копируемого компонента в тот что висит на игровом объекте.

Unity поддерживает работу с любыми 3D объектами созданными в стороннем программном обеспечении, но также она умеет сама создавать такие примитивные объекты как куб, сфера, капсула, цилиндр и плоскость. Эти объекты часто используются для быстрого прототипирования игр. Чтобы создать любой из них пройдите в контекстное меню GameObject/3D Objects и выберите любой из них. Тоже самое можно сделать в окне иерархии нажав на пустое место правой кнопкой мыши и выбрав пункт 3D Object .

Как я уже писал немного выше компонент Transform является единственным компонентом, который нельзя удалить с игрового объекта. Давайте посмотрим на его параметры немного более подробно:

1. Position – это позиция нашего игрового объекта в сцене в XYZ координатах

2. Rotation – это вращение нашего игрового объекта в сцене, оно также задается в XYZ, но это уже не координаты, а оси по которым мы поворачиваем наш объект в градусах.

3. Scale – это размер нашего игрового объекта в сцене. По умолчанию он равен 1. Меняется он также по всем 3 осям.

Любой игровой объект можно включить или выключить либо через галочку что на картинке выше (ее можно найти в окне инспектора), либо через код. Когда мы отключаем игровой объект все его компоненты перестают работать. Также если у этого игрового объекта были вложенные объекты (дети), то при его отключении они также перестают функционировать.

Чтобы добавить новый тег нужно выбрать в конце списка пункт Add Tag в открывшемся окне инспектора нажмите + и впишите свой тег. Теперь он есть в списке тегов. Также в Unity по умолчанию уже присутствует несколько тегов (например MainCamera, для определения главной камеры на сцене).

Если игровой объект статично стоит на сцене и никуда не перемещается – то это статический объект. Если же он движется во время выполнения игры – это динамический объект.

Когда вы помечаете игровой объект как статический (галочка напротив пункта Static ), при условии, что он не будет двигаться во время выполнения – такой объект будет экономить вычислительные мощности игрока, так как Unity автоматически оптимизирует работу с такими игровыми объектами.

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

После работы со сценой и проектом в целом не забывайте сохранять изменения. В Unity сохранения делятся на 2 вида:

1. Это сохранение самой сцены

2. Это сохранение различных настроек проекта, а также ассетов и настроек в них

Как сохранить сцену я писал выше. А для сохранения проекта в любой момент выберите в контекстном меню File\Save Project . Также не забывайте – когда вы открыли префаб для редактирования – любое сохранение (как проекта, так и сцены) сохранит изменения в префабе.

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


- Ты знаешь SQL?
- Нет
- …

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

Зачем?

Зачем хранить данные в игре должно быть очевидно, поэтому опишем этот момент кратко.

Аксиома

Игра представляет из себя изменение исходных данных с какой-либо целью.

Исходные данные

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

Данные для сохранения

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

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

Встроенные хранилища

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

  • Хранятся в открытом виде
  • Не особо быстрые
  • Хранятся в странных местах, допустим, на Windows они хранятся в реестре с лимитом в 1Мб на запись, на других платформах другие ограничения.

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

Serialization

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

  • Binary - сложно редактировать и обмениваться, но хранить в целом нормально.
  • CVS - почему-то это первый ответ на вопрос про базы данных и юнити в гугле от комьюнити. Вы серьёзно?
  • XML/JSON - старые добрые форматы, только количество символов разное.
  • ProtoBuf like - например, MessagePack или FlatBuffers. Что это такое, с чем это едят, почему не JSON и даже не ProtoBuff вы можете прочитать прямо там, на странице FlatBuffers.

Файлы

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

Единственным кандидатом будет:

  • SQLite - быстрый, простой, проверенный временем, в общем, победивший стандарт.

В Asset Store есть другие варианты, включающие в названии акроним SQL, но очень уж они похожи на обёртки над тем же SQLite. Для облегчения жизни есть ORM решения, например, sqlite-net. Так что если есть необходимость в реляционной базе данных, то смысла искать что-то ещё особо нет.

NoSQL

Благодатная тема последнего десятилетия и благодаря этому можно выделить больше одного решения:

  • SQLite - кто может нам запретить использовать её как kv-хранилище?
  • iBoxDb - существует давно, заявляется поддержка Unity из коробки, говорят работает.
  • LiteDb - в отличие от предыдущего варианта статей по использованию больше и даже таблицы сравнения производительности с файлами и SQLite можно найти, в которых она выглядит очень неплохо. Так же можно взглянуть на нашу статью LiteDB и Unity.

На текущий момент выбор NoSql решений фактически стал стандартом и с трудом можно придумать оправдание не пользоваться ими. Понятно что самым популярным решением тут выглядит SQLite, а остальные не имеют и сотой доли её популярности.

High scalability, high availability enterprise production platform

Альтернативы, на которые стоит обратить внимание:

  • Firebase - заявляется о поддержке Unity. В последних версиях появилась поддержка офлайн режима.
  • CouchBase - заявляется о поддержке Unity в Mobile версии.

Конечно же, это решения enterprise уровня и задач, для тех кто делает очередной Hearthstone и понимает, зачем оно нужно.

Заключение

С одной стороны, данная статья не должна была дать серебряную пулю, чтобы убить все проекты. С другой стороны, выбор вариантов, которые предлагаются комьюнити не так уж широк и всё по старинке решается на уровне binary/json + file/sqlite. А такое прохладное отношение комьюнити к хранению данных, видимо, объясняется наличием более других узких мест в проектах. Однако если ваша душа жаждет приключений, то можно попробовать LiteDb и FlatBuffers. Я определённо протестирую их, но это будет уже совсем другая статья. Пока! =)

Update: про LiteDB так же можно прочитать нашу новую статью LiteDB и Unity.

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

Извлекаем текстуры и шейдеры

Большинство ресурсов Unity-проекта упаковываются в файлы проприетарного формата с расширениями .assets и .resources . Наиболее популярный на сегодняшний день инструмент для просмотра таких файлов и извлечения из них ресурсов — Unity Assets Explorer.


Установка программы dnSpy

Файлы из папки не удалять и не перемещать. В противном случае, программа работать не будет!

Поиск нужный файлов

Для того, чтобы получить исходный код игры скачиваем ее (можно и Steam версию игры). Далее нам нужно найти ее локальные файлы. Для этого заходим в ‘свойства‘ >> ‘локальные файлы’ >> ‘просмотреть локальные файлы‘. Далее, нужно немного порыться и найти папочку Managed‘.

Убедитесь, что игра написана на Unity!



В этой папке будет много файлов с расширением .dll. Нам нужен только 1 из них. Assembly-CSharp.dll

Работа в dnSpy

Для начала кинем наш файл в dnSpy. После этого вы увидите подобную картину.


У вас может не быть некоторых файлов, они появятся со временем работы.

Нажимаем на стрелочку слева от название нашего файла. Далее тоже самое, только в открывшемся взору файле. Получаем много файлов. Все это – код.


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

Взламываем исходный код через IlSpy и dotPeek

Для Windows-сборок Unity компилирует и сохраняет исходный код всех игровых скриптов в директорию Managed . Интересуют нас следующие библиотеки: Assembly-CSharp.dll , Assembly-CSharp-firstpass.dll и Assembly-UnityScript.dll .



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

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

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

PublishingBuilds-0.jpg

====Окно установок построения.
При первом открытии этого окна оно будет пустым. Если вы попробуете посторить Вашу игру когда окно пустое, игра будет включать только текущую открытую сцену Если Вы хотите быстро построить тестоывй проект с одной сценой, просто запустите построение с пустым окном.====

Добавить файл сцены легко. Есть два пути сделать это. Первый - нажать кнопку Добавить текущую (Add Current). Вы увидите, что текущая сцена появится в списке. Второй путь добавить файл сцены - перетащить сцену из окна Проекта на список.

Заметим, что каждая Ваша сцена имеет индекс. Сцена 0 - первая сцена, которая будет загружена когда Вы скомпилируете игру. Когда Вы захотите загрузить новую сцену - используйте Application.LoadLevel() в Вашем скрипте.

Если вы добавляете больше одной сцены и хотите изменить их порядок просто щелкните и пертащите сцену в списке выше или ниже.

Если Вы хотите удалить сцену из списка выделите ее и нажмите Command-Delete. Сцена исчезнет из списка и не будет включена в проект.

Когда вы готовы опубликовать игру - выберите Платформу и проверьте, что лого Юнити рядом с нужной платформой. Если нет - тогда кликните Переключить платформу (Switch Platform) чтобы Юнити поняло под какую платформу Вы хотите построить игру. В конце нажмите кнопку Построить (Build). Вам будет предложено выбрать имя и место куда будет сохранена Ваша игра. Когда Вы нажмете Сохранить (Save), Unity построить Вашу игру. Если Вы не уверены куда сохранять игру,- сохраняйте ее в корневую папку проекта. Нельзя сохранять игру в папку Assets.

Включение Development Build разрешет функциональность Профайлера и также сделает доступными опции Автоподключение к профайлеру (Autoconnect Profiler) и Отладка скриптов (Script Debugging).

Потоковая загрузка сцен в Веб плейере

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

Упрощая - этот режим позволяет игроку начать играть быстрее.

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

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

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

Если Вы хотите отображать прогресс загрузки Вы можете узнать прогресс через функцию GetStreamProgressForLevel().

Офлайн развертывание Вебплейера

Если эта опция включена, тогда файл UnityObject.js (используемый для связи плейера и вебстраницы) будет помещен рядом со скомпилированной игрой. Это позволит игроку запускать игру даже не имея подключения к интернету. Обычно UnityObject.js файл загружается с сервера Юнити, чтобы получить наиболее последнюю версию.

Построение стендэлон проекта

В Юнити можно построить приложение для Windows и Mac (Intel, PowerPC или Universal, которая будет запускаться на обоих архитектурах). Просто нужно выбрать цель в диалоге установок сборки и нажать кнопку 'Build'. Результирующие файлы будут зависеть от целевой платформы. На Windows будут построены выполняемый файлы (.exe), с папкой Data, которая содержит все ресурсы Вашего приложения. На Mac будет построен app бандл, содержащий файлы, необходимые для запуска приложения и все ресурсы.

Распространение игры на Mac просто сводится к распространению app бандла (все упаковано в нем). На Windows Вам нужно передать пользователю как .exe файл, так и папку Data. Проще: другие люди должны иметь у себя все те файлы, что Юнити сделало при построении приложения.

Внутри процесса сборки.

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

Внутри процесса сборки под iOS

Приложение для iPhone/iPad строится в два шага:

Когда нажимается "Build" в диалоге "Build settings" выполняется только первый шаг. Когда нажимается "Build and Run" выполняются оба шага. Если в диалоге сохранения приложения пользователь выбрал уже существующую папку отображается предупреждение. В данный момент можно выбрать два режима генерирования проекта XCode:

  • replace - все файлы в целевой папке удаляются и новые генерируются
  • append - папки "Data", "Libraries" и корневая папка проекта очищаются и заполняются новым сгенерированным контентом. файл проекта XCode обновляется для соответствия с изменениями проекта Юнити. Подпапка "Classes" проекта XCode может быть использована для сохранения нативного кода, который не будет изменяться от сборки к сборке. Однако рекомендуется делать ее регулярный бэкап. Этот режим поддерживается только для уже существующих XCode проектов, сгенерированый Юнити той же версии.

Если нажать Cmd+B, тогда вызовется автоматический процесс сборки в последнюю выбранную для приложения папку. В этом случае выбирается режим по умолчанию - append.

Андроид приложения строятся в два шага:

  1. Пак приложения (файл .apk) генерируется со всеми требуемыми библиотеками и сериализированными ассетами.
  2. Пак заливается на устройство.

Когда нажимается "Build" в диалоге "Build settings" выполняется только первый шаг. Когда нажимается "Build and Run" выполняются оба шага. Если нажать Cmd+B, тогда вызовется автоматический процесс сборки в последнюю выбранную для приложения папку.

При первой попытке построить проект Android, Юнити спросит у Вас указать место, куда установлен Android SDK, который требуется для сборки и инсталлирования Вашего приложения на устройство Android. Вы можете изменить эту установку позднее в Preferences. Когда собираете приложение на Android, проверьте, что на устройстве включены "USB Debugging" и "Allow mock locations". Вы можете проверить, что операционная система видит Ваше устройство запустив команду adb, находящуюся в папке Android SDK/platform-tools. Это работает и на Mac и на Windows. Юнити строит архив приложения (файл .apk) для Вас и инсталлирует его на подключенное устройство. В некоторых случаях Ваше приложение не может автостартовать, как на iPhone, так что Вам нужно разблочить экран, и в некторых редких случаях запустить установленное приложение из меню.Компрессия текстур

В диалоге Build Settings Вы также можете найти опицию Компрессия текстур (Texture Compression). По умолчанию Юнити использует формат текстур ETC1/RGBA16 для текстур, которые не имеют переопределенных индивидуальных установок (смотри Texture 2D / Per-Platform Overrides).

Если Вы хотите построить архив приложения (файл .apk) для специфической архитектуры, Вы можете исползовать опцию Texture Compression для переопределения поведения по умолчанию. Любая текстура, у которой установлено - без компрессии будет оставлена без изменений. Только текстуры исползующие компрессированный формат будут использовать формат, выбранный в опции Texture Compression.

Чтобы быть уверенным, что прилодение будет устанавливаться только на устройства, которые поддерживают данный формат текстур, Юнити редактирует AndroidManifest. Это включит фильтрацию на Андроид маркете, чтобы отсеять устройства не поддерживающие этот формат.

Предзагрузка.

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

Чтобы быть уверенным, что Весь ваш контент загружен, Вы можете создать пустую сцену, которая будет просто вызывать Application.LoadLevel(1). В установках построения сделайте эту пустую сцену с индексом 0. Все последующие уровни будут предзагружены.

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

Чтобы узнать больше деталей о использовании самого Юнити, Вы можете продолжить чтение Мануала или пройти к Урокам.

Чтобы узнать больше деталей о компонентах, почитайте Справочник компонентов.

Чтобы узнать больше деталей о скриптинге, почитайте Обзор скриптинга .

Чтобы узнать больше деталей о создании арта, почитайте секцию Ассеты мануала.

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

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