До сих пор наша игровая сцена имела небольшие размеры, ограниченные прямоугольником камеры. Настало время сделать мир больше и заставить камеру следовать за вашим главным героем. Мы будем использовать пакет Unity под названием Cinemachine для реализации автоматического управления камерой без необходимости написания кода.
Unity поставляется с множеством встроенных функции, которые позволяют быстро и качественно создавать игры и приложения. Более специализированные функции, которые нужны не всегда, предлагаются в виде пакетов. Пакеты можно быстро и легко подключить в проект или обновить, но при этом они увеличивают размер проектов.
Пакет — это набор кода и ресурсов, которые вы можете добавить в свой проект с помощью менеджера пакетов . Они добавляют функциональность в ваш проект, чтобы вам не нужно реализовывать ее самостоятельно. Например, поддержку виртуальной реальности, эффекты постобработки или то, что нам нужно сейчас - дополнительные функции камеры.
Чтобы добавить пакет Cinemachine в наш проект:
Откройте Package Manager (менеджер пакетов) в редакторе Unity через меню Window > 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:
В окне иерархии появится новый объект с именем 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 не взаимодействовали с объектами других слоев:
Теперь камера остановится на краю карты: