Найти в Дзене

Unity 2D. Ruby's Adventure. Part 11

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

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

Чтобы настроить коллайдер Tilemap в окне иерархии выберите Tilemap, а в инспекторе добавьте ему компонент «Tilemap Collider 2D»:

Добавление компонента
Добавление компонента

На каждой плитке появятся зеленые квадратики коллайдера, потому что по умолчанию все плитки настроены на столкновение.

В окне проекта перейдите в папку Art > Tiles. Выберите все плитки, которые не являются водой, для этого нужно нажать на одну, а затем, удерживая клавишу Shift , щелкнуть последнюю плитку в списке. Можно, конечно, выбирать по одной плитке, но тогда это займет много времени. Затем в инспекторе найдите свойство Collider Type и измените его со Sprite на None:

Изменение типа коллайдера
Изменение типа коллайдера

Запустите игру и проверьте, что Ruby теперь сталкивается с водными плитками.

Остался один небольшой шаг по настройке Tilemap Collider. В настоящее время у каждого тайла (плитки) свой отдельный отдельный Collider. Это работает, но создает две проблемы:

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

Для решения этих проблем Unity предлагает компонент под названием Composite Collider 2D, который берет все коллайдеры на объектах и делает из них один большой коллайдер.

В иерархии выберите Tilemap и добавьте ему в инспекторе компонент «Composite Collider 2D»:

Добавление компонента
Добавление компонента

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

В компоненте Tilemap Collider 2D установите флажок Use By Composite. В компоненте Rigidbody2D задайте для свойства Body Type значение Static. Это значение позволит сделать ваш мир статическим и не даст ему улететь вниз, как это было с Ruby. Это значение также помогает физической системе оптимизировать вычисления, поскольку теперь она знает, что этот объект не может двигаться, несмотря на то, что у него есть компонент Rigidbody2D и для него не нужно выполнять вычисление движений.

Оптимизация коллайдера
Оптимизация коллайдера

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

Если вы рисуете новые тайлы воды, то Unity автоматически обновляет Composite Collider карты Tilemap, чтобы включить эти новые коллайдеры.