Unity preferences как зайти windows

Обновлено: 07.07.2024

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

Устранение неполадок соединения между Unity и Visual Studio

Параметр Confirm Editor Attaching включен или Code Optimization On Startup установлен в значение Debug

В меню Unity выберите Edit / Preferences .

В зависимости от используемой версии Unity:

  • Убедитесь, что Code Optimization On Startup для параметра задано значение Debug .
  • Или выберите External Tools вкладку. Убедитесь, что Editor Attaching флажок включен.

Не удается подключить

  • Попробуйте временно отключить антивирусную программу или создать правила исключения для VS и Unity.
  • Попробуйте временно отключить брандмауэр или создать правила, разрешающие сетевое взаимодействие между VS и Unity по протоколам TCP/UDP.
  • Некоторые программы, например Team Viewer могут препятствовать обнаружению процессов. Попробуйте временно остановить все лишнее программное обеспечение, чтобы выяснить, повлияет ли это на что-либо.
  • Не переименовывайте основной исполняемый файл Unity, так как VSTU отслеживают только процессы "Unity.exe".

Сбои Visual Studio

Эта проблема может быть вызвана повреждением кэша MEF в Visual Studio.

Попробуйте удалить следующую папку, чтобы сбросить кэш MEF (перед этим закройте Visual Studio):

Visual Studio не отвечает

Некоторые подключаемые модули Unity, такие как Parse, FMOD, UMP (Universal Media Player), ZFBrowser или Embedded Browser, используют собственные потоки. Эта проблема возникает, когда подключаемый модуль подключает собственный поток к среде выполнения, что блокирует вызовы ОС. Это означает, что Unity не может прервать этот поток для отладчика (или перезагрузки домена) и перестает отвечать на запросы.

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

Несовместимый проект в Visual Studio

очень важно помнить, что Visual Studio сохраняет "несовместимое" состояние в параметрах проекта и не пытается перезагрузить проект до тех пор, пока не будет явно использован Reload Project . Поэтому после каждого шага устранения неполадок убедитесь, что вы пытаетесь повторно открыть решение, и попробуйте щелкнуть правой кнопкой мыши все несовместимые проекты и выбрать Reload Project .

Дополнительные перезагрузки или закрытие всех открытых окон в Visual Studio

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

В случае исключений не происходит останов отладчика

В ОС Windows система Visual Studio предлагает скачать целевую платформу Unity

Проблемы со ссылкой на сборку или свойством проекта

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

Точки останова с предупреждением

Если Visual Studio не удается найти исходное расположение для определенной точки останова, рядом с ней отображается предупреждение. Убедитесь, что используемый вами скрипт правильно загружен и используется в текущей сцене Unity.

Точки останова не срабатывают

Не удается выполнить отладку проигрывателей Android

Мы используем для обнаружения проигрывателей многоадресную рассылку (это стандартный механизм, применяемый в Unity), но затем применяется простое соединение TCP для подключения отладчика. Этап обнаружения — основная проблема для устройств Android.

Связь через Wi-Fi универсальна, однако она слишком медленная по сравнению с USB из-за задержки. Мы наблюдали отсутствие должной поддержки многоадресной рассылки у некоторых маршрутизаторов или устройств (этим известна серия Nexus).

Связь по USB обладает отличной скоростью для отладки. Инструменты Visual Studio для Unity теперь могут обнаруживать устройства USB и согласовывать с сервером ADB правильную переадресацию портов для отладки.

Проблемы с IntelliSense или разметка кода

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

Известные проблемы

При отладке Unity иногда аварийно завершает работу.

При отладке Unity иногда зависает.

Пошаговая отладка с заходом и выходом из методов иногда ведет себя некорректно, особенно в итераторах или внутри инструкций switch.

Отчеты об ошибках

Помогите нам улучшить качество набора средств Visual Studio для Unity: отправляйте нам отчеты об ошибках при аварийном выходе, зависании или в случае других ошибок. Эти сведения помогают нам определять причину и устранять проблемы в наборе средств Visual Studio для Unity. Спасибо!

Как сообщить об ошибке в случае зависания Visual Studio

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

Создание отчета о зависании Visual Studio во время отладки с помощью набора средств Visual Studio для Unity

Откройте новый экземпляр Visual Studio.

Откройте диалоговое окно "Присоединение к процессу". В новом экземпляре Visual Studio в главном меню выберите Отладка, Присоединение к процессу.

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

