Как лучше настроить определение земли игроком?

Обычно игроку на сцене создают вложенный объект с именем GroundCheck
На моем рисунке этот объект в виде синего кружка, а зеленый овал - это Capsule Collider 2D.
Помещают GroundCheck в ноги игрока.
Объекту-земле добавляют LayerMask с именем Ground. И фиксируют пересечение этих двух объектов - коллизию. Пересекаются - на земле, нет - не на земле.
И всё вроде хорошо, но есть одна проблема.

Пусть игрок в воздухе не должен ходить, перемещаться, управлять полетом. Как в жизни.
Куда летит - туда и летит под действием какой либо направившей его силы. И мы решили отключить ему управление в воздухе. Такая механика игры. И вот какие возникают ситуации.
643d64745e3b5310061599.jpeg
1 Большой кружок - GroundCheck . Если игрок прыгнет вверх и упрется в препятствие, система посчитает, что он на земле, а это не так. Если в механике игры, при столкновении с землей убрать velocity, игрок буквально прилипнет к краю т.к. сработает коллизия - земля, velocity=zero. Некрасивый "глюк".
Конечно на край можно поместить другой коллайдер, но такие затычки по всему уровню....

2. Маленький кружок. Если игрок подойдет к краю, то коллизии не будет - система посчитает, что игрок в воздухе.
Управление (по замыслу игры) отключится. Коллайдер капсула начнет скользить по краю земли и игрок соскользнёт, что тоже некрасиво так как его спрайт буквально перекроет/срежет угол спрайта земли.

Как лучше настроить определение земли игроком?
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
1. Убираете Capsule Collider 2D, вешаете Box Collider 2D
2. Делаете коллайдеру скругление (да, там есть такая опция), чисто чтобы за углы не цеплялся
3. Делаете не одну большую точку, а маленьких штуки две (по краям) или три (одна в центре, если у вас есть узкие платформы)
4. Ищете землю условием ИЛИ. Profit

Важно, чтобы края поиска земли не доставали до левого и правого краёв коллайдера и при этом был включен режим Rigidbody2D collision detection = continuous. Тогда всё будет работать отлично.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы