Введение в Unity2D

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

Версия: C# 7.3, Unity 2020.3, Unity

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

В этом уроке вы создадите 2D-игру для космического корабля и по пути освоите следующие навыки:

  • Как работать со спрайтами и камерой.
  • Все о компонентах Physics 2D и о том, как обрабатывать столкновения и игровой процесс.
  • Как настроить 2D-анимацию и состояния.
  • Как порядок слоев и спрайтов влияет на 2D-игру.

Материалы для урока были созданы в Unity версии 2020.3. Вы можете скачать эту версию на странице загрузок Unity.

Примечание. Если вы новичок в Unity, то можете прочитать урок «Введение в Unity», чтобы быстрее освоиться.

Приступая к работе

Скачайте файлы проекта для выполнения урока, нажав на кнопку «Скачать материалы урока» вверху страницы.

Распакуйте содержимое архива. Затем откройте стартовый проект в Unity.

Откройте сцену Lander, расположенную в папке Scenes окна проекта. В режиме просмотра игры вы должны увидеть что-то похожее на следующее:

Окно просмотра Game в начальном проекте редактора Unity

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

Готовы к взлету и опасному спуску к ближайшей посадочной площадке? Пора начинать!

Примечание. 2D-игры в Unity — вполне логично — используют 2D-режим редактора Unity. Вы можете выбрать режим 2D или 3D, когда создаете проект с нуля. Эта опция уже установлена в стартовом проекте.

Выберите 2D в окне создания проектов Unity

Спрайты в Unity

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

Короче говоря, со спрайтами легко работать в Unity благодаря отличному рабочему процессу 2D и встроенному редактору.

Чтобы добавить спрайт в игру, перетащите его из папки Project в окно Scene. Чтобы убедиться в простоте этого процесса, сначала выберите режим просмотра Scene. Затем перетащите спрайт playership из папки Sprites в окно Scene:

Перетаскивание спрайтов в окно Scene редактора Unity

В Иерархии нажмите на игровой объект Unity playership и просмотрите его детали в Инспекторе. Обратите внимание, что Unity автоматически подключила компонент Sprite Renderer, содержащий спрайт космического корабля, к игровому объекту:

Настройки компонента Sprite Renderer в окне Inspector редактора Unity

Это все, что нужно! Sprite Renderer позволяет отображать изображения как спрайты в 2D и 3D сценах.

Теперь удалите игровой объект playership из Иерархии.

Режимы спрайтов

Нажмите на спрайт в папке Assets / Sprites. В Инспекторе есть три разных режима, в которых можно использовать спрайты:

Переключение режимов спрайта в окне Inspector редактора Unity

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

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

Таблица спрайтов с разными изображениями двигателя космического корабля в Unity

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

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

Редактирование спрайтов

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

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

Assets / Sprites / Explosion / explosion-spritesheet.png уже был нарезан и подготовлен в виде анимации, но Assets / Sprites / thruster-spritesheet.png все еще требует некоторого внимания.

Таблица спрайтов с набором кадров в Unity

Нарезка таблиц спрайтов

Нажмите на Assets / Sprites / thruster-spritesheet.png в окне проекта. В Инспекторе для режима спрайтов уже установлено значение Multiple (если нет, измените его и нажмите на Apply).

Затем нажмите на Sprite Editor:

Откройте редактор спрайтов Unity

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

Редактор спрайтов не установлен по умолчанию в Unity

Это предупреждение появляется при первой попытке открыть редактор спрайтов.

Перейдите в Window > Package Manager. В раскрывающемся списке Packages выберите Unity Registry и найдите 2D Sprite. Нажмите на Install, чтобы добавить инструменты в свой проект.

Добавление редактора спрайтов в окне Package Manager редактора Unity

Вернитесь к thruster-spritesheet.png и снова нажмите Sprite Editor. Появится новое окно, в котором таблица спрайтов будет автоматически разделена на отдельные кадры (числа были добавлены в иллюстративных целях и не являются частью снимка экрана):

Отдельные кадры спрайта в Unity

Нажмите на Slice в верхнем левом углу окна, заметив, что Automatic является типом нарезки по умолчанию:

Разделение спрайта на кадры происходит автоматически в Unity

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

Настройка нарезки спрайтов

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

Нажмите на Grid by Cell Size в меню Slice редактора спрайтов:

Настройка Grid by Cell Size для разделения спрайта на кадры в Unity

В разделе Pixel Size введите 9 для X и 32 для Y. Оставьте остальные значения равными 0, а для Pivot установите значение Center. Затем нажмите Slice:

Настройка кадров в таблице спрайта редактора Unity

Нажмите на Apply в окне Sprite Editor, чтобы применить изменения:

Кнопка применения изменений для сохранения настроек спрайта в Unity

Хорошо! Теперь таблица спрайтов двигателя готова к использованию, и вы можете закрыть редактор спрайтов.

Назначение спрайтов космическому кораблю

Прямо сейчас вы не можете увидеть посадочный модуль в игре. Это потому, что к нему не прикреплены какие-либо компоненты Sprite Renderer. Не будет ни эффектных посадок, ни аварий! — если посадочный модуль не отображается на экране.

Чтобы исправить это, нажмите на игровой объект Lander в Иерархии. В Инспекторе нажмите на Add Component, а затем введите Sprite Renderer в текстовое поле поиска. И наконец, выберите компонент Sprite Renderer.

Теперь нажмите на значок маленького кружка рядом с полем Sprite в свойствах компонента и выберите спрайт playership:

Добавление игровому объекту космического корабля спрайта в окне Inspector редактора Unity

Установите параметр Order in Layer на 1. Подробнее об этом позже!

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

Нажмите на игровой объект LanderFeet, расположенный под игровым объектом Lander. Затем на значок маленького кружка рядом с полем Sprite в свойствах компонента Sprite Renderer. И наконец, выберите спрайт lander-feet в окне Select Sprite, как показано на изображении:

Установка спрайта для ступеней космического корабля в окне Inspector редактора Unity

Нажмите на Play; вы сможете увидеть посадочный модуль в окне Game. Используйте WASD или клавиши со стрелками, чтобы летать по экрану:

Космический корабль оторвался от поверхности и полетел в окне Game редактора Unity
Хьюстон, у нас взлет!

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

2D-камера и количество пикселей на единицу

2D-проекты Unity по умолчанию имеют ортогональный вид камеры. Как правило, вы будете придерживаться этого в своих 2D-играх, а не использовать перспективный вид камеры. Вы можете узнать больше о различиях между ними во второй части урока «Введение в Unity».

На изображении ниже показана конфигурация камеры по умолчанию для Main Camera:

По умолчанию параметр проекции камеры установлен как ортографический в окне Inspector редактора Unity

Как отмечалось выше, для свойства Projection установлено значение Orthographic.

Выберите спрайт playership в окне проекта и посмотрите его настройки импорта в инспекторе. Для свойства Pixels Per Unit в настоящее время установлено значение по умолчанию 100:

Установка значений параметра Pixel Per Unit для спрайта в окне Inspector редактора Unity

Итак … что в данном случае означает 100?

Слово о пикселях на единицу

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

Рассмотрим спрайт, импортированный из изображения шириной 500 пикселей. В таблице ниже показано, как будет изменяться ширина игрового объекта по оси x при рендеринге спрайта с использованием разных значений пикселей на единицы в разных масштабах:

Таблица вычислений ширины пикселя за единицу в Unity

Все еще не совсем понятно? Следующий сценарий поможет вам продумать, что происходит с преобразованием единиц измерения.

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

Assets / Sprites / backdrop.png имеет высоту 2048 пикселей и соотношение пикселей на единицу по умолчанию, равное 100. Если вы посчитаете, вы обнаружите, что игровой объект Backdrop в Иерархии будет иметь высоту 20,48 единиц.

Однако свойство размера ортогональной камеры измеряет только половину высоты экрана, поэтому, чтобы соответствовать точной высоте игрового объекта Backdrop на экране в полноэкранном режиме, вы должны использовать ортогональный размер 10,24:

Наглядное объяснение значения Pixel Per Unit в Unity

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

Галактика, которой нужно гордиться

Свойство Max Size в настройках импорта спрайта позволяет определить максимальный размер спрайта, измеряемый в пикселях. Вы можете переопределить этот параметр для каждой платформы, на которую вы планируете настроить таргетинг.

Увеличьте масштаб изображения фона синей галактики. Обратите внимание, что изображение немного размыто; когда вы импортируете спрайт, свойство Max Size по умолчанию имеет значение 2048. Unity пришлось уменьшить изображение, чтобы оно соответствовало размеру текстуры по умолчанию, что привело к потере качества изображения.

Чтобы решить проблемы с изображением, выберите спрайт фона backdrop в окне Project. Затем в окне Inspector выберите Override for PC, Mac & Linux Standalone Settings (вкладка, которая выглядит как монитор компьютера).

Затем установите флажок на Override for PC, Mac & Linux Standalone и измените Max Size на 4096. Нажмите Apply и подождите несколько секунд, пока Unity снова импортирует фон окна сцены. Вы увидите, что фон внезапно стал четким и ясным:

Изменение максимального размера текстуры в Unity

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

Увеличение размера

Однако за эту верность приходится платить. Проверьте область предварительного просмотра Инспектора, показанную ниже; размер фоновой текстуры теперь составляет 4,0 МБ, по сравнению с предыдущими 1,0 МБ:

Размер файла текстуры в Unity

Увеличение размера текстуры увеличило объем памяти в 4 раза.

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

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

Текстуры

Вы также можете изменить формат текстуры, как показано ниже:

Настройки формата текстуры в Unity

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

Использование формата Crunched позволяет вам установить значение ползунка качества сжатия. Значение сжатия 50% требует много времени для сжатия, но дает вам минимально возможный размер файла, и вы можете настроить его еще больше.

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

Итоговые настройки текстуры фона в Unity

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

2D-коллайдеры и физика

Unity позволяет настраивать гравитацию для 2D-системы Physics так же, как в 3D-играх. Настройки гравитации Unity по умолчанию для нового проекта такие же, как гравитация: по определению 9,80665 м / с2. Но вы садите свой космический корабль на Луну, а не на нашу планету, а гравитация на Луне составляет примерно 16,6% земной, или 1,62519 м / с2.

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

Чтобы изменить гравитацию для игры, нажмите Edit > Project Settings Затем выберите вкладку Physics 2D и используйте панель Physics 2D, чтобы изменить значение Y параметра Gravity с -1 на -1,62519:

Установка параметров гравитации в настройках двумерной физики редактора Unity
Вещи скоро станут весомые!

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

Столкновение с объектами

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

Каждый объект, который будет взаимодействовать с гравитацией и другими физическими объектами должен иметь компоненты Collider 2D и Rigidbody 2D.

Выберите игровой объект Lander в Иерархии.

Настройки компонентов Rigidbody и Collider игрового объекта в Unity

Вы увидите прикрепленные компоненты Rigidbody 2D и Polygon Collider 2D. Добавление компонента Rigidbody 2D к спрайту переводит его под контроль 2D-физической системы Unity.

Краткий урок по компонентам физики

Сам по себе компонент Rigidbody 2D означает, что гравитация будет влиять на игровой объект, к которому он прикреплен. Он также позволяет вам управлять объектом из скриптов, используя методы, связанные с Physics2D, которые применяют к нему силы.

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

Полигональные 2D-коллайдеры более требовательны к производительности, чем другие простые коллайдеры, такие как 2D-компоненты Box или Circle Collider, но они делают возможным более точное физическое взаимодействие между объектами. Всегда используйте самую простую форму коллайдера, которую вы можете использовать в своей игре, чтобы обеспечить максимальную производительность.

Сталкивающиеся многоугольники

Изучите коллайдер на космическом корабле, выбрав игровой объект Lander в Иерархии и нажав Edit Collider на Polygon 2D Collider:

Кнопка для редактирования коллайдера игрового объекта в Unity

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

Редактирование полигонального коллайдера игрового объекта в Unity

Оставьте форму коллайдера Lander как есть.

Примечание. Код в скрипте Lander.cs, прикрепленном к игровому объекту Lander, использует OnCollisionEnter2D для обработки столкновений с другими объектами в игровой сцене. Если величина силы столкновения превышает определенный порог, посадочный модуль будет разрушен.

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

В Иерархии дважды нажмите на игровой объект LanderObjective, чтобы сфокусироваться на посадочной площадке. Используя Инспектор, нажмите Add Component и выберите Box Collider 2D:

Прямоугольный двумерный коллайдер игрового объекта в Unity

Unity добавляет компонент Box Collider 2D в игровой объект LanderObjective и автоматически изменяет размер коллайдера в соответствии с размером спрайта.

Прямоугольный двумерный коллайдер для платформы космического корабля в Unity

Клево!

Еще несколько вещей

При работе с компонентами Rigidbody и 2D Collider следует иметь в виду еще несколько вещей:

  • Измените Rigidbody, чтобы использовать тип тела Kinematic, если вы хотите перемещать свои физические тела с помощью компонента преобразования вместо того, чтобы позволять только гравитации влиять на них. Чтобы оставить их под контролем гравитации Unity, используйте Dynamic. Если они вообще не будут двигаться, установите для них Static.
  • Вы также можете изменять массу, линейное сопротивление, угловое сопротивление и другие физические свойства компонентов Rigidbody.
  • Коллайдеры можно использовать в режиме триггера; они не будут физически сталкиваться с другими физическими объектами. Вместо этого они позволяют вашему коду реагировать на событие с помощью метода OnTriggerEnter2D, доступного во всех скриптах MonoBehaviour.
  • Для обработки событий столкновения в коде скрипта используйте OnCollisionEnter2D, который доступен во всех скриптах MonoBehaviour.
  • Вы можете назначить дополнительные ссылки Physics2D Material 2D коллайдерам для управления такими свойствами, как упругость или трение.

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

Если на сцене редактора Unity множество объектов, то можно подумать использовать двумерные полигональные коллайдеры
Вы можете пересмотреть свою стратегию использования 2D-компонентов Polygon Collider, если у вас много сталкивающихся объектов!

Анимация космического корабля

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

Unity Анимация 101

Чтобы назначить анимацию игровому объекту в сцене, прикрепите компонент Animator к игровому объекту или объектам, которые вы хотите анимировать. Для этого компонента требуется ссылка на Animator Controller, который определяет, какие анимационные клипы использовать и как управлять этими клипами, а также с другими «более интересными» эффектами, такими как смешивание и переход анимаций.

Контроллер Animator для двигателей

В Иерархии разверните игровой объект Lander, чтобы открыть четыре других вложенных игровых объекта. Выберите ThrusterMain; вы увидите, что к нему уже прикреплен компонент Animator, но он не ссылается на контроллер Animator:

Компонент Animator игрового объекта без назначенного контроллера в Unity

Не снимая выделения с игрового объекта ThrusterMain, перейдите на вкладку редактора Animation. Если вы не видите эту вкладку в главном окне редактора, откройте ее, выбрав Window > Animation > Animation:

Как открыть окно Animation в меню редактора Unity

При выбранном игровом объекте в Иерархии, в окне Animation будут отображаться анимации, связанные с этим игровым объектом — точно так же, как окно Inspector показывает компоненты, связанные с этим игровым объектом. Нажмите Create, чтобы создать анимационный клип для ThrusterMain:

Создание анимационного клипа в Unity

Введите имя ThrusterAnim и поместите его в папку Assets / Animations.

Теперь вы должны увидеть два новых ассета анимации в папке Animations в окне Project. ThrusterAnim — это анимационный клип, который будет содержать анимацию для эффекта двигателя, а ThrusterMain — это контроллер аниматора, который будет управлять анимацией:

Создание анимационного клипа в Unity

Вы увидите временную шкалу анимации в окне Animation; здесь вы можете разместить и упорядочить отдельные кадры спрайта двигателя космического корабля.

Нажмите на Add Property и выберите Sprite Renderer / Sprite в качестве типа свойства для анимации:

Кнопка добавления свойства в окне Animation редактора Unity

Добавление свойства анимации в Unity

Теперь редактор должен выглядеть так:

Панель шкалы времени в окне Animation редактора Unity
Время работать над графиком

Работа над шкалой времени анимации

В окне Project нажмите на папку Sprites и разверните спрайт thruster-spritesheet.png. Выделите четыре нарезанных спрайта двигателя и перетащите их на временную шкалу ThrusterMain: Sprite в редакторе анимации.

Кадры спрайтов в итоге сгруппированы вместе на шкале времени; вы можете исправить это сами. Начните с самого правого спрайта; нажмите на спрайт, перетащите его вправо и разместите примерно на 0:05 от его соседа:

Назначение кадров спрайта анимации игровому объекту в Unity

Выберите последний кадр на отметке 1:00 и нажмите Delete, чтобы удалить его.