Приостановите отладчик. В новом экземпляре Visual Studio в главном меню выберите Отладка, Прервать все или просто нажмите CTRL+ALT+BREAK.

Создайте дамп потока. В окне командной строки введите следующую команду и нажмите клавишу ВВОД:

Возможно, сначала будет нужно отобразить окно Команда . В Visual Studio в главном меню выберите Представление, Другие окна, Командное окно.

Откройте терминал и получите идентификатор процесса Visual Studio для Mac:

Запустите отладчик lldb.

Подключитесь к экземпляру Visual Studio для Mac, используя идентификатор процесса:

Введение в Unity

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


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

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

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

  • Как установить Unity, а также различия между тремя разными версиями
  • Что составляет интерфейс Unity
  • Навигацию внутри сцены
  • Добавление и управление объектами GameObject и их компонентами

Первая часть этого руководства посвящена ознакомлению с пользовательским интерфейсом Unity.

С чего начать?


Все версии Unity предоставляют одинаковые функции движка

Существует также версия Enterprise, в которой ваши пользовательские потребности определяют стоимость подписки.


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

Кроме того, существуют различные сервисы внутри Unity, такие как Cloud Build и Analytics, которые становятся доступными в платных версиях.В Unity есть несколько строгих правил о том, как вы можете использовать персональную версию. Перед тем, как приступить к работе, обязательно ознакомьтесь с FAQ по Unity, чтобы узнать, имеете ли вы право его использовать.

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


Запустите установщик и следуйте инструкциям на экране. Дождитесь завершения установки и запустите Unity Hub. Вам будет предложено создать учетную запись.


Создав учетную запись, запустите Unity. Нажмите File-New Project чтобы создать новый проект.

  • 1. Назовите свой проект Spaceship и выберите место на жестком диске, чтобы сохранить его.
  • 2. Вы заметите, что у вас есть несколько вариантов выбора шаблонов. Каждый шаблон предварительно настраивает Unity, чтобы сэкономить ваше время в зависимости от того, что вы хотите сделать. Сейчас выберите 3D.
  • 3. Нажмите Create, и Unity откроет ваш первый проект.

Переделываем интерфейс

Когда Unity впервые откроется, вы увидите окно, которое выглядит так:


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

В верхнем правом углу вы увидите пять кнопок. Выберите крайнюю справа. Это выбор макета (Layout). Из списка опций выберите 2 by 3.

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


Теперь разберем имеющиеся разделы.

1. Окно сцены

Когда вы тестируете свою игру, окно сцены будет обновляться с текущим состоянием игры. Вы даже можете добавлять новые элементы в сцену на лету.

Когда вы остановите игру, окно сцены вернется в исходное состояние. Любые изменения, внесенные в сцену во время игры, будут потеряны после ее остановки.

2. Окно игры

Окно игры (Game View) отображает игровую перспективу игрока. Здесь вы можете поиграть в свою игру и увидеть, как все различные механизмы работают друг с другом.

В окне игры имеется селектор соотношения сторон, который позволяет вам изменять размеры вида в соответствии с определенным соотношением сторон экрана (например, 4: 3, 16: 9, 16:10…) или размером экрана устройства, например это iPhone или iPad.

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


3. Окно иерархии

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

Сцена обычно представляет один уровень вашей игры, хотя теоретически вы можете поместить всю игру в одну сцену. Любые GameObjects, активно используемые в вашей игре в текущей сцене, появятся в окне Иерархии (Hierarchy).

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

По мере того, как ваша сцена разрастается большим количеством GameObjects, панель поиска окажется бесценным инструментом.

4. Окно проекта

Окно проекта (Project Window) содержит все ассеты, используемые вашей игрой. Вы можете организовать свои ассеты по папкам. Если вы хотите использовать их, вы можете просто перетащить их из окна проекта в окно иерархии.

Кроме того, вы можете перетащить их из окна проекта в окно сцены. Если вы перетащите файлы со своего компьютера в окно проекта, Unity автоматически импортирует их как ассеты.

Unity организует ассеты в окне проекта так же, как файловая система ОС.

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

5. Окно инспектора

Окно инспектора (Inspector Window) позволяет вам настроить любой GameObject. Когда вы выбираете GameObject в Иерархии, Инспектор перечисляет все компоненты GameObject и их свойства.

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


6. Панель инструментов

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

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


  • 1. Откройте раскрывающийся список GameObject из меню Unity
  • 2. Выберите раскрывающийся список 3D-объектов
  • 3. Выберите Cube из списка доступных объектов

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

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


