Топ-20 советов и трюков, которые помогут начинающим в Unity 3D
Разработка игр на Unity — отличный способ войти в игрострой и начать свой путь в геймдеве. Первые вопросы, которыми задаётся новичок, это как стать разработчиком игр, на что обращать внимание и где учиться.
Мы с факультетом разработки игр на Unity от GeekBrains собрали 20 советов и трюков, которые помогут освоиться в редакторе.
Не используйте Distance() или magnitude в векторах
Для расчёта расстояния между двумя векторами есть метод Distance() и поле magnitude . Но в процессе вычислений они оба используют операцию извлечения квадратного корня, которая является очень ресурсозатратной. Чтобы этого избежать, используйте поле sqrMagnitude . Оно возвращает квадрат расстояния между векторами. Остаётся лишь сравнить его со значением, также возведённым в квадрат.
Математические операции в полях инспектора
В любых числовых полях инспектора можно вводить не только цифры, но и математические выражения. Например 2 / 3 , 0,5 * 7 .
С версии 2021.2.0 Alpha 10 в инспекторе стало ещё больше доступных выражений:
- sqrt — извлечение квадратного корня;
- sin / cos / tan — синус/косинус/тангенс значения соответственно;
- floor — округление значения вниз;
- ceil — округление значения вверх;
- round — округление значения к ближайшему целому числу.
Также математические операции можно выполнять с выделением нескольких объектов. Например выражение -=10 отнимет 10 от соответствующей координаты каждого объекта.
Ещё можно распределить координаты случайно или равноудалённо с помощью функций L(N,M) и R(N,M) соответственно, где N и M — минимальное и максимальное значения координат.
Rich Text в консоли
В обучении разработке игр часто упускают возможности кастомизации Unity, которые достаточно обширны. Например во встроенных компонентах текста UI используется форматирование Rich Text. Оно позволяет сделать текст жирным, курсивом, изменять его цвет, размер и даже присваивать материал.
Такое же форматирование поддерживается и в сообщениях консоли, выведенных через Debug.Log() . Например:

Создание элементов меню редактора
Используя атрибут [MenuItem(“My Menu”)] , можно создавать собственные вкладки меню и элементы в них. Требуется импорт пространства UnityEditor .
Также элементам меню можно присваивать горячие клавиши. Для этого в конце названия элемента через пробел нужно указать один из трёх символов (%/#/&, которые соответствуют клавишам Ctrl/Shift/Alt) и какую-либо букву. Главные категории меню, такие как File, Edit, Assets и остальные также можно дополнять.


Создание дополнительных опций в контекстном меню компонента
Помимо собственных элементов меню можно создавать дополнительные элементы в контекстном меню компонентов. Для этого используется атрибут [ContextMenu(“Name”)] .


Сохранение изменений компонента в Play Mode
Если в процессе создания игры на Unity внести какие-либо изменения в компонент с запущенной игрой, то эти изменения не сохранятся. Если вы вносили изменения в пределах одного компонента, то все его значения можно скопировать в контекстном меню компонента (Copy Component), а после того, как вы остановите игру, обратно их вставить через то же контекстное меню (Paste Component Values).
Если же изменения были в пределах всего объекта, то в его контекстном меню тоже есть возможность копирования. Но вставляться значения будут уже продублированным объектом. Так что крайне не рекомендуется так повторять.
Ссылка на объект из сообщения в консоли
В процессе отладки может понадобится найти конкретный объект, который вызвал ошибку. Конечно, можно вместе с сообщением выводить уникальный ID этого объекта и искать его вручную. Но гораздо легче указать нужный объект вторым аргументом в методе Debug.Log() . Тогда, при нажатии на сообщение в консоли, указанный объект будет выделяться в иерархии: Debug.Log(«Something wrong», gameObject);
HideInInspector и SerializeField
Эти два атрибута помогут настроить отображение нужных полей в инспекторе. Если у вас много публичных полей, которые засоряют инспектор, то вы можете скрыть их атрибутом HideInInspector . Если же вам нужно, чтобы приватное поле, которое по-умолчанию не отображается в инспекторе, всё же можно было редактировать, используйте атрибут SerializeField .
Автоматическое создание глубины в изометрических играх
При создании 2D игры с изометрической проекцией вам может понадобиться имитировать глубину сортировкой слоёв спрайтов. То есть тот объект, который находится на заднем плане, должен быть на слой ниже переднего объекта. Если для неподвижных объектов это легко реализовать, просто настроив их слои в компоненте SpriteRenderer , то для подвижных объектов всё немного сложней.
Однако Unity уже позаботились об этом и дали возможность сортировать объекты по слоям, исходя из их координат. Для начала нужно настроить сортировку. Для этого перейдите в Edit→Project Settings→Graphics→Camera Settings. Свойство Transparency Sort Mode выставьте в Custom Axis , а Transparency Sort Axis в (0; 1; 0) . Теперь все объекты, которые будут находится на одном слою, будут автоматически сортироваться исходя из координаты Y. Те, что выше — на задний план, а те, что ниже — на передний.
Такой простой трюк значительно упростит разработку игр на Unity. Ведь без него бы пришлось вручную контролировать координаты различных объектов и менять их слои.
Выполнение кода, не привязанного к объекту
Атрибут метода [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] позволит выполнить код, не привязывая скрипт к какому-либо объекту. В данном случае код вызовется сразу после загрузки сцены.
Структуры и классы
Во время разработки игры старайтесь чаще использовать структуры вместо классов, где это возможно. Это сильно уменьшит нагрузку на игру, ведь структура является типом значения, а класс — ссылочным типом.
Создание подслоёв
Кроме обычных слоёв, можно создавать в них подслои, разделяя их символом «/». Например Ground/Grass . Это поможет классифицировать слои и упростит работу с ними.

Фокусировка камеры редактора на объекте и следование за ним
Чтобы сфокусироваться камерой редактора на каком-либо объекте, выделите этот объект и нажмите F. Если объект движется и вам нужно, чтобы камера следовала за ним, нажмите F дважды.
Матрица коллизий
В Unity можно определить, какие из объектов будут сталкиваться друг с другом, а какие нет. Делается это через настройку матрицы коллизий. Для этого перейдите в Edit→Project Settings→Physics→Layer Collision Matrix.

Если на пересечении двух слоёв убрать галочку, то объекты этих слоёв не будут сталкиваться друг с другом. В данном случае объект слоя Player не будет сталкиваться с другими объектами своего слоя и объектами слоя Walls .
Debug Mode в инспекторе
Во время обучения разработке игр нередко попадаются ошибки. К счастью, стандартный инспектор в Unity имеет режим отладки. В нём отображаются все приватные поля компонентов. Чтобы включить его, вызовите контекстное меню вкладки инспектора или нажмите на троеточие в верхнем правом углу и выберите режим Debug. В некоторых ситуациях этот режим сильно упрощает процесс отладки и разработки игры.


Если у компонента есть пользовательский редактор, то он не будет отображаться в в этом режиме — там будут видны только сами поля.
Мониторинг через график
В курсах по созданию игр консоль часто используется для вывода в неё каких-либо значений и мониторинга. Но если значение изменяется очень часто, то следить за этим будет не очень удобно. В таких случаях можно вывести это значение на график. Для этого вам понадобится AnimationCurve . Пример кода:
Посмотреть график можно, нажав на поле кривой в инспекторе:

Кеширование объектов
Ещё одна заметка с курсов создания компьютерных игр: старайтесь кешировать все объекты, с которыми вы часто работаете. Например, в скрипте вы часто обращаетесь к какому-либо компоненту через GetComponent . Вместо этого можно создать поле для этого компонента и присвоить его в методе Start . После этого можно будет обращаться напрямую к компоненту через это поле. Такое решение снизит нагрузку, так как операции GetComponent , Find , FindGameObjectsWithTag и т. д. сильно ресурсозатратны.
Создание пресетов для компонентов
Для каждого компонента можно создавать собственные пресеты. Пресет позволяет сохранить текущие настройки компонента и присвоить их другому компоненту того же типа. Пресеты хранятся в виде отдельных файлов.
Чтобы создать пресет, нажмите на значок ползунков в верхнем правом углу компонента. Откроется окно со всеми пресетами для этого типа. Чтобы сохранить текущие настройки, нажмите кнопку «Save current to…» и сохраните файл. В этом же окне можно применять сохранённые пресеты на другие компоненты.


Программная пауза
Снова про отладку, которая пригождается и разработчикам игр при обучении, и в дальнейшей работе. Поставить игру на паузу можно не только кнопкой в редакторе, но и через код. Для этого нужно установить поле EditorApplication.isPaused в значение true . Пригодиться это может во время отладки, когда нужно остановить игру прямо после какой-нибудь ошибки, чтобы детальнее её изучить.
Удобный импорт файлов из Photoshop в Unity
Установив пакет 2D PSD Importer, можно упростить процесс переноса изображений во время разработки игры из фотошопа в Unity. Этот пакет принимает файлы с расширением .psb . При импорте такого файла он автоматически создаёт в объекте все дочерние изображения, которые соответствуют слоям из фотошопа. Также он создаёт группу объектов с отсортированными по слоям компонентами SpriteRenderer .
Примечание Чтобы установить пакет, перейдите в Package Manager. В открывшемся окне в поле поиска введите имя нужного пакета. Выберите пакет и нажмите внизу кнопку Install.
Конечно, это далеко не все хитрости. Но уже с ними вы сможете облегчить себе процесс разработки. А узнать ещё больше фишек и профессионально освоить разработку игр на Unity можно на Факультете разработки игр от GeekBrains, где опытные преподаватели научат вас создавать игры с нуля и в том числе разберут особенности различных инструментов. Первые 6 месяцев обучения бесплатно.
Разработка вашей первой игры с помощью Unity и C#
Как архитектор ПО я создал много систем, занимался обратным инжинирингом вредоносного программного кода и, в целом, мог бы достаточно легко разобраться почти в любом коде. Однако, когда дело дошло до создания игр, я слегка растерялся, даже не зная, с чего начать. На заре эпохи Windows я немного программировал графику в неуправляемом коде — не могу сказать, что это доставило мне удовольствие. Я тогда начинал разработку на DirectX, но осознал, что, хотя он обладает колоссальными возможностями, мне пришлось бы писать слишком много кода для того, что я хотел сделать.
И вот однажды я решил поэкспериментировать с Unity — инфраструктурой, способной на удивительные вещи. Это первая из четырех статей, в которой я расскажу об основах и архитектуре Unity. Я покажу, как создавать двух- и трехмерные игры и, наконец, как вести разработку с ее применением на платформах Windows.
Что такое Unity
Unity — это ядро и инфраструктура, образующие систему для разработки двух- и трехмерных игр или сцен в приложениях (и даже 2.5D). Я упоминаю игры и приложения потому, что встречал не только игры, но и обучающие симуляторы, приложения экстренного реагирования (first-responder applications) и другие приложения, ориентированные на бизнес, которые разрабатывались с помощью Unity и должны были обеспечивать взаимодействие с двух- и трехмерным пространством. Unity позволяет оперировать не только кодом, но и визуальными компонентами с последующим их экспортом на любую распространенную мобильную платформу, а также делать много всего другого, причем бесплатно. (Существует и профессиональная версия, но она не бесплатна. Впрочем, даже бесплатная версия позволяет делать впечатляющие вещи.) Unity поддерживает все основные 3D-приложения, множество форматов звука и даже понимает формат .psd (Photoshop), поэтому вы можете просто закинуть файл .psd в проект на Unity. Unity разрешает импортировать и собирать ресурсы, писать код, взаимодействующий с вашими объектами, создавать или импортировать анимации для использования с продвинутой системой анимации и многое другое.
В Unity проделана потрясающая работа, благодаря которой обеспечивается кросс-платформенная поддержка.
Как видно на рис. 1, Unity обеспечивает кросс-платформенную поддержку, и вы можете сменить платформу буквально одним щелчком кнопки мыши, хотя, если честно, при этом все же требуется приложить определенные усилия, например обеспечить интеграцию с соответствующим платформе магазином для покупок из приложения.
Рис. 1. Платформы, поддерживаемые Unity
Вероятно, самая мощная часть Unity — это Unity Asset Store; пожалуй, лучшая электронная площадка для приобретения игровых ресурсов. Здесь вы найдете все необходимые компоненты для своих игр, такие как художественные решения, трехмерные модели, файлы анимаций для трехмерных моделей (см. контент Mixamo в магазине для более чем 10 000 движений), звуковые эффекты и полные треки, плагины (в том числе, инструментальный набор MultiPlatform, помогающий поддерживать несколько платформ), визуальные скриптовые системы вроде PlayMaker и Behave, продвинутые шейдеры, текстуры, эффекты на основе частиц и др. Интерфейс Unity полностью управляем скриптами и поддерживает интеграцию сторонних плагинов прямо в Unity GUI. Большинство профессиональных разработчиков игр (если не все) использует ряд пакетов из этого магазина ресурсов, и, если вы можете предложить нечто приличное, публикуйте его там.
Microsoft и Unity тесно сотрудничают, чтобы обеспечить полную поддержку для всего стека платформ Microsoft.
И чем Unity не является
Я сомневаюсь, что нужно описывать все, чем Unity не является. Однако Unity по умолчанию не является системой, в которой проектируют двухмерные ресурсы и трехмерные модели (кроме террейнов). Вы можете вставить группу зомби в сцену и управлять ими, но создать самих зомби с помощью инструментария Unity, предлагаемого по умолчанию, нельзя. В этом смысле Unity не является инструментом создания ресурсов, подобным Autodesk Maya, 3DSMax, Blender или даже Adobe Photoshop. Однако существует минимум один сторонний плагин (ProBuilder) для моделирования трехмерных компонентов прямо в среде Unity; также имеются плагины для построения двухмерных миров, например 2D Terrain Editor, позволяющий создавать двухмерные тайловые среды (2D tiled environments). И еще вы можете проектировать террейны в Unity, используя его Terrain Tools, чтобы создавать потрясающие ландшафты с деревьями, травой, горами и т. д. Поэтому я вновь в сомнении: стоит ли очерчивать границы возможностей Unity.
Какова роль Microsoft? Microsoft и Unity тесно сотрудничают, чтобы обеспечить полную поддержку для всего стека платформ Microsoft. Unity поддерживает автономные исполняемые Windows-файлы, приложения Windows Phone, Windows Store, Xbox 360 и Xbox One.
Приступаем к работе
Скачайте самую новую версию Unity и приобретите себе двухкнопочную мышь с нажимаемым колесиком прокрутки. Бесплатная и профессиональная версия скачиваются как единый пакет, который потом лицензируется соответствующим образом. Изучить различия между этими версиями можно на странице unity3d.com/unity/licenses. Editor, который является основным интерфейсом Unity, выполняется в Windows (включая Surface Pro), Linux и OS X.
Разработкой настоящей игры с помощью Unity мы займемся в следующей статье, а пока исследуем интерфейс Unity, структуру проектов и архитектуру.
Архитектура и компиляция
Unity — это игровой движок, написанный на неуправляемом C++. Вы пишете код на C#, JavaScript (UnityScript) или Boo. Ваш код (не код движка Unity) выполняется в Mono или Microsoft .NET Framework и транслируется JIT-компилятором (кроме iOS, которая не поддерживает JIT-код, и для нее код компилируется Mono в неуправляемый код с использованием компиляции Ahead-of-Time [AOT]).
Unity позволяет тестировать вашу игру в IDE, не требуя никакого экспорта или сборки. Запуская код в Unity, вы используете Mono версии 3.5, API которого примерно на одном уровне совместим с .NET Framework 3.5/CLR 2.0.
Вы редактируете свой код в Unity, дважды щелкнув файл кода в представлении проекта. Это действие по умолчанию открывает кросс-платформенный редактор MonoDevelop. При желании можно сконфигурировать в качестве редактора Visual Studio.
Отладка осуществляется с помощью MonoDevelop или с использованием стороннего плагина для Visual Studio — UnityVS. Использовать Visual Studio в качестве отладчика без UnityVS нельзя, потому что при отладке игры вы отлаживаете не Unity.exe, а виртуальную среду в Unity, применяя программный отладчик, который выдает команды и выполняет операции.
Для отладки запустите MonoDevelop из Unity. В MonoDevelop есть плагин, который открывает обратное соединение с отладчиком Unity и выдает ему команды после того, как вы выбираете Debug | Attach to Process in MonoDevelop. С помощью UnityVS вы устанавливаете обратное соединение с отладчиком Visual Studio вместо Unity.
При первом открытии Unity вы увидите диалог проекта, показанный на рис. 2.
Рис. 2. Project Wizard в Unity
В диалоге проекта вы указываете имя и местонахождение своего проекта (1). Вы можете импортировать любые пакеты в проект (2), хотя отмечать все именно здесь не обязательно; список предоставляется только для удобства. Пакет можно импортировать и позже. Пакет — это файл .unitypackage, который содержит предварительно упакованные ресурсы (модели, код, сцены, плагины и все, что можно упаковать в Unity); эти ресурсы можно повторно использовать и распространять. Но не помечайте здесь что-то, если вы не знаете, что это такое; размер вашего проекта может увеличиться, причем весьма значительно. Наконец, вы можете выбрать 2D или 3D (3). Этот раскрывающийся список появился в Unity сравнительно недавно, поскольку до этого в Unity не было серьезного инструментария для разработки двухмерных игр. При выборе 3D настройки по умолчанию устанавливаются в пользу 3D-проекта — это типичное поведение Unity. Если вы выбираете 2D, Unity изменяет несколько вроде бы малых, но на деле очень важных деталей, о которых я расскажу в одной из следующих статей.
Этот список заполняется из файла .unitypackage в определенных местах вашей системы; Unity предоставляет большой выбор при установке. Все, что вы скачиваете из магазина ресурсов Unity, тоже поступает в виде файла .unitypackage и локально кешируется в вашей системе по пути C:\Users\<ваше имя>\AppData\Roaming\Unity\Asset Store. Как таковой, этот файл появится в списке, если он присутствует в вашей системе. Вы могли бы просто дважды щелкнуть любой файл .unitypackage, и он был бы импортирован в ваш проект.
Продолжая рассматривать интерфейс, я щелкну Create в диалоге с рис. 2, чтобы создать новый проект. Разметка окна Unity по умолчанию приведена на рис. 3.
Рис. 3. Окно Unity по умолчанию
Вот что мы видим.
- Project Все файлы в проекте. Для добавления файлов в проект их можно просто перетаскивать из Explorer в Unity.
- Scene Текущая открытая сцена.
- Hierarchy Все игровые объекты в сцене. Обратите внимание на термин GameObjects и раскрывающееся меню GameObjects.
- Inspector Компоненты (свойства) выбранного в сцене объекта.
- Toolbar Ближе к левому краю размещаются кнопки Pan, Move, Rotate, Scale, а в центре — Play, Pause, Advance Frame. Play почти мгновенно запускает игру без выполнения отдельных сборок. Pause приостанавливает игру, а Advance Frame обеспечивает покадровое выполнение, предоставляя вам очень жесткий отладочный контроль.
- Console Это окно может стать понятным не сразу, но в нем отображается вывод процесса компиляции, ошибок, предупреждений и т. д. Кроме того, в нем показываются отладочные сообщения из кода, например Debug.Log будет отображать свой вывод здесь.
Важно упомянуть о вкладке Game рядом с вкладкой Scene. Она становится активной, когда вы щелкаете Play и ваша игра начинает выполняться в этом окне. Это называется режимом игры (play mode) и создает вам игровую площадку для тестирования вашей игры; можно даже «на лету» вносить изменения в игру, переключаясь обратно на вкладку Scene. Но будьте осторожны. Пока подсвечивается кнопка Play, вы находитесь в режиме игры, и, если вы покидаете его, любые изменения, внесенные в режиме игры, будут потеряны. Я, как и почти все разработчики на Unity, с кем мне доводилось разговаривать, именно так теряли проделанную работу, поэтому советую сменить цвет Editor на такой, по которому было бы очевидно, когда вы находитесь в режиме игры. Это можно сделать через Edit | Preferences | Colors | Playmode tint.
Все, что выполняется в вашей игре, существует в сцене.
О сценах
Все, что выполняется в вашей игре, существует в сцене. Когда вы упаковываете игру для какой-то платформы, конечный продукт представляет собой одну или более сцен плюс любой добавленный вами код, специфичный для конкретной платформы. Количество сцен в проекте не ограниченно. Сцену можно рассматривать как уровень в игре, хотя в одном файле сцены может быть несколько уровней — достаточно перемещать игрока (камеру) в другие позиции сцены. Скачивая сторонние пакеты или даже примеры игр из магазина ресурсов, вы обычно должны найти файлы сцен, чтобы открыть их в своем проекте. Файл сцены содержит всевозможные метаданные о ресурсах, используемых в проекте для текущей сцены и ее свойств. Важно почаще сохранять сцену при разработке нажатием клавиш Ctrl+S, как и в любом другом инструментарии.
Как правило, Unity открывает последнюю сцену, с которой вы работали, хотя иногда, когда Unity открывает проект, создается новая пустая сцена, и вам придется искать сцену в Project Explorer. Новичков это сбивает с толку, но важно помнить об этом, если вы вдруг открыли свой последний проект и не можете понять, куда подевалась вся ваша работа! Расслабьтесь, вы найдете искомое в файле сцены, который вы сохранили в своем проекте. Вы можете искать все сцены в проекте, щелкнув значок, показанный на рис. 4, и выбрав в списке Scene.
Рис. 4. Фильтрация сцен в проекте
В сцене вы ничего не увидите без камеры и ничего не услышите без компонента Audio Listener, подключенного к какому-либо GameObject. Но заметьте, что в любой новой сцене Unity всегда создает камеру с подключенным к ней компонентом Audio Listener.
Структура проекта и импорт ресурсов
Проекты Unity не похожи на проекты Visual Studio. Вы не открываете файл проекта или даже решения, потому что таких файлов нет. Вы указываете Unity структуру папок и открываете папку как проект. Проекты содержат папки Assets, Library, ProjectSettings и Temp, но в интерфейсе появляется только папка Assets, что можно было заметить на рис. 4.
Папка Assets содержит все ваши ресурсы: художественную графику, код, звуки; любой отдельный файл, добавляемый в проект, попадает именно в эту папку. Она всегда является папкой верхнего уровня в Unity Editor. Учтите, что изменения следует вносить только через интерфейс Unity, — никогда не пытайтесь делать это через файловую систему.
Папка Library — это локальный кеш для импортированных ресурсов; она содержит все метаданные для ресурсов. В папке ProjectSettings хранятся настройки, заданные вами в Edit | Project Settings. Папка Temp используется для временных файлов, создаваемых Mono и Unity в процессе сборки проекта.
Я хочу еще раз подчеркнуть важность внесения изменений только через интерфейс Unity — не делайте этого напрямую через файловую систему. Это относится даже к простым операциям копирования и вставки. Unity отслеживает метаданные для ваших объектов через редактор, поэтому используйте редактор для любых правок (кроме нескольких редких случаев). Однако вы можете перетаскивать объекты из файловой системы в Unity — такой вариант работает нормально.
Крайне важный GameObject
Практически все в вашей сцене является GameObject. Вспомните System.Object в .NET Framework. От него наследуют почти все типы. Та же концепция относится и к GameObject. Это базовый класс для всех объектов в сцене Unity. Все объекты, показанные на рис. 5 (и многие другие), наследуют от GameObject.
Рис. 5. Класс GameObject в Unity
| Lights | Источники освещения |
| 3D Models | 3D-модели |
| Sprites | Спрайты |
| HUDs | Игровые интерфейсы |
| Particle Systems | Системы частиц |
| GameObject | GameObject |
GameObject довольно прост, так как он относится к окну Inspector. На рис. 6 видно, что к сцене был добавлен пустой GameObject; обратите внимание на его свойства в Inspector. У GameObject по умолчанию нет визуальных свойств, если не считать того, что при выделении этого объекта появляется виджет Unity. На этом этапе это фактически пустой объект.
Рис. 6. Простой GameObject
GameObject имеет свойства Name, Tag (аналог тега text, присваиваемого через FrameworkElement.Tag в XAML или тегу в Windows Forms), Layer и Transform (пожалуй, это свойство самое важное).
Свойство Transform определяет позицию, поворот и масштаб любого GameObject. Unity использует левостороннюю систему координат, в которой координаты на экране компьютера рассматриваются как X (по горизонтали), Y (по вертикали) и Z (глубина, т. е. входящие или исходящие из экрана).
В разработке игр весьма распространено использование векторов, о которых я подробнее расскажу в следующих статьях. А пока достаточно сказать, что Transform.Position и Transform.Scale являются объектами Vector3. Vector3 — это трехмерный вектор; иначе говоря, в нем не более трех точек: только X, Y и Z. Манипулируя этими тремя простыми значениями, вы можете задавать местонахождение объекта и даже перемещать его в направлении вектора.
Свойство Transform определяет позицию, поворот и масштаб любого GameObject.
Компоненты
Вы добавляете функциональность к объектам GameObject добавлением компонентов (объектов Component). Все, что вы добавляете, — это Component, и все они показываются в окне Inspector. Существуют компоненты MeshRender и SpriteRender, компоненты для звука и функционала камеры, компоненты, относящиеся к физике (коллайдеры [colliders] и твердые тела [rigidbodies]), системы частиц, системы поиска пути, сторонние пользовательские компоненты и др. Чтобы назначить код какому-то объекту вы используете скриптовый Component. Компоненты — это как раз то, что оживляет ваши GameObject добавлением функциональности подобно шаблону Decorator в разработке ПО, только их возможности гораздо интереснее.
Я присвою кое-какой код новому GameObject, в данном случае простому кубу, который можно создать через GameObject | Create Other | Cube. Я переименовал куб в Enemy, а затем создал еще один куб. Как видно на рис. 7, я сместил один куб на –15 единиц от другого, что можно сделать с помощью инструмента Move на панели инструментов или нажатием клавиши W после выделения объекта.
Рис. 7. Текущий проект с двумя кубами
Код — простой класс, который находит игрока и перемещает к нему своего владельца. Обычно операции перемещения осуществляются одним из двух способов: либо вы перемещаете объект в новую позицию на каждом кадре, изменяя его свойство Transform.Position, либо вы применяете к нему физический толчок, а в остальном полагаетесь на Unity.
Покадровые операции требуют несколько иного образа мышления, чем просто «переместить в эту точку». Для этого примера я намерен немного смещать объект на каждом кадре, чтобы иметь точный контроль над тем, куда он движется. Если вас не прельщает перспектива работы с каждым кадром, существуют библиотеки, выполняющие покадровые перемещения всего одним вызовом функции, например бесплатная библиотека iTween.
Первым делом я щелкаю правой кнопкой мыши в окне Project, чтобы создать новый скрипт на C# с именем EnemyAI. Для назначения этого скрипта объекту я просто перетаскиваю файл скрипта из представления проекта на объект в представлении Scene или Hierarchy, и этот код связывается с объектом. Остальное берет на себя Unity. Вот так просто.
На рис. 8 показан куб Enemy с назначенным ему скриптом.
Рис. 8. Enemy со связанным скриптом
Взгляните на код на рис. 9 и обратите внимание на открытую переменную. Если вы смотрите на код в Editor, то заметите, что моя открытая переменная появляется с параметром для переопределения значений по умолчанию в период выполнения. Это очень удобно. Вы можете менять значения по умолчанию в GUI для элементарных типов, а также можете предоставлять открытые переменные (но не свойства) многих других объектных типов. Если я перетаскиваю этот код на другой GameObject, создается совершенно отдельный экземпляр этого компонента кода. Это базовый пример, и его можно расширить, добавив, скажем, компонент RigidBody к этому объекту, но я не стану усложнять пример.
Рис. 9. Скрипт EnemyAI
В коде я могу получить ссылку на любой компонент, предоставляемый в редакторе. Кроме того, можно назначать скрипты для GameObject, каждый со своими методами Start и Update (и многими другими методами). Предполагая, что компоненту скрипта, содержащему этот код, требуется ссылка на класс EnemyAI (компонент), я могу просто запросить этот компонент:
После изменения кода в MonoDevelop или в своем любимом редакторе кода и последующего возврата в Unity вы обычно наблюдаете небольшую задержку. Это связано с тем, что Unity выполняет фоновую компиляцию вашего кода. Редактор кода (но не отладчик) можно сменить через Edit | Preferences | External Tools | External Script Editor. Любые проблемы при компиляции в самой нижней строке состояния на экране Unity Editor, так что посматривайте туда. Если вы попытаетесь запустить игру с ошибками в коде, Unity этого не позволит.
Написание кода
В предыдущем примере кода два метода: Start и Update; класс EnemyHealth наследует от базового класса MonoBehavior, что позволяет просто назначить этот класс объекту GameObject. В этом базовом классе богатая функциональность, и, как правило, вы чаще всего будете использовать несколько методов и свойств. Основными методами являются те, которые Unity будет вызывать, если они присутствуют в вашем классе. Таких методов немало — подробности см. по ссылке bit.ly/1jeA3UM. Несмотря на множество методов вы, как правило, используете лишь некоторые из них. Ниже перечислены наиболее распространенные методы, подлежащие реализации в ваших классах, производных от MonoBehavior.
Awake Этот метод вызывается один раз для каждого объекта при его первой инициализации. Другие компоненты могут быть еще не инициализированы, поэтому этот метод обычно используется для инициализации текущего GameObject. Для инициализации производного от MonoBehavior класса следует всегда использовать этот метод, а не его конструктор. И не пытайтесь запрашивать здесь другие объекты сцены, так как они могут быть еще не инициализированы.
Start Этот метод вызывается на первом кадре жизненного цикла объекта, но перед любыми методами Update. Он может показаться очень похожим на Awake, но в случае Start уже известно, что другие объекты инициализированы через Awake и существуют в вашей сцене, поэтому вы можете запрашивать другие объекты, например:
Update Этот метод вызывается в каждом кадре. И насколько же это часто, спросите вы? Ну, это полностью зависит от скорости вычислений. Поскольку нагрузка на вашу систему постоянно меняется при рендеринге разных вещей, каждую секунду частота кадров варьируется. Вы можете щелкнуть кнопку Stats на вкладке Game при переключении в игровой режим, чтобы видеть текущую частоту кадров (рис. 10).
Рис. 10. Получение статистики
FixedUpdate Этот метод вызывается фиксированное число раз в секунду независимо от частоты кадров. Поскольку Update вызывается варьируемое число раз в секунду и не синхронизируется с движком физики, обычно лучше всего использовать FixedUpdate, когда к объекту нужно приложить силу или какие-то другие действия, относящиеся к физике. По умолчанию FixedUpdate вызывается каждые 0,02 секунды, а значит, Unity выполняет вычисления физики каждые 0,02 секунды (этот интервал называется Fixed Timestep и может регулироваться разработчиком) — опять же независимо от частоты кадров.
Проекты кода, генерируемые Unity
Как только в вашем проекте появляется код, Unity создает один или более файлов проектов в вашей корневой папке (которая невидима в интерфейсе Unity). Это не двоичные файлы движка Unity, а проекты для Visual Studio или MonoDevelop, в которых вы будете редактировать и компилировать свой код. Unity может создавать очень много отдельных проектов, как показано на рис. 11, но каждый из них выполняет важную роль.
Рис. 11. Проекты, создаваемые Unity
Если ваш проект Unity прост, вы увидите не все из этих файлов. Они создаются, только когда у вас есть код, помещаемый в различные специальные папки. Проекты, показанные на рис. 11, делятся всего на три типа:
- Assembly-CSharp.csproj;
- Assembly-CSharp-Editor.csproj;
- Assembly-CSharp-firstpass.csproj.
Для каждого из этих проектов имеется проект-дубликат, созданный с добавлением «-vs» в его имя, например Assembly-CSharp-vs.csproj. Эти проекты используются, если вашим редактором кода является Visual Studio, и их можно добавлять в ваш проект, экспортированный из Unity, для отладки на специфической платформе в решении Visual Studio.
Прочие проекты служат той же цели, но «CSharp» заменяется «UnityScript». Это просто JavaScript-версии проектов (UnityScript), которые будут присутствовать, если вы используете JavaScript в своей Unity-игре и если у вас есть скрипты в папках, которые инициируют создание этих проектов.
Теперь, когда вы увидели, какие проекты создаются, я исследую папки, инициирующие создание этих проектов, и покажу, каково их предназначение. Путь к каждой папке относителен корневой папке /Assets в представлении вашего проекта. Assets всегда является корневой папкой и содержит все файлы ресурсов. Например, Standard Assets — это на самом деле /Assets/Standard Assets. Процесс компиляции ваших скриптов выполняется в четыре этапа и генерирует сборки (assemblies). Объекты, скомпилированные на этапе 1, не видят объекты, компилируемые на этапе 2, так как на этот момент они еще не скомпилированы. Это важно понимать, когда вы смешиваете UnityScript и C# в одном проекте. Если вам нужно ссылаться на C#-класс из UnityScript, вы должны убедиться, что он компилируется на более раннем этапе.
Этап 1 охватывает скрипты периода выполнения в папках Standard Assets, Pro Standard Assets и Plug-ins, которые находятся в папке /Assets. На этом этапе создается проект Assembly-CSharp-firstpass.csproj.
Скрипты этапа 2 находятся в папках Standard Assets/Editor, Pro Standard Assets/Editor и Plug-ins/Editor. Последняя папка предназначена для скриптов, которые взаимодействуют с Unity Editor API для использования функциональности этапа разработки (считайте это аналогом плагина Visual Studio, расширяющего ее GUI, только выполняемого в Unity Editor). На этом этапе создается проект Assembly-CSharp-Editor-firstpass.csproj.
Этап 3 охватывает прочие скрипты вне папки Editor. На этом этапе создается проект Assembly-CSharp-Editor.csproj.
Этап 4 охватывает все остальные скрипты (находящиеся внутри любой другой папки Editor, например /Assets/Editor или /Assets/Foo/Editor). На этом этапе создается проект Assembly-CSharp.csproj.
Есть пара других, реже используемых папок, которые я здесь не рассматриваю, скажем, Resources. И остается вопрос, а какой компилятор применяется? Из .NET? Mono? Из .NET для Windows Runtime (WinRT)? Из .NET для Windows Phone Runtime? В табл. 1 перечислены компиляторы по умолчанию для разных случаев. Это важно знать, особенно в приложениях на основе WinRT, так как состав API для разных платформ варьируется.
Табл. 1. Компиляторы
| Платформа | Сборки игры, генерируемые | Окончательная компиляция выполняется |
| Windows Phone 8 | Mono | Visual Studio/.NET |
| Windows Store | .NET | Visual Studio/.NET (WinRT) |
| Windows Standalone (.exe) | Mono | Unity генерирует .exe + библиотеки |
| Windows Phone 8.1 | .NET | Visual Studio/.NET (WinRT) |
Когда вы выполняете компиляцию для Windows, Unity отвечает за вызовы, которые генерируют игровые библиотеки (DLL) из вашего кода на C#/UnityScript/Boo и включают стандартные библиотеки самой Unity. В случае Windows Store и Windows Phone 8 будет экспортироваться решение Visual Studio, кроме ситуации с автономным исполняемым файлом (Windows Standalone), где Unity генерирует .exe и необходимые файлы .dll. Я рассмотрю различные типы компиляции в заключительной статье из этой серии, где мы обсудим специфику конкретных платформ. Рендеринг графики на низком уровне выполняется на платформах Windows с помощью DirectX.
Разработка игры в Unity — процесс довольно прямолинейный.
- Включите свои ресурсы (художественную графику, звуки и т. д.). Используйте магазин ресурсов. Нарисуйте свою графику. Наймите художника. Заметьте, что Unity полностью поддерживает Maya, Cheetah3d, Blender и 3dsMax, в некоторых случаях требуя, чтобы для работы с соответствующими форматами трехмерной графики было установлено какое-либо ПО, и изначально работает с распространенными файловыми форматами .obj и .fbx.
- Напишите код на C#, JavaScript/UnityScript или Boo, чтобы управлять своими объектами, сценами и чтобы реализовать игровую логику.
- Тестируйте в Unity. Экспортируйте на выбранную платформу.
- Тестируйте на этой платформе. Развертывайте.
Заключение
Эта статья была обзором архитектуры и процессов в Unity. Я рассказал об интерфейсе, основах назначения кода, объектах GameObject, компонентах, Mono, .NET и о некоторых других вещах. Это позволит мне в следующей статье углубиться в сборку компонентов для двухмерной игры. Заглядывайте в Microsoft Virtual Academy, где в конце лета я собираюсь устроить двухдневное мероприятие по обучению Unity. И следите за региональными мероприятиями на unity3d.com/pages/windows/events.
Адам Тьюлипер (Adam Tuliper) — старший идеолог по технологиям в Microsoft; живет в солнечной Южной Калифорнии. Разработчик инди-игр, один из администраторов Orange County Unity Meetup и автор на pluralsight.com. Скоро в его семье появится третий ребенок, так что связывайтесь с ним, пока у него еще есть свободные минуты, по адресу adamt@microsoft.com или через twitter.com/AdamTuliper.
Выражаю благодарность за рецензирование статьи экспертам Мэтту Ньюмену (Matt Newman) из Subscience Studios, Хайме Родригесу (Jaime Rodriguez) из Microsoft и Тоутвидасу Цилису (Tautvydas Žilys) из Unity.
Unity. Один движок, много возможностей
Как вы наверняка уже знаете, Unity — это не только коллективный разум, с которым развлекался Рик в одном из эпизодов «Рика и Морти», но и среда разработки — игровой движок. Однако область его применения далеко не ограничивается одними лишь играми. В этой статье мы приведем несколько примеров использования Unity.
Немного про Unity
Сторонники Unity не устают говорить о его простоте, удобстве и интуитивно понятном интерфейсе. Разработка игр в Unity, по их словам, не требует особых знаний. Удобный и функциональный графический редактор движка позволяет создавать и тестировать объекты в реальном времени. Кроме того, Unity имеет внушительную библиотеку ассетов и плагинов. А также возможность добавлять в игру целые заготовки без какой-либо возни с программированием. Unity поддерживает множество платформ и технологий. Созданные в движке продукты, могут работать на VR- и AR-устройствах. Еще один немаловажный плюс: пока доход от игр, созданных на базе Unity не превышает $100 тыс. за последние 12 месяцев, движком можно пользоваться бесплатно и без ограничений в функционале. Лицензия «Plus» стоит $40 в месяц и необходима при доходе до $200 тыс. в год, а если годовой доход превышает $200 тыс., то за $150 в месяц вы получите лицензию «Pro».
Разумеется, никто не совершенен. Недостатки есть и у Unity. Например, чтобы написать скрипты и компоненты для более сложных проектов, а потом еще и заставить их работать, потребуется уверенное знание C#. Также Unity можно упрекнуть в медлительности. Масштабные сцены негативно сказываются на производительности игры. Плюс к этому, приложения написанные для мобильных платформ, придется хорошенько оптимизировать, чтобы облегчить под смартфоны и планшеты.
Среди многих до сих пор бытует стереотипное мнение, что движок годен только для создания небольших инди-игр. Однако это давно не актуальное представление о Unity. Мы поговорили с разными Unity девелоперами, чтобы они рассказали нам о том, где и как они применяют свои знания.
Применение в казуальных играх

Маркианов Никита. Unity Developer в компании Appreal.
С Unity я познакомился, когда делал диплом. Сразу после универа нашел работу, и вот уже 3.5 года, может чуть больше, работаю Unity девелопером в компании. Сейчас я занимаюсь разработкой казуальных игр в Appreal.
Иногда бывают задачи, связанные с анимацией, оптимизацией, UI, но в текущее время моя зона ответственности — кор геймплейной логики. Это основные правила игры. Если взять матч 3, то тайлы должны падать, если совместить три тайла, они должны сматчиться, если больше трех — создать новый тайл (бустер, например). Эта пошаговая логика записана в коре. А клиент просто дает ему задачу. Вот мы нажали по таким координатам на такую-то клетку, кор это все просчитывает, записывает список событий, а потом возвращает клиенту, а он эти все события отрисовывает.
Мне нравится этот подход отделения кора логики геймплея от клиентской логики. Благодаря этому мы разом получаем список всех событий. В коре они происходят за один тик (кадр), а клиент уже может отрисовывать их с анимацией, ждать завершения других анимаций и так далее.
Это все еще и намного проще дебажить. Отдельно можно протестировать кор и сразу понять, что проблема именно в нем и фиксить уже его. А если кор впорядке, но все равно что-то не работает, значит дело уже в клиенте. Это очень хороший подход.
Почему ты выбрал именно Unity?
Когда я начинал, то попробовал Unity, Unreal Engine и CryEngine. Тогда я был ноль во всех трех. В Unity все интуитивно понятно. Я быстро начал ориентироваться в сцене и в том, как это вообще работает. В остальных движках я такого не заметил. Поэтому я выбрал Unity.
Unity хорошо справляется с игровыми мобильными приложениями. А как движок справляется с задачами посложнее? Можно ли доверить ему охрану дома, например, или лучше завести собаку?
Охранное ПО и Air Consol

Ильчишен Александр. Front-end developer в компании SweetSoft
Одно время я работал в словацкой компании Gamanet . Они занимались охранными системами и делали свой софт с использованием Unity. У них очень много контрактов с компаниями, выпускающими охранное оборудование, под которое они делают драйвера для работы своей системы.
Windows версия их приложения была написана не очень красиво. И они решили сделать 3D версию с использованием Unity, для объединения всех охранных систем. По проекту делали здание и по чертежам размещали в нем охранное оборудование. Они использовали там очень много систем, вплоть до распознавания лиц, номеров и так далее. И все это в таком масштабном, красивом 3D. Человек, использующий программу, мог смотреть где и что происходит, прямо как в Симс. Вот такая у них была задумка.
Мне очень нравилось там работать. До этого я вообще не представлял, что Unity можно использовать в каких-то не игровых целях. Вообще, очень многое из того, что у меня сейчас получается, происходит благодаря курсу «Unity 3D Developer». Раньше я боялся искать работу. Думал, а вдруг я не справлюсь, или подведу человека, который будет рассчитывать на меня. После курсов появилась уверенность в себе. Я хотел, чтобы полученные знания окупили себя. Это нормальная практика.
Что ты делал для охранного ПО?
В основном, фикс UI проблем.
Была задача сделать одну рамку. По задумке она располагается над зданием. Когда ты ее опускаешь, она делает срез по зданию и отрисовывает план на том уровне, на котором находится. Она состоит из четырех граней. По центру каждой грани шар, за который можно тянуть. Нужно было на объекты вешать скрипты, которые реагировали на клик, на то, что ты тянешь, и изменяли размер рамки. Это была одна из самых сложных задач.
На самом деле много полезных вещей можно делать на Unity. Например, сейчас для диплома я буду делать игрушку на Air Consol. Это сервис, который позволяет прямо в окне браузера запустить приложение и через QR код подключить смартфон в роли контроллера. Вы можете сидеть пять-шесть человек возле одного экрана и играть прямо в браузере. И у них есть API для Unity. То есть на Unity можно собирать игрушки и загружать туда.
Расскажи подробней
Плагин Air Consol позволяет дебажить, настраивать контроллеры и так далее. Сам контроллер, который будет отображаться на смартфоне, пишется на HTML, а обработчики для кликов и так далее — на JS. Они там между собой общаются, а Unity ловит их сообщения, читает и выполняет заданные функции. Ты можешь себе на телефоне отобразить, допустим, health bar персонажа, и когда ему наносят урон, то его значение будет уменьшаться.
Air Consol легковесная. Никакого супер железа тебе не нужно, потому что все запускается в облаке. Единственное, должно быть достаточно оперативной памяти. Игрушки там, конечно, не сильно мудреные, но на пару часов зависнуть с друзьями хватает.
Вот это уже что-то. Охранное приложение в 3D и консоль с вычислениями в облаке и смартфонами вместо контроллеров. Вполне в духе футуризма. Что дальше? Продвижение бизнеса и обучение в VR?
AR- и VR- приложения

Андрей Горлов. Junior Unity Developer в студии по созданию интерактивных решений для бизнеса в VR\AR
Я закончил техникум на программиста, потом универ по той же специальности. Весь этот период я то хотел заниматься программированием, то не хотел. После окончания универа я подумал, что мне это не интересно. Тогда я хотел заниматься видеосъемкой, монтажом и прочим в этом же духе. Спустя два года экспериментов, узнал, что есть Unity, и с его помощью можно создавать игры. Я начал изучать этот движок самостоятельно.
Когда я начал искать работу, то долго не мог пройти собеседования. Тестовые задания я делал, но теоретическую часть валил. Потом мне посоветовали курс «Unity 3D Developer» и я прошел его удаленно.
На защите наших дипломов познакомился с крутыми ребятами, которые предложили мне стать частью их стартапа. Я согласился. Спустя какое-то время мы, конечно, притихли, но главное в том, что познакомился с единомышленниками, с которыми и по сей дней общаемся.
Спустя полгода после окончания курса, я прошел собеседование в студии, в которой сейчас работаю, сделал тестовое задание и через две недели приступил к работе — ровно через год после того, как поступил на курсы.
Студия занимается разработкой решений дополненной и виртуальной реальности для продвижения бизнеса. Проекты, которыми я занимался — это программы для интерактивного обучения на производстве. Также я делал интерактивную селфи-стену и симулятор гольфа в VR.
Ты занимаешься проектами от начала до конца или подключаешься на каком-то этапе?
Есть проект, в который я влился и делаю его. Есть проекты с нуля. Мне дают задачу, тз, дают графику, которая должна использоваться и я приступаю к работе.
Из-за карантина нас распустили на удаленную работу. Так как нет возможности часто быть в офисе для тестирования проектов в VR, я беру VR-шлем домой, чтобы тестировать текущие проекты. Теперь понимаю, насколько круто, когда есть личный шлем. Особенно в сложившейся ситуации.
Что ты можешь сказать о Unity?
Все свое время обучения, я считал Unity игровым движком. Я знал, что можно делать какие-то AR и VR решения, но думал, что это очень сложно. Я представлял, что программирование “не игр” — это скучно. Сейчас моё мнение значительно изменилось.
Мне кажется, это одна из самых простых сред для того, чтобы делать что-то интересное.
Я не хотел заниматься программированием, только из-за того, что нельзя было пощупать результат своей работы. Unity мне понравился тем, что я могу визуализировать свои идеи. Это первое. А второе, это то, что за технологиями VR и AR стоит будущее, которое шаг за шагом уже наступает, а Unity очень хорошо помогает в его создании.
Заключение
Как видим, Unity неплохо показал себя и в виртуальной реальности. Кроме того, он давно вышел за рамки небольших инди-компаний. Например, Toyota использует его для разработки VR- и AR-инструментов, повышающих эффективность и качество дизайна, проектирования и обучения. А в Audi с помощью Unity создают иммерсивные и интерактивные среды в реальном времени, улучшая процесс взаимодействия сотрудников и ускоряя ход разработки и инноваций.
Unity — это многофункциональный инструмент для реализации идей. Он включен в пайплайн многих крупных компаний. Чтобы получить знания, необходимые для востребованного современного специалиста, записывайтесь на курс «Unity 3D Developer», как сделали это в свое время герои статьи.