Найти тему

Unity - RigidBody2D: часть 1

Оглавление

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

Дабы не делать огромный лонгрид и поберечь твои, уважаемый читатель, силы (и немного разбить по времени свои), статья разделена на 2 части. Если после прочтения первой, захочется продолжения, можно будет перейти по ссылке и прочитать его (в конце статьи она тоже будет).

[пока ссылки, как и второй части нет, но скоро это исправится]

Потому что он был одиночкой...

Фи... зика

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

Итак, начнем

Входные данные

Для начала создадим новый 2D проект (все таки RigidBody2D смотрим, однако в 3D все практически такое же). В нем создадим несколько объектов: кружок, квадрат и растянутый до прямоугольника квадрат. Я добавил несколько текстурок, которые позже помогут рассмотреть свойства некоторых полей. У меня вышло примерно так:

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

Всем объектам на сцене необходимо добавить коллайдеры, чтобы они могли сталкиваться друг с другом. Смайлику - CircleCollider2D, коробке и земле BoxCollider2D.

Коллайдер на смайлике
Коллайдер на смайлике

Собственно сам RigidBody2D

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

Вид RigidBody2D в инспекторе
Вид RigidBody2D в инспекторе

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

BodyType

Тип тела. Бывает трех видов: dynamic, kinematic, static.

Какой бывает BodyType
Какой бывает BodyType
  • Dynamic используется для тел, которые будут подчиняться физике всегда.
  • Kinematic тела не будут подчиняться гравитации и силам извне (созданные через AddForce, например), за счет чего меньше нагружают процессор. Могут двигаться и крутиться через код с помощью методов RigidBody2D.MovePosition и RigidBody2D.MoveRotation. Могут обнаруживать столкновения с ними других объектов.
  • Static наименее и наиболее часто используемый тип, так как любой 2D коллайдер, если нету компонента RigidBody2D, считается прикрепленным к скрытому статическому RigidBody2D. Следовательно нет особого смысла вешать компонент и выбирать BodyType Static, раз он и так вешается автоматом. Он не обрабатывает коллизии, в отличие от Kinematic типа. И не может быть сдвинут с помощью вышеназванных методов, выдавая желтенькое предупреждение при попытке сделать это:
Предупреждение при попытке сдвинуть Static тело через MovePosition
Предупреждение при попытке сдвинуть Static тело через MovePosition

Однако есть смысл выбирать и static body type, так как мы можем менять его через код. Например... Представим, что мы разрабатываем платформер. У нас есть платформа, которая является неподвижной и не должна обрабатывать никакие коллизии. Но в какой-то момент, мы дадим игроку нажать на некий рычаг, после чего в коде значение body type для той самой неподвижной платформы меняется со static на dynamic, и о нет! Платформа уже летит вниз на всех парах! Либо же мы можем сделать kinematic платформы, которые при соприкосновении с игроком, опять же превращаются в dynamic и начинают падать

Material

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

Создали парочку (12 штук) физических материалов
Создали парочку (12 штук) физических материалов

Мы можем менять значения двух полей:

  • Friction - сила трения. То, насколько объект будет скользким, где 0 - скользкий, 1 - липкий.
  • Bounciness - прыгучесть. То, как сильно объект будет отскакивать при столкновении. Где 0 - совсем не будет отскакивать, 1 - будет отскакивать без потерь энергии (иногда даже с приобретением).

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

А теперь время экспериментов. Создадим несколько коробок с разными значениями физического материала и посмотрим, как они будут себя вести.

Для начала проверим сцепление. Пришлось немного модифицировать сцену, добавив платформу под углом и побольше коробок, которые как раз хорошо перекрасились. На трех следующих гифках чем синее коробка, тем выше значение friction (от 0 до 1 с шагом 0.25). Углы расположения платформ: 30, 35, 45 градусов.

Коробки скользящие под углом в 30 градусов
Коробки скользящие под углом в 30 градусов
Коробки скользящие под углом в 35 градусов
Коробки скользящие под углом в 35 градусов
Коробки скользящие под углом в 45 градусов
Коробки скользящие под углом в 45 градусов

Теперь проверим прыгучесть. Фиолетофизна опять же показывает то, насколько прыгуча коробка. От 0 до 1 с шагом 0.25.

Прыгающие коробки
Прыгающие коробки

Можно заметить, что лучше избегать крайние значения, если задумка того не требует. Иначе объект будет отскакивать все сильнее и сильнее, либо сможет скользить на самом уголке коллайдера.

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

Бум-бах-бабах, смешиваем скользкое и прыгучее
Бум-бах-бабах, смешиваем скользкое и прыгучее

Пока не закончили тему, стоит упомянуть приоритет установки физического материала. Ведь поле для него есть, как в коллайдере, так и в RigidBody. Приоритет таков:

  1. Коллайдер
  2. RigidBody
  3. Материал по умолчанию, который можно найти в редакторе физики. Открыть окно редактора физики можно через Edit -> Project Settings -> Physics 2D. Там не лежит никакого материала изначально, но там как-бы материал с bounciness 0 и friction 0.4
Окошко человека, способного управлять законами физики
Окошко человека, способного управлять законами физики
Открыть окно редактирования физики, да и любое другое, можно немного проще. Нажав на иконку лупы в правом верхнем углу, либо сочетание клавиш Ctrl+K на клавиатуре. Появится окно поиска, в котором необходимо ввести искомые ключевые слова. Сейчас мы могли совершить поиск через название меню Physics 2D, либо через название поле (если мы его знаем) Default Material.

Simulated

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

Начало окончания конца начала началось

На этом подходит к концу первая часть поста. Во второй части обзора расскажу об остальных полях, которые, кстати, в большинстве своем отличаются в зависимости от выбранного Body Type. И поговорим о readonly информации представленной в нижней части компонента.

Надеюсь пост оказался полезным. Буду рад вашим лайкам и подпискам. Также буду признателен, если вы напишете в комментариях свое мнение об этом обзоре, укажете моменты, которые стоит исправить или подтянуть. Принимается любая конструктивная критика.

А теперь всем удачи и всем пока! Отличных вам игр, друзья!

Кстати. Почему когда во дворе большого дома кто-то звал Васю, всегда отзывался один и тот же человек?