Платформер на Unity: физика и контроллер персонажа

Пока тут болею бронхитом, ковыряю понемногу Unity. На следующем месте работы, вполне вероятно, придётся с фронтом работать, а не только с беком.

Решил потренироваться на простеньком платформере. Одно из первых и важных в платформере — персонаж и его управление. И там не всё так просто.

Если погуглить на эту тему, то многие задаются вопросом, Dynamic или Kinematic коллайдер использовать? Многие не понимают, как работает kinematic тело.

В общем-то, довольно много вариантов контроллеров для персонажа уже сущестует:

У unity есть неплохие уроки по созданию контроллера персонажа для платформера.

Предположим, мы не хотим заморачиваться с kinematic телом и используем стандартную физику с dynamic коллайдером. Вполне вероятно, что то, как оно работает по умолчанию, вам не очень понравится.

Если вам необходимо что-то сверх физики, какие-то свои фичи (например, прилипание к стенам), то с dynamic коллайдером это будет проблематично.

Что ж, будем использовать kinematic тело.

Возьмём контроллер из официальных уроков по Unity по созданию контроллера для платформера. Вся суть логики сводится к использованию Rigidbody2D.Cast.

Сначала зададим маску:

Сама логика по обработке в FixedUpdate.

Что из этого получится? С простыми коллайдерами оно даже будет работать, но если какая-то нестандартная структура будет, скажем, если использовать Sprite Shape, то определение коллизий будет работать плохо. Вплоть до того, что просто провалимся в коллайдер, пока нас не вытолкнет из него.

Попробуем популярный CharacterController2D от prime31.

Там логика работает вокруг Physics2D.Raycast. Рейкастим по направлению движения (4 луча вертикально, 8 горизонтально).

После кастов корректируем вектор движения.

В результате худо-бедно вроде работает.

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