Теперь 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, чтобы включить эти новые коллайдеры.