Основы Unity: типы контроллеров

Каждый подходит для определённого типа геймплея.

Автор YouTube-канала I Heart Gamedev Никки Боккуцци опубликовал видео, в котором рассказал о разных контроллерах в Unity. Контроллер персонажей отвечает за обработку любых столкновений с объектами, а также определяет, какие физические законы применяются к герою. Мы выбрали из видео главное.

В Unity есть базовые контроллеры персонажей: built-in и rigidbody. У каждого есть свои особенности, которые влияют на поведение в игре и взаимодействие с другими объектами. Также можно сделать кастомный контроллер, который будет работать именно так, как нужно разработчику.

В этом примере у персонажа есть несколько базовых анимаций: стояние, ходьба, бег. Также есть скрипт, позволяющий делать переходы между этими анимациями. Модель персонажа взята у YouTube-канала Mix and Jam.

Контроллер персонажа — это компонент, который позволяет объекту двигаться и взаимодействовать с коллайдерами. Именно контроллер отвечает, например, за передвижение по ступенькам, столкновение со стенами, попадание проджектайлов.

Built-in контроллер по умолчанию присутствует в движке: он позволяет персонажу подниматься по ступеням, забираться по склону, ходить по неровным поверхностям и врезаться в стены. Вероятно, этот контроллер — самый простой и быстрый способ добавить передвижение в игру.

Другой контроллер — rigidbody: позволяет объектам взаимодействовать друг с другом по законам физики в реальном времени. Это значит, что на объекты будут оказывать влияние такие факторы как: гравитация, масса, инерция, лобовое сопротивление.

У rigidbody-контроллера есть две версии, у каждой из которых есть свои особенности: kinematic и dynamic. На dynamic оказывают влияние другие физические объекты. Например, если в персонажа попадёт предмет, то его отбросит как и любой другой объект. А с kinematic-объектами такого не происходит — персонаж будет продолжать стоять, даже если в него влетит гигантский куб.

Built-in контроллеры не учитывают законы физики и не могут взаимодействовать с другими объектами. Rigidbody-контроллеры, и dynamic, и kinematic, могут влиять на динамические объекты
Dynamic-объекты подчиняются законам физики. Они могут двигать другие предметы, но это работает и в обратную сторону
Пример того, как dynamic-контроллеры влияют на dynamic-объекты и реагируют на столкновение 
Kinematic-объекты могут влиять на dynamic-объекты, но это не работает в обратную — на kinematic-объекты ничто не может повлиять
Пример того, как разные контроллеры реагируют на внешнее воздействие
По умолчанию физические законы действуют только на dynamic-объекты. Это значит, что на них всегда влияет гравитация, а при движении есть инерция. Для остальных типов контроллеров эти условия не работают

Built-in контроллеры позволяют персонажу подниматься по ступенькам или по наклонной поверхности. При этом он не будет съезжать вниз, если окажется на крутом склоне. У dynamic-объектов почти всё наоборот: они не умеют подниматься по ступенькам, но при этом съезжают на крутом склоне. Единственное, что их объединяет с предыдущим типом контроллера — они тоже могут подниматься по пологой поверхности.

Пример поведения контроллеров на разных препятствиях

Каждый контроллер подходит для своего типа геймплея. Например, в серии Pokemon нет физического взаимодействия между объектами, поэтому играм такого типа подойдёт built-in контроллер. В Fall Guys всё наоборот — физика имеет огромное значение для геймплея, поэтому в такой игре лучше использовать dynamic-объекты.

124124
39 комментариев

От себя хочу добавить, что если хотите делать хоть сколько–нибудь динамичный геймплей с врагами и интересным передвижением, то бегите от встроенного CharacterController`а как от огня.
При этом «остепенить» контроллер на основе Rigidbody сама по себе задача довольно сложная. Тут, как всегда в Unity, в дело вступает ассет стор, где можно найти хорошие варианты на Rigidbody (я пользуюсь EasyCharacterMovement, работает отлично и разработчик хорошо поддерживает и помогает пользоваться ассетом).

25

Проблема не в CharacterController, а в том, что люди думают, что он по дефолту должен давать какие-то невероятные функции. Юнити это голый движок, а не готовая игра в которую добавил свои модели и в релиз.
У меня персонажи на CharacterController работают, но там поверх этого пару десятков классов отвечающих за анимации и перемещение. При этом оно работает именно так как мне надо.
Ассет стор это здорово, но если тебе внезапно понадобиться сделать так, чтобы твой персонаж залезал на балкон, то ты охуеешь лазать в чужом коде и переписывать его.

6

Комментарий недоступен

Ассет free?

Так его и для примера только добавляют. демок/прототипов

По своему опыту хочу добавить, что писать контролеры - это тот еще гемор. 
Занимаюсь сейчас разработкой ГК и на каждый новый проект приходится мучиться с одним и тем же. В одной игре нужна физика, в другой нет, в третьей нужны реалистичные столкновения, но чтоб без инерции и тому подобного... В общем, грусть тоска и много ненужного кода.

6

Комментарий недоступен

3