Выберите инструмент Рука (Hand) затем перетащите указатель мыши на окно сцены, чтобы панорамировать всю сцену.

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

Затем, удерживайте нажатой клавишу Ctrl (или Cmd) и Alt (или Option) . Щелкните правой кнопкой мыши и переместите мышь вверх, чтобы увеличить масштаб сцены.

Перемещение мыши вниз уменьшает масштаб. Или, если вы хотите сделать это простым способом, просто используйте колесо прокрутки.

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

Аналогично, вы можете перемещаться вверх и вниз, нажимая E или Q соответственно. Чтобы двигаться еще быстрее, нажмите и удерживайте клавишу Shift .

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

Инструмент Перемещение (Move) позволяет выбирать и размещать GameObject на сцене.


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

Есть много способов переместить ваш GameObject с помощью данного инструмента. Вы можете выбрать одну из стрелок (которая станет желтой при выборе), а затем переместить мышь. GameObject будет двигаться только по этой оси.

Три цветные плоскости в центре GameObject позволяют перемещать его по двум осям. Цвет квадрата указывает, по какой плоскости он будет двигаться. Например, зеленый квадрат означает, что вы можете перемещать объект по плоскости y (что означает, что он может перемещаться по осям x и z).

Клавиша быстрого доступа по умолчанию для инструмента перемещение W.

Инструмент Вращение (Rotate) позволяет, как вы уже догадались, вращать объекты.


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

Клавиша быстрого доступа по умолчанию для инструмента вращение E.

Инструмент Масштаб (Scale) позволяет масштабировать объект GameObject либо по одной оси, либо пропорционально по всем осям.


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

Клавиша быстрого доступа по умолчанию для инструмента масштаб R.

Инструмент Rect в основном используется с 2D-объектами и пользовательским интерфейсом (UI), хотя его можно использовать и для 3D-объектов.


Инструмент может изменять размеры, масштабировать и вращать 2D-объекты, а также сбрасывать точку вращения, которая является центральной точкой вращения объекта. Опорная точка представлена ​​большим кружком на объекте.

Клавиша быстрого доступа по умолчанию для инструмента Rect T.

Инструмент Преобразование (Transform) объединяет перемещение, масштабирование и вращение в один инструмент.


Первый переключатель переключается между центральным (center) и поворотным (pivot) режимами. В центральном режиме, если вы выберете два объекта GameObject, гизмо будет размещено в центре двух объектов. Вращение GameObjects вращает их вокруг центра гизмо. В режиме поворота каждый GameObject вращается вокруг своей точки поворота, как показано ниже:

Второй переключатель переключает между глобальным (global) и локальным (local) пространством.

  • Глобальный режим: вы управляете своим объектом с точки зрения окружающего мира. Ось X движется слева направо, ось Y движется вверх и вниз, а ось Z движется вперед и назад, как обычно.
  • Локальный режим: работает из системы координат самого объекта и меняет оси в соответствии с осью реального GameObject.

7. Кнопки воспроизведения

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

Интерфейс Unity затемнится, чтобы показать, что игра активна.


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

Далее следует кнопка Пауза:

Она позволяет сделать паузу и вносить изменения в игру.

Наконец, последняя кнопка Step:

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

8. Разные настройки редактора


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


Как только вы добавите идентификатор проекта, вы сможете добавить сервисы в ваш проект.

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

Вы также можете добавить:

  • аналитику
  • внутриигровую рекламу
  • многопользовательская поддержку
  • покупку в приложении
  • отчеты о производительности
  • сотрудничество

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



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

Последняя кнопка Макеты (Layouts) позволяет создавать и сохранять макеты в редакторе и переключаться между ними. Unity прекрасно настраивается. Каждый из различных окон в макете может быть изменен, закреплен, перемещен или даже полностью удален из редактора.

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

Что делать дальше?

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


Unity – это кроссплатформенный игровой движок, позволяющий создавать игры для ПК, консолей, мобильный устройств и веб-сайтов. Последняя версия движка (Unity 5) имеет возможность экспорта в WebGL, благодаря чему разработчики могут без труда публиковать свои игры в вебе. Как следует из названия, данный экспортер использует WebGL – JavaScript API для рендеринга интерактивной компьютерной 3D графики, а также asm.js – подмножество JavaScript, которое было разработано компанией Mozilla и преподносилось как «язык ассемблера для веба». Больше информации о Asm.js и WebGL для Unity и Unreal Engine доступно здесь.

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

