Найти в Дзене

Unity 2D. Ruby's Adventure. Part 26

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

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

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

Чтобы добавить пакет Cinemachine в наш проект:

Откройте Package Manager (менеджер пакетов) в редакторе Unity через меню Window > Package Manager:

Package Manager
Package Manager

В открывшемся окне выберите в раскрывающемся списке строку "Unity Registry", справа в строке поиска наберите "cinema", после чего в списке пакетов отобразится паке "Cinemachine", выберите его и нажмите кнопку «Install»:

Установка пакета
Установка пакета

Дождитесь завершения процесса установки - кнопка «Install» изменится на «Remove», а рядом с названием пакета появится зеленая галочка. Теперь у вас есть Cinemachine, инструмент для настройки и перемещения камер в проекте.

Установка пакета
Установка пакета

Закройте окно менеджера пакетов.

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

Нам же необходимо использовать этот пакет для того, чтобы камера следовала за целью в 2D игре. Cinemachine имеет вспомогательные функции для работы в 2D, чтобы ограничить камеру определенными границами. Cinemachine использует виртуальные камеры, каждой из которых можно задать различные настройки, а затем сообщить вашей основной камере (Main Camera в вашей иерархии), какая виртуальная камера активна в данный момент. Main Camera просто скопирует настройки активной виртуальной камеры.

Прежде чем, перейти к добавлению виртуальной камеры, выберите в иерархии основную камеру и посмотрите на ее позицию, она равна (0, 0, -10):

Настройки основной камеры
Настройки основной камеры

Теперь добавьте камеру Cinemachine в свою сцену. Для этого нажмите «+» чуть выше окна иерархии и выберите пункт Cinemachine > Virtual Camera:

-5

В окне иерархии появится новый объект с именем CM vcam1.

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

Настройки камеры
Настройки камеры

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

Посмотрите на позицию виртуальной камеры на предыдущем слайде, а потом выберите основную камеру, чтобы убедиться, что и ее позиция теперь стала другой. Установите для виртуальной камеры позицию (0, 0, -10), которая изначально была у основной камеры. Перейдите во вкладку Game и убедитесь, что теперь все отображается верно.

Теперь давайте посмотрим еще на один параметр - "Ortho Size" в разделе "Lens". Это очень важный и интересный параметр камеры:

Настройки камеры
Настройки камеры

В 3D - приложениях камеры могут иметь два режима:

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

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

По умолчанию при создании проекта с помощью 2D-шаблона камера уже настроена на орфографический режим.

Орфографический размер — это просто количество единиц, которые камера умещает на половине своей высоты. Сейчас он равен 5, поэтому мы можем видеть 10 единиц мира в вертикальном направлении экрана. Если вы хотите, чтобы ваша камера могла видеть 50 единиц мира по высоте, установите ее на 25.

Почему устанавливать нужно высоту, а не ширину? Потому, что ширина меняется в зависимости от разрешения, которое пользователь устанавливает для своего игрового окна. Экраны могут иметь множество соотношений разрешения, например 4:3 , 16:9 и 16:10, поэтому камера будет показывать большую или меньшую ширину мира в зависимости от формы экрана, но при этом всегда будет показывать одинаковую высоту по вертикали.

Вы можете изменить это значение по своему усмотрению, но можно оставить значение 5 по умолчанию.

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

Перетащите главного героя из вашей иерархии в свойство Follow в инспекторе объекта CM vcam1:

Настройка камеры
Настройка камеры

Камера автоматически переместится в положение, чтобы Ruby оказался в центре белого прямоугольника экрана:

Смещение камеры
Смещение камеры

Давайте дорисуем мир и добавим плитки с водой на границах, чтобы Ruby не мог покинуть область игрового мира. Если вы не помните, как рисовать на Tilemap, то вернитесь к частям 5 - 7.

Например, вот так:

Пример игрового мира
Пример игрового мира

Теперь, когда вы запустите игру, вы увидите, что камера следует за Ruby, но, когда Ruby подходит к краю, видны синии границы сцены за пределами игрового мира:

Проблема при движении камеры
Проблема при движении камеры

Чтобы камера не могла перемещаться за пределы игрового мира, нам понадобится Cinemachine Confiner (ограничитель) для задания границ.

Перейдите в нижнюю часть инспектора виртуальной камеры и щелкните раскрывающийся список «Add extension» и выберите CinemachineConfiner2D:

Добавление расширения
Добавление расширения

Вы увидите предупреждение о том, что требуется ограничивающая форма:

Предупреждение
Предупреждение

Нам нужно задать 2D-коллайдер для использования в качестве границ. CinemachineConfiner2D может использовать Composite Collider 2D или Polygon Collider 2D.

Давайте добавим Polygon Collider 2D на сцену, для этого создайте новый игровой объект, нажав кнопку «+» в левом верхнем углу иерархии и выберите пункт «Create Empty»:

Создание пустого объекта
Создание пустого объекта

Переименуйте созданный объект в CameraConfiner и добавьте ему компонент Polygon Collider 2D:

Создание коллайдера
Создание коллайдера

Отредактируйте коллайдер - переместите точки, чтобы поместить четыре из них в середину водных плиток в каждом углу, а одну просто на середину сторону:

Настройка границ
Настройка границ

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

Корректировка значений
Корректировка значений

Ввернитесь к объекту виртуальной камеры и перетащите созданный объект в свойство Bounding Shape 2D объекта CinemachineConfiner:

Задание границ мира
Задание границ мира

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

Чтобы исправить это, мы опять воспользуемся слоями, как делали со снарядом.

В правом верхнем углу Инспектора щелкните раскрывающийся список «Layer» и выберите «Add Layer».

Добавление слоя
Добавление слоя

Выберите пустой слот и назовите его Confiner:

Добавление слоя
Добавление слоя

На игровом объекте CameraConfiner установите слой Confiner:

Установка слоя
Установка слоя

Теперь выберите пункт меню Edit > Project Settings > Physics 2D и в появившемся окне снимите галочки со всех записей в слое Confiner, чтобы объекты в слое Confiner не взаимодействовали с объектами других слоев:

Настройка слоя
Настройка слоя

Теперь камера остановится на краю карты: