Основы Unity: типы контроллеров Статьи редакции
Каждый подходит для определённого типа геймплея.
Автор YouTube-канала I Heart Gamedev Никки Боккуцци опубликовал видео, в котором рассказал о разных контроллерах в Unity. Контроллер персонажей отвечает за обработку любых столкновений с объектами, а также определяет, какие физические законы применяются к герою. Мы выбрали из видео главное.
В Unity есть базовые контроллеры персонажей: built-in и rigidbody. У каждого есть свои особенности, которые влияют на поведение в игре и взаимодействие с другими объектами. Также можно сделать кастомный контроллер, который будет работать именно так, как нужно разработчику.
В этом примере у персонажа есть несколько базовых анимаций: стояние, ходьба, бег. Также есть скрипт, позволяющий делать переходы между этими анимациями. Модель персонажа взята у YouTube-канала Mix and Jam.
Контроллер персонажа — это компонент, который позволяет объекту двигаться и взаимодействовать с коллайдерами. Именно контроллер отвечает, например, за передвижение по ступенькам, столкновение со стенами, попадание проджектайлов.
Built-in контроллер по умолчанию присутствует в движке: он позволяет персонажу подниматься по ступеням, забираться по склону, ходить по неровным поверхностям и врезаться в стены. Вероятно, этот контроллер — самый простой и быстрый способ добавить передвижение в игру.
Другой контроллер — rigidbody: позволяет объектам взаимодействовать друг с другом по законам физики в реальном времени. Это значит, что на объекты будут оказывать влияние такие факторы как: гравитация, масса, инерция, лобовое сопротивление.
У rigidbody-контроллера есть две версии, у каждой из которых есть свои особенности: kinematic и dynamic. На dynamic оказывают влияние другие физические объекты. Например, если в персонажа попадёт предмет, то его отбросит как и любой другой объект. А с kinematic-объектами такого не происходит — персонаж будет продолжать стоять, даже если в него влетит гигантский куб.
Built-in контроллеры позволяют персонажу подниматься по ступенькам или по наклонной поверхности. При этом он не будет съезжать вниз, если окажется на крутом склоне. У dynamic-объектов почти всё наоборот: они не умеют подниматься по ступенькам, но при этом съезжают на крутом склоне. Единственное, что их объединяет с предыдущим типом контроллера — они тоже могут подниматься по пологой поверхности.
Каждый контроллер подходит для своего типа геймплея. Например, в серии Pokemon нет физического взаимодействия между объектами, поэтому играм такого типа подойдёт built-in контроллер. В Fall Guys всё наоборот — физика имеет огромное значение для геймплея, поэтому в такой игре лучше использовать dynamic-объекты.
От себя хочу добавить, что если хотите делать хоть сколько–нибудь динамичный геймплей с врагами и интересным передвижением, то бегите от встроенного CharacterController`а как от огня.
При этом «остепенить» контроллер на основе Rigidbody сама по себе задача довольно сложная. Тут, как всегда в Unity, в дело вступает ассет стор, где можно найти хорошие варианты на Rigidbody (я пользуюсь EasyCharacterMovement, работает отлично и разработчик хорошо поддерживает и помогает пользоваться ассетом).
Проблема не в CharacterController, а в том, что люди думают, что он по дефолту должен давать какие-то невероятные функции. Юнити это голый движок, а не готовая игра в которую добавил свои модели и в релиз.
У меня персонажи на CharacterController работают, но там поверх этого пару десятков классов отвечающих за анимации и перемещение. При этом оно работает именно так как мне надо.
Ассет стор это здорово, но если тебе внезапно понадобиться сделать так, чтобы твой персонаж залезал на балкон, то ты охуеешь лазать в чужом коде и переписывать его.
Не разбирался в готовых, я смотрел только на достаточно низкоуровневые, на основе которых можно что–то свое написать. Тот же EastCharacterMovement позволяет на основе Rigidbody делать стабильных персонажей, которые при этом могут взаимодействовать с физическим миром, которые не будут проходить сквозь коллайдеры при толканиях и много других крутых штук. Приделать увороты к такому контроллеру легко, там весь ассет модульный и можно добавлять все что угодно. Но это, опять таки, не готовый ассет, который можно просто бросить в редактор, нужно сверху свое дописывать.
По своему опыту хочу добавить, что писать контролеры - это тот еще гемор.
Занимаюсь сейчас разработкой ГК и на каждый новый проект приходится мучиться с одним и тем же. В одной игре нужна физика, в другой нет, в третьей нужны реалистичные столкновения, но чтоб без инерции и тому подобного... В общем, грусть тоска и много ненужного кода.
Тоже добавлю немного:
В Unity, к сожалению, нет адекватного встроенного контроллера от слова совсем. Встроенные решения не проходят даже простейшие тесты - работают лишь в тепличных условиях.
Использовать физику для этого крайне плохая затея(о чем пишут даже Nvidia в доках к PhysX) - откушаете много говна и потом, все равно, выбросите.
Единственный вариант - полностью кастомное решение без физики и с собственным резолвом коллизии. С начала 2017 года в юнити появился необходимый для этого функционал в классе Physics и, таким образом , можно запилить контроллер без боли.
Ну или вариант с навмешем, если для неигровых персонажей.
А в чем проблема то? Для каждой игры нужен свой контроллер, юнитеки ебанулись бы если на каждую ситуацию отдельный контроллер заготовили. Они дали базу, а дальше сам пили по мере необходимого.
Физичный контроллер персонажа, контролируемого игроком нужен... даже затрудняюсь ответить где. То, что есть у юнитеков едва ли можно использовать в реальном проекте.
Это, в принципе, в рамках их подхода - "мы даем инструменты, а вы делайте как хотите", но,все таки, печально, что в Юнити попросту нет встроенного контроллера для шутера от первого лица, хотя бы, базового.
У них же сейчас появились заготовки для проектов. Там даже есть для FPS.
Да, там в хабе есть.
Не лез туда, так как часто сам пишу системы с нуля, а переделывать чужие - это лишняя головная боль.
Согласись, чуток обидно, когда делаешь хороший лонгрид (в данном случае перевод но эт не так важно) на профессиональную тему, корректируешь форматирование для читабельности, вырезаешь гифки, продумываешь подачу материала и тд.
А в итоге твой материал фактически никто не замечает. Вместо твоего материала какой то рандомный мемчик с пикабу висит в топе целый день с тыщей лайков, а твой материал теряется в пучине забвения, так как основная аудитория никогда не планирует заниматься игростроем, а для профессиональной аудитории - данный материал не особо интересен, так как затрагивает базовые, хорошо известные знания.
Для Владимира это работа. Не думаю, что он на этот счёт сильно переживает.
для физических объектов которые ведут себя как объекты с бесконечно большой массой и управляются какими ни будь формулами, а не законами физики.
Например платформа которая перемещается туда сюда.
Но ведь платформа может иметь коллайдер для столкновений и двигаться через код/анимацию, зачем ей физическое представление в виде Rigidbody?
Если не будет ригибоди хотя бы на одном объекте то столкновение обрабатываться не будет ( OnCollisionEnter ).
Или для кат-сцен, чтобы какой-нить шальной булыжник не повлиял на поведение объекта в кадре.
Комментарий удален
У меня сегодня тоже день контроллера, только в 2д. Враги двигаются за счёт динамической rigidbody2d. Главный герой проходит сквозь врагов. У героя есть своя обработка взаимодействия с телом врага. Что-то похожее на столкновение врагов в dead cells. Пришла задача снабдить некоторых врагов щитом, который будет непроходим. Так как щит стал частью объекта врага, то стал влиять на его rigidbody2d. И теперь когда герой бежит в щит, то толкает немного всего врага. Враг тоже может идти на героя при этом. Приходится менять контроллер врагам, переводить его на статику и писать обработку физики.