Удаление последнего кадра анимации игрового объекта в Unity

В окне Animation нажмите на Preview, затем на кнопку Play. Сосредоточьтесь на спускаемом корабле в окне сцены, чтобы увидеть предварительный результат работы!

Отображение анимации двигателей космического корабля для игры в Unity
Двигатели готовы, капитан!

Если все еще выбран ThrusterMain, вы также можете увидеть изменение Sprite в компоненте Sprite Renderer:

Анимация спрайта в компоненте Sprite Renderer редактора Unity
Красиво переключается

Пришло время настроить контроллер анимации.

Настройка контроллера анимации

Скрипт Lander.cs в настоящее время устанавливает для параметров анимации значение true или false, в зависимости от того, запускает ли игрок двигатели. Контроллер анимации будет оценивать эти параметры и разрешать вход или выход из определенных состояний.

В окне Project нажмите на подпапку Animations. Затем дважды щелкните на ThrusterMain.controller. Откроется редактор Animator, где вы увидите контроллер Unity, добавленный заранее, когда вы создали анимационный клип на игровом объекте ThrusterMain:

Настройка анимации игрового объекта в окне Animator редактора Unity

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

Щелкните правой кнопкой мыши на область сетки редактора Animator и выберите State / Empty:

Создание состояния анимации для клипа игрового объекта в Unity

Используйте Инспектор, чтобы назвать новое состояние NoThrust. Это состояние по умолчанию для анимации, когда игрок не вводит данные:

Игровой объект космический корабль без взаимосвязи с состоянием анимации двигателя в окне Animator редактора Unity

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

Нажмите правой кнопкой мыши на NoThrust и выберите Set As Layer Default State. NoThrust теперь должен быть оранжевым, как показано ниже, а стрелка от Entry теперь указывает на No Thrust:

Установка перехода между состояниями анимации игрового объекта в Unity

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

В редакторе Animator нажмите + на вкладке Parameters, чтобы создать новый тип параметра Bool. Назовите его ApplyingThrust:

Создание нового параметра для состояния анимации игрового объекта в Unity

Нажмите правой кнопкой мыши на NoThrust, затем на Make Transition, нажмите на ThrusterAnim, чтобы создать переход, который позволяет изменять состояние между двумя состояниями. Теперь выполните тот же набор шагов, но на этот раз создайте переход от ThrusterAnim к NoThrust:

Соединение состояний анимации игрового объекта в окне Animator редактора Unity

Нажмите на линию перехода от NoThrust к ThrusterAnim, затем на + в инспекторе, чтобы добавить условие, чтобы выбрать единственное доступное условие: ApplyingThrust.

Убедитесь, что в раскрывающемся списке выбрано значение true. Это означает, что ApplyingThrust должен иметь значение true, чтобы анимация перешла в состояние ThrusterAnim.

Установка свойству перехода анимации значения true в окне Animator редактора Unity

Теперь отредактируйте линию перехода от ThrusterAnim к NoThrust, чтобы использовать то же условие ApplyingThrust. Однако на этот раз вы проверяете ложное условие:

Установка значения false свойству перехода анимации в окне Animator редактора Unity

Вы можете настроить скорость воспроизведения анимации в редакторе Animator по своему усмотрению. Нажмите на состояние ThrusterAnim и в Инспекторе измените свойство Speed на 1.5:

Настройка параметра скорости для анимации в окне Inspector редактора Unity

Анимация двигателей должна быстро реагировать, чтобы отразить реакцию на спусковой крючок игрока, чтобы она выглядела отзывчивой. Щелкните по обеим линиям перехода — между NoThrust и ThrusterAnim — и используйте Инспектор, чтобы изменить настройки, связанные с переходом, на 0. Также снимите флажки Has Exit Timeи Fixed Duration:

Настройки перехода анимации для двигателя космического корабля в Unity

И наконец, примените ту же анимацию и контроллер к левому и правому подруливающим устройствам. Выберите ThrusterLeft и ThrusterRight в Иерархии, затем перетащите ThrusterMain.controller из папки Animations в окне проекта в свойство Controller компонента Animator:

Перетаскивание ассетов и игровых объектов для ссылок параметров в окне Inspector редактора Unity

Нажмите на Play, чтобы запустить игру; опробуйте свои новые двигатели с помощью WASD или клавиш со стрелками:

Воспроизведение анимации двигателей игрового объекта космического корабля в окне Game редактора Unity

Хьюстон, мы взлетели!

Сортировка спрайтов и слои

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

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

Некорректное отображение фона игры в редакторе Unity

Возможно даже, что вы открыли стартовый проект и видели только фоновое изображение. Если это так, молодцы, что зашли так далеко!

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

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

Вы можете думать об этом как об упорядоченном списке:

  1. Layer A
    1. Order 0
    2. Order 1
  2. Layer B

Пора добавить несколько слоев

Нажмите на Edit > Project Settings и выберите Tags and Layers. Разверните раздел Sorting Layers.

Нажмите на +, чтобы добавить три новых слоя:

  • Background
  • Rocks
  • Player

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

Порядок слоев игрового объекта в сортировке слове редактора Unity
Как и лук, космическое пространство игры состоит из слоев!

Нажмите на Backdrop в иерархии; в компоненте Sprite Renderer нажмите на раскрывающийся список Sorting Layer и выберите Background из списка:

Установка значения для сортировки слоя в компоненте Sprite Renderer редактора Unity

Теперь камни определенно будут за фоном, потому что они все еще находятся на слое по умолчанию!

Разверните игровой объект Rocks и выделите все дочерние игровые объекты Rock. Используйте Инспектор, чтобы изменить объекты для использования слоя сортировки камней следующим образом:

Настройка сортировки слоев в компоненте Sprite Renderer редактора Unity

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

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

Поищите перекрывающиеся камни и назначьте тем, что спереди, более высокое значение Order in Layer, чем тем, что позади них:

Установка порядка перекрывающих камней в слое редактора Unity

Нажмите на Lander в Иерархии и измените свойства слоя сортировки для этого Sprite Renderer и всех его дочерних компонентов Sprite Renderer на слой сортировки Player.

Сделайте то же самое для игровых объектов Fuel в разделе Pickups в Иерархии. Это гарантирует, что они будут отображаться поверх всего остального.

Тонкая настройка слоев

Однако есть одна проблема. А как насчет спрайтов для анимации двигателя (и опор посадочного модуля, которые обычно прячутся за посадочным модулем)? Если вы не установите для них и для самого игрового объекта Lander конкретный порядок в номере слоя, вы увидите некоторые странные проблемы с рендерингом!

Некорректное отображение слоев спрайта космического корабля в Unity

Измените свойство Order in Layer для Lander на 2. Выберите каждый дочерний игровой объект Thruster, а также игровой объект LanderFeet и установите для их Order in Layer значения 1.

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

Измените спрайт LanderObjective, чтобы использовать слой Rocks, и присвойте ему значение Order in Layer, равное 0. Установите для камня под LanderObjective значение Order in Layer, равное 1:

Спрайты посадочной площадки космического корабля и камней снизу в окне Scene редактора Unity

И наконец, нажмите на префаб Explosion в папке Prefabs и измените его параметр Sorting Layer на Player:

Установка префаба взрыва в качестве слоя сортировки редактора Unity
Крутые люди не смотрят на взрывы. Но мы смотрим!

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

Плавная стыковка с посадочной площадкой космического корабля в окне Game редактора Unity
Успешно справился!

Имея достаточно практики, вы сможете садить ракеты так же хорошо, как Space X!

Куда двигаться дальше?

Скачайте завершенный проект, нажав на кнопку «Скачать материалы урока» вверху страницы.

Вы рассмотрели большинство важных особенностей 2D-дизайна Unity и можете показать это в забавной маленькой игре с гравитационным посадочным устройством!

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

Или, если вы хотите попробовать более глубокую 2D-анимацию и эффекты спрайтов, почему бы не проверить Unity 2D Techniques: Build a 2D Pinball Game?

Надеемся, вам понравился этот урок. Если у вас есть какие-либо вопросы или комментарии, присоединяйтесь к обсуждению.

Автор перевода: Jean Winters

Источник: Introduction to Unity 2D

Смотрите также:

Как сделать систему пауэр-апов в UnityКак сделать систему пауэр-апов в Unity


как импортировать 2d-ресурсы в UnityИмпортирование 2D-ресурсов в Unity


Комментировать

Почта не публикуется.Обязательные поля отмечены *