Gamedev
Владимир Семыкин

Основы 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-объекты.

{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442","\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d","unity"], "comments": 39, "likes": 113, "favorites": 332, "is_advertisement": false, "subsite_label": "gamedev", "id": 615193, "is_wide": true, "is_ugc": false, "date": "Wed, 27 Jan 2021 15:13:12 +0300", "is_special": false }
0
39 комментариев
Популярные
По порядку
Написать комментарий...
23

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

Ответить
6

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

Ответить

Половый пистолет

nuprahtor
0

А может посоветуешь какой-то контроллер, где бы был даш (уворот) нормальный. Или перекат как в Дарк Соулс?

Ответить
1

Не разбирался в готовых, я смотрел только на достаточно низкоуровневые, на основе которых можно что–то свое написать. Тот же EastCharacterMovement позволяет на основе Rigidbody делать стабильных персонажей, которые при этом могут взаимодействовать с физическим миром, которые не будут проходить сквозь коллайдеры при толканиях и много других крутых штук. Приделать увороты к такому контроллеру легко, там весь ассет модульный и можно добавлять все что угодно. Но это, опять таки, не готовый ассет, который можно просто бросить в редактор, нужно сверху свое дописывать.

Ответить

Половый пистолет

nupraht…
0

Спасибо!

Ответить
0

Ассет free?

Ответить
0

Нет. Я много искал, и ни одного хорошего бесплатного/опенсурсного варианта контроллера на rigidbody так и не нашел, хотя перепробовал много.

Ответить
0

А написать свой? Это не сложно 

Ответить
1

Для меня сложно, всегда что–то выскакивало ригидбодийное и не получалось добиться стабильного контроллера. Использование всяких продвинутых depenetration алгоритмов тоже мне не по силам, а в ассете уже все готово.

Ответить
0

Сейчас в юнити, таки, есть Physics.ComputePenetration() - это штука позволяет на изи запилить свой резолв коллизии (от юзера требуется просто сдвигать контроллер по вектору , который возвращает метод) - рекомендую потестить, супер вещь!

Ответить
1

В ассете, который я использую, применяется эта функция

Ответить
0

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

Ответить
6

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

Ответить
3

Тоже добавлю немного:
В Unity, к сожалению, нет адекватного встроенного контроллера от слова совсем. Встроенные решения не проходят даже простейшие тесты - работают лишь в тепличных условиях.
Использовать физику для этого крайне плохая затея(о чем пишут даже Nvidia в доках к PhysX) - откушаете много говна и потом, все равно, выбросите.

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

Ответить
1

А в чем проблема то? Для каждой игры нужен свой контроллер, юнитеки ебанулись бы если на каждую ситуацию отдельный контроллер заготовили. Они дали базу, а дальше сам пили по мере необходимого.

Ответить
0

Физичный контроллер персонажа, контролируемого игроком нужен... даже затрудняюсь ответить где. То, что есть у юнитеков едва ли можно использовать в реальном проекте.
Это, в принципе, в рамках их подхода - "мы даем инструменты, а вы делайте как хотите", но,все таки, печально, что в Юнити попросту нет встроенного контроллера для шутера от первого лица, хотя бы, базового.

Ответить
0

У них же сейчас появились заготовки для проектов. Там даже есть для FPS.

Ответить
0

Да, но там оно на ECS, как я понял.
Или имеется ввиду прямо при создании проекта в хабе?

Ответить
1

Да, там в хабе есть.
Не лез туда, так как часто сам пишу системы с нуля, а переделывать чужие - это лишняя головная боль.

Ответить
1

Хм, надо глянуть.
Да, поддерживаю, сам точно так же делаю. А то вот так заюзаешь какой-нить контроллер со стора, а потом захочешь, чтобы игрок мог бегать по стенам и все, сиди разбирайся потом с этим всем...

Ответить
3

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

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

Ответить
1

Для Владимира это работа. Не думаю, что он на этот счёт сильно переживает.

Ответить
1

да ладно, это нормально. Я всегда надеюсь, что такие материалы окажутся хотя бы для кого-то полезными. Всё же это нишевая информация, которая вряд ли интересна широкому кругу читателей. Так что всё ок. Ощущать обиду из-за такого — это всё равно что грустить из-за того, что река течёт в одну, а не в другую сторону)

Ответить
0

А кинематик для чего используют обычно?

Ответить
5

для физических объектов которые ведут себя как объекты с бесконечно большой массой и управляются какими ни будь формулами, а не законами физики.

Например платформа которая перемещается туда сюда. 

Ответить
0

Но ведь платформа может иметь коллайдер для столкновений и двигаться через код/анимацию, зачем ей физическое представление в виде Rigidbody?

Ответить
0

Если не будет ригибоди хотя бы на одном объекте то столкновение обрабатываться не будет ( OnCollisionEnter ). 

Ответить
0

В коде может и не обработается, но само столкновение будет

Ответить
1

Для чего угодно. Кинематика это просто голая версия Rigidbody, поведение ты прописываешь сам. Именно на нем и создают кастомные контроллеры для игрока и NPC.    

Ответить
0

Или для кат-сцен, чтобы какой-нить шальной булыжник не повлиял на поведение объекта в кадре.

Ответить
2

Флэшбеки из моментов когда спокойно идет катсцена и в нпс на полной скорости врезается машина, взрывается, а ему ваще похуям.

Ответить
1

@Unity репост?)

Ответить
0

Привет, Андреюшка :3
Рад тебя видеть)

Ответить

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

0

К Петру сразу к слову отправилась.

Ответить
0

У меня сегодня тоже день контроллера, только в 2д. Враги двигаются за счёт динамической rigidbody2d. Главный герой проходит сквозь врагов. У героя есть своя обработка взаимодействия с телом врага. Что-то похожее на столкновение врагов в dead cells. Пришла задача снабдить некоторых врагов щитом, который будет непроходим. Так как щит стал частью объекта врага, то стал влиять на его rigidbody2d. И теперь когда герой бежит в щит, то толкает немного всего врага. Враг тоже может идти на героя при этом. Приходится менять контроллер врагам, переводить его на статику и писать обработку физики.

Ответить
0

отличный материал

Ответить
–1

игр нет , но все советуют и советуют :)

Ответить

Комментарии

{"hash":"3f2685e9","params":{"id":"dtfru","service":1,"title":"\u041f\u0440\u044f\u043c\u043e\u0439 \u044d\u0444\u0438\u0440","isLegacy":false}}