По окончании урока у вас получится вот такая игра (для просмотра потребуется браузер с поддержкой WebGL). Проект также доступен для скачивания из репозитория на GitHub.

Несколько слов о JavaScript в Unity

Говоря о JavaScript в Unity, мы подразумеваем нечто вроде диалекта JS под названием UnityScript. И хотя сами специалисты из Unity называют этот язык JavaScript, более скептично настроенные пользователи интернета полагают, что поддержка JavaScript в Unity – это маркетинговая уловка. Так или иначе, нужно сразу сделать оговорку, что UnityScript не соответствует спецификации ECMAScript, и никто даже не делает попытки устранить эти несоответствия.

Устанавливаем Unity

Для начала нам нужна рабочая версия Unity, скачать ее можно здесь. Файлы установки доступны для Windows и для Mac OS X. Пользователи Linux могут запустить Unity с помощью Wine или использовать другой удобный способ.


После установки можем приступать. Откроем Unity и создадим новый 3D проект.


Настраиваем проект

Теперь, когда программа открылась, давайте кратко пройдемся по основному интерфейсу:


  1. Слева находится панель Hierarchy. Она показывает все элементы текущей сцены. Сцена – это визуальное отображение игры (уровня или меню). На данный момент в панели находятся два элемента: Main Camera и Directional Light.
  2. Панель Scene посредине отображает камеру и свет в 3D пространстве.
  3. Рядом с Scene есть вкладка Game. Там показано, как будет видеть игру игрок. Это необходимо для тестирования игры в редакторе.
  4. Справа находится панель Inspector, где можно менять настройки элементов. Давайте посмотрим, как она работает. Сначала выберем Directional Light в панели Hierarchy. Мы увидим много информации об этом типе света и сможем отключить в нем тени, выбрав Shadow Type: No Shadows.
  5. Внизу экрана находится окно Project, показывающее файлы, которые мы должны создать для игры.

Создаем героя

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



Нажмем кнопку Play, чтобы проверить результат. На экране должно появиться 3D пространство со сферой на фоне горизонта.

Чтобы сфера падала, у нее должен быть вес. Выходит, нам нужно добавить к ней новый компонент, нажав в панели Inspector кнопку Add Component и выбрав Rigidbody. Так как мы не хотим, чтобы сфера вращалась, нужно зафиксировать ее положение с помощью компонента Rigidbody. Для этого откройте Constraints и выберите все оси в строке Rotation. Проиграйте сцену еще раз и вы увидите, что теперь сфера падает.


Чтобы предотвратить бесконечное падение сферы, создадим нечто вроде платформы. Для этого добавим плоский куб со значением Scale.Y, равным 0.1. Проиграйте сцену еще раз и убедитесь, что сфера успешно приземляется на платформу. Но, стоит отметить, всё это выглядит не очень естественно. Как же заставить сферу подпрыгивать? Для этого нам пригодятся физические материалы.

Наделяем сферу физическими свойствами

Прежде всего, создадим для нашей сферы физический материал, который позволит ей отпрыгивать от поверхности соприкосновения. Для этого нужно создать в папке Assets новую подпапку Materials. Внутри этой подпапки создадим новый физический материал и назовем его Bouncy_Sphere. Вот значения, которые мы должны указать в панели Inspector:

Dynamic Friction: 10
Static Friction: 10
Bounciness: 1
Friction Combine: Maximum
Bounce Combine: Maximum

Если мы добавим этот материал в Sphere Collider, сфера будет подпрыгивать, но всегда на одинаковую высоту. Чтобы она подпрыгивала с каждым разом выше, нужно добавить физический материал и для платформы. Создадим еще один материал под названием Bouncy_Platform и применим к нему следующие значения:

Dynamic Friction: 0.9
Static Friction: 0.9
Bounciness: 1
Friction Combine: Average
Bounce Combine: Multiply

Чтобы не запутаться, переименуем наш плоский куб-платформу на Platform, кликнув по нему дважды в панели Hierarchy. Теперь, начав игру, вы увидите, что сфера с каждым разом подпрыгивает выше.

Добавляем вид от первого лица

Для этого нужно в панели Hierarchy перетащить камеру на сферу. В результате камера станет дочерним элементом сферы и будет двигаться вместе со сферой. Камере также необходимо задать некоторые дополнительные настройки:

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

Настраиваем управление в игре

Наша цель – использовать мышь или трекпад, чтобы позволить игроку двигать сферу в определенном направлении. С этой целью мы напишем первый скрипт. Как и в случае с Rigidbody, скрипт добавляется к элементу игры в качестве компонента. В нашем примере мы добавим JS-скрипт под названием InputController к камере. Так же, как мы это делали со сценой и материалами, создадим в панели Project новую папку под названием Scripts, в которой и будет находиться наш скрипт. Двойной клик по новому скрипту откроет стандартный для Unity редактор MonoDevelop. Его можно заменить на любой другой редактор (Unity > Preferences > External Tools), но сейчас это не имеет никакого значения.


Первой идет общедоступная переменная, принадлежащая к типу GameObject. Она обозначает сферу. Вернемся к Unity, по прежнему оставив камеру выбранной. Мы увидим, что эта общедоступная переменная находится рядом с пустым полем для ввода. Перетащим сферу на данный участок, таким образом присвоив значение этой переменной.

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


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


Каждая из двух новых переменных x и z обозначает соответствующую ось. Когда мы смотрим вдоль оси y, мы видим горизонтальную ось x и вертикальную ось z. Мы будем менять положение сферы на этих осях в зависимости от данных, полученных с мышки. Нам понадобится статическая переменная Input.mousePosition, возвращающая двухмерный вектор. Вектор, нулевое значение которого приходится на нижний левый угол, должен переместиться в нашей системе координат на середину экрана. Следующий фрагмент кода демонстрирует такую трансформацию координат. Наконец, вызовем функцию setHeroPosition с обоими рассчитанными значениями в качестве аргументов. Мы запишем эту функцию в новый скрипт HeroController, привязанный к сфере:


Проверим, как работает наш код: подвигаем мышку или трекпад, чтобы сфера упала с платформы.

Реализуем процедурное создание платформ

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


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

  1. Переменная boundary определяет границу оси y. Каждый раз, когда герой прыгает выше этой отметки, должна создаваться новая панель.
  2. Вторая переменная отвечает за поворот, необходимый для создания нового экземпляра префаба. Значение Quaternion.identity отменяет поворот, как нам и нужно.
  3. Переменная lastPlatformPosition сохраняет положение последней платформы как трехмерный вектор.


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


Чтобы избежать дублирования значений координат x и z в новой панели по отношению к предыдущей, воспользуемся циклом do while. Функция Unity Random.Range поможет нам получить произвольные значения осей x и z. В любом случае, нам нужно, чтобы их диапазон был между -1 и 2. Наконец, сохраняем новое положение панели в качестве последнего и возвращаем его.

Добавляем меню игры

Прежде всего нужно проверить, упала ли сфера ниже определенной отметки. Для этого отредактируем оператор if функции update в скрипте GameManager. Оператор else if будет проверять, является ли положение сферы ниже -2.0 единиц. Если да, он вызовет закрытую функцию gameOver:


Для отслеживания состояния игры мы воспользуемся новой функцией:


В данном случае мы используем класс Application, позволяющий с помощью метода LoadLevel загрузить новую сцену Menu. Для этого сначала создадим сцену, выбрав File > New Scene, и сохраним ее под названием Menu. Затем нам нужно добавить обе сцены в процесс сборки. Настройки сборки доступны во вкладке File > Build Settings. Не закрывая сцену с меню, нажмите кнопку Add Current и добавьте сцену в настройки сборки. Повторите то же действие с открытой сценой уровня. Теперь по завершении игры у вас на экране будет появляться только что созданная сцена с меню игры.

Добавляем кнопку для начала игры

Чтобы в игру можно было поиграть, нужно добавить в меню кнопку для ее запуска. Потому вернемся к настройкам сцены меню игры и изменим прежде всего параметры камеры в панели Inspector:

Чтобы добавить кнопку, мы воспользуемся элементами пользовательского интерфейса Unity, которые могут быть добавлены как 3D элементы через панель Hierarchy. После добавления кнопки интерфейса в Hierarchy должны появиться следующие элементы: EventSystem и Canvas вместе с дочерним элементом Button и его дочерним элементом Text.

Canvas – это контейнер для всех элементов интерфейса, его можно сделать в некотором смысле адаптивным. Для этого нужно в панели Inspector переключить настройку Canvas Scaler: UI Scale Mode с Constant Pixel Size на Scale With Screen Size. Теперь можно менять положение кнопки:


Эту функцию можно применить в опциях кнопки в панели Inspector. В настройках компонента Button (Script) можно сделать так, чтобы функция выполнялась, когда пользователь кликает данный компонент. С этой целью мы добавим новую функцию к событию On Click (), нажав иконку +. Теперь можно перетащить саму кнопку на поле ввода. Затем выберем только что написанную функцию из скрипта UIController (UIController.StartGame).

Публикуем проект как браузерную игру для WebGL

С Unity вы можете экспортировать ваш проект как приложение для WebGL. Откройте настройки сборки и выберите WebGL в качестве платформы. Затем подтвердите выбор, нажав кнопку Switch Platform. После этого остается только нажать кнопку Build и выбрать название для игры. По завершении сборки откройте html-файл с помощью любого браузера, поддерживающего WebGL.


Дальнейшие шаги

Конечно же, нашу небольшую игру можно улучшить. К примеру, добавить подсчет очков, разные типы платформ, дополнительные методы ввода, звуки и так далее. Главное, что мы увидели в данном уроке, это то, что кроссплатформенный игровой движок Unity предоставляет хорошее сочетание WYSIWYG-редактора и возможностей скриптов, создаваемых на похожем на JavaScript языке. В зависимости от конкретных требований проекта, Unity может стать достойной альтернативой WebGL-фреймворкам.


Одна из самых важных вещей в игре – сохранение пользовательских данных: настроек и игровых результатов. Когда-то игры были короткими, и сохранять там было особенно нечего. В лучшем случае игра записывала самый высокий балл для составления рейтинга. Но технологии стремительно развивались, и геймдев не оставался в стороне.

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

Unity предлагает сразу два способа сохранять игровые данные – попроще и посложнее:

  • Попроще – встроенная система PlayerPrefs. Устанавливаете значение для ключа, нажимаете Save – и все готово.
  • Посложнее – сериализация данных и запись в файл для дальнейшего использования.

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

Создание нового проекта в Unity

Создание нового проекта в 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 в файловой системе Windows

Загрузка

Загрузка сохраненных данных – это, по сути, сохранение наоборот. Необходимо взять значения, хранящиеся в PlayerPrefs и записать их в переменные.

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

Сброс

Для удаления всех данных, хранящихся в PlayerPrefs , нужно использовать метод PlayerPrefs.DeleteAll .

В методе ResetData мы очищаем хранилище, а также обнуляем все переменные.

Теперь проверим весь этот код в деле. Сохраните файл и вернитесь в редактор Unity. Прикрепите скрипт SavePrefs к какому-нибудь объекту, например, к Main Camera .

 Прикрепление скрипта SavePrefs

Прикрепление скрипта SavePrefs

Теперь запустите игру и начните взаимодействовать с GUI-элементами. Изменяйте переменные, нажимая на кнопки и заполняя текстовое поле. Когда будете готовы, сохраните данные кнопкой Save Your Game . После этого остановите и перезапустите игру и нажмите на кнопку Load Your Game . Если вы всё сделали правильно, значения переменных немедленно изменятся на те, что вы сохранили в предыдущем запуске.

Чтобы очистить PlayerPrefs , кликните Reset Save Data .

Использование PlayerPrefs для сохранения данных. Скриншот работающего проекта

Использование PlayerPrefs для сохранения данных. Скриншот работающего проекта

Недостатки

Этот способ кажется простым и эффективным. Почему бы всегда не использовать PlayerPrefs для сохранения пользовательских данных?

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

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

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

К счастью, у нас есть еще один способ, более гибкий и безопасный.

Для демонстрации сложного способа сохранения данных в Unity откроем скрипт SaveSerial .

Снова определим переменные и создадим интерфейс для управления ими. Метод OnGUI похож на тот, что мы только что писали:

Для сериализации данных потребуется добавить несколько директив using :

Сохранение

Создадим новый сериализуемый класс SaveData , который будет содержать сохраняемые данные.

Скрипт SaveSerial

Скрипт 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

Деактивация скрипта Save Prefs

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

В этот раз файл будет сохранен по "постоянному пути данных" игры. В Windows это C:\Users\username\AppData\LocalLow\project name , в Mac –

/Library/Application Support/companyname/productname согласно документации.

Перезапустите игру и загрузите данные, нажав на кнопку Load Your Game . Значения переменных должны измениться на те, что вы сохранили ранее.

Также вы можете удалить все сохраненные данные кнопкой Reset Save Data .

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

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

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

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

Сериализация и запись в файл – более сложный путь, но он дает вам бóльшую гибкость и безопасность.

Какие именно данные сохранять и каким способом – зависит от особенностей проекта.

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