Rigidbody unity что это
Перейти к содержимому

Rigidbody unity что это

  • автор:

Rigidbodies (твёрдые тела)

Rigidbody — это основной компонент, подключающий физическое поведение для объекта. С прикреплённым Rigidbody, объект немедленно начнёт реагировать на гравитацию. Если добавлен один или несколько компонентов Collider, то при коллизиях (столкновениях) объект будет передвигаться.

Так как компонент Rigidbody управляет перемещением объекта, к которому он прикреплён, вам не следует пытаться воздействовать на объект из кода с помощью изменения таких свойств Transform, как position и rotation. Вместо этого вам следует применять силы для того, чтобы толкать объект и позволить физическому движку рассчитать результаты.

There are some cases where you might want a GameObject to have a Rigidbody without having its motion controlled by the physics engine. For example, you may want to control your character directly from script code but still allow it to be detected by triggers (see Triggers under the Colliders topic). This kind of non-physical motion produced from a script is known as kinematic motion. The Rigidbody component has a property called Is Kinematic which removes it from the control of the physics engine and allow it to be moved kinematically from a script. It is possible to change the value of Is Kinematic from a script to allow physics to be switched on and off for an object, but this comes with a performance overhead and should be used sparingly.

См. страницы справки по Rigidbody и Rigidbody 2D для дополнительной информации о настройках и опциях по скриптингу этих компонентов.

Засыпание

When a Rigidbody is moving slower than a defined minimum linear or rotational speed, the physics engine assumes it has come to a halt. When this happens, the GameObject does not move again until it receives a collision or force, and so it is set to “sleeping” mode. This optimisation means that no processor time is spent updating the Rigidbody until the next time it is “awoken” (that is, set in motion again).

Когда твёрдое тело перемещается со скоростью, меньшей определённого минимального порога, физический движок предполагает, что оно остановилось и находится в покое. При этом, объект не будет вновь двигаться до тех пор, пока с ним не произойдёт столкновение или пока к нему не применят силу, так что он уходит в “спящий” режим. Эта оптимизация означает, что на объект не будут расходоваться ресурсы CPU, пока его вновь не “разбудят” (т.е. не вновь не приведут в движение). По многим причинам засыпание и пробуждение твёрдых тел происходит прозрачно. Однако, иногда объект не удаётся разбудить, если в него или от него переместится статичный коллайдер (тот, что без твёрдого тела) изменяя положение трансформации. Это может привести, скажем, к висящему в воздухе твёрдому телу, когда пол под ним сдвинулся вниз. В таких случаях объект можно разбудить принудительно, с помощью функции WakeUp . См. страницы про компоненты Rigidbody и Rigidbody 2D для дополнительной информации о засыпании.

Работа с компонентом Rigidbody Unity

Работа с компонентом Rigidbody в Unity необходима для создания динамичного и основанного на физике поведения в ваших играх. Компонент Rigidbody позволяет игровым объектам подвергаться воздействию физических сил, столкновений и гравитации. Вот ключевые аспекты для понимания и работы с компонентом Rigidbody:

Добавление компонента Rigidbody

Чтобы использовать симуляцию физики в GameObject, вам нужно добавить к нему компонент Rigidbody. Вы можете сделать это, выбрав GameObject в редакторе Unity и нажав ‘Add Component -> Physics -> Rigidbody’. Альтернативно вы можете добавить компонент программно, используя метод ‘AddComponent()’.

Свойства твердого тела

Компонент Rigidbody предоставляет различные свойства для управления физическим поведением GameObject. Некоторые важные свойства включают в себя:

  • ‘Mass’: Масса объекта, определяющая его устойчивость к ускорению и ударам.
  • ‘Drag’: сопротивление воздуха, действующее на объект, влияющее на его замедление.
  • ‘Angular Drag’: сопротивление воздуха при вращении влияет на угловое замедление объекта.
  • ‘Use Gravity’: применять ли гравитацию к объекту или нет.
  • ‘Constraints’: Разрешить ограничение движения по определенным осям или заморозку вращения.

Применение сил и скорости

Вы можете применить силы и скорость к Rigidbody, чтобы повлиять на его движение. Общие методы включают в себя:

  • ‘AddForce()’: Прикладывает силу к Rigidbody в заданном направлении.
  • ‘AddTorque()’: применяет силу вращения к твердому телу.
  • ‘velocity’: позволяет напрямую манипулировать скоростью твердого тела.

Обнаружение столкновений

Компонент Rigidbody обеспечивает обнаружение столкновений и реагирование между игровыми объектами. Когда два твердых тела сталкиваются, физический движок Unity’s обрабатывает реакцию столкновения. Вы можете использовать события столкновений, например ‘OnCollisionEnter()’, для выполнения действий при возникновении столкновений.

Взаимодействие с кинематическими твердыми телами

По умолчанию Rigidbodies не являются кинематическими, то есть на них влияет физика. Однако вы можете установить для свойства Rigidbody ‘isKinematic’ значение ‘true’, чтобы на него не влияли внешние силы. Это полезно для объектов, управляемых скриптами или анимацией.

Взаимодействие твердого тела и преобразования

Компонент Rigidbody взаимодействует с компонентом Transform. Когда Rigidbody прикрепляется к GameObject, положение и вращение Transform будут автоматически обновляться на основе симуляции физики. Точно так же вы можете изменить положение и вращение Transform, и Rigidbody отреагирует соответствующим образом.

Вопросы производительности

Использование Rigidbodies и физического моделирования может иметь последствия производительности, особенно при наличии большого количества объектов или сложных взаимодействий. Рассмотрите возможность оптимизации настроек физики, использования эффективных форм столкновений и использования FixedUpdate для обновлений физики.

Заключение

Эффективно используя компонент Rigidbody, вы можете создавать реалистичное физическое поведение в своих Unity играх. Будь то моделирование гравитации, применение сил или обработка столкновений, понимание и использование компонента Rigidbody открывает возможности для интерактивного и динамичного игрового процесса.

Unity3d — Rigidbody

Rigidbody — это компонент отвечающий за физику.

Параметры

  • Mass — масса объекта.
  • Drag — сопротивление среды. Может использоваться для замедления скорости движения объекта, например, во время падения объекта.
  • Angular Drag — сопротивление среды для углового вращения объекта. Работает аналогично drag, но применяется именно к вращению.
  • Use Gravity — флаг наличия гравитации.
  • Is Kinematic — флаг влияния физики движка на объект с RigidBody. Если нужен неподвижный объект, то это самое то.
  • Interpolate — нахождение промежуточных расчетов физики для сглаживания эффектов, например, для более плавного движения объекта.
  • Collision Detection — режим обнаружения столкновений.
  • Constraints — ограничения, используется для запрета перемещения и вращения по выбранной оси.

Время расчета физики можно менять в меню «Project Settings»-«Time»-«Fixed Timestep».

Изменять силу гравитации можно в «Project Settings»-«Physics»-«Gravity».

Возможно, вам будет интересно:

  1. Автоматическое масштабирование Canvas для разных разрешений экранов на Unity3d
  2. Уровень API игры на Unity3d для публикации в Google Play (error API level 29)

Как работает Drag в физике Unity

Осознавая что мои статьи похожи на восторг человека, впервые увидевшего какую-то (многим уже давно знакомую) вещь, все же решил написать очередную. Причина — заинтересовавший меня параметр drag у компонента Rigidbody. Объяснений и, тем более, формул — как он работает — руководства не дают. Поэтому разбираться придется самому.

Если кому-то лень читать, можно перелистать вниз, где находится найденный алгоритм того, как в Unity работает замедление с использованием drag.

При знакомстве с физикой в Unity первое, чему учат, это тому, что Rigidbody — воплощение физических свойств объекта. У него есть пара параметров, задающих его взаимодействие с окружающим миром. Собственно, наиболее значимый для динамических объектов: масса. С ней все интуитивно понятно: закон Ньютона и все такое… Приложили силу кратковременно — получили импульс и, соответственно, изменили скорость объекта. Прикладываем длительное время: получаем ускорение в зависимости от массы.

Кроме этого, у Rigidbody есть интересный параметр — drag. Выражаясь словами разработчиков: параметр drag задает drag объекта. На их языке drag — это замедление, торможение. Других объяснений — не дается. Говоря о физике и торможении, в голову приходит что-то из баллистики (аэродинамики, гидродинамики и пр.). Возможно, drag — это некий коэффициент, пропорциональный квадрату скорости. Это было бы разумно. Но.

Простой опыт показывает, что в Unity тела с большим значением drag не двигаются вообще. Гравитация на них не влияет, толкнуть их невозможно. Но при этом они стоят, то есть квадрат их скорости равен нулю. Значит тут все не так просто… или же, наоборот, не все так сложно. Физика в компьютерных играх должна просчитываться быстро, а значит возможны упрощения относительно реальной физической модели. Хотя реализовать игру, скажем, с релятивистскими эффектами было бы забавно…

Первый вопрос, которым я задался: хотя бы, масса в Unity ведет себя как масса? Эксперимент показал, что — да.

Проверка массы/гравитации

Для начала, в простой сцене я запустил шарик с массой 1 с высоты 5 метров на плоскость. Триггер на плоскости останавливал таймер, так что я мог наблюдать время падения шарика.

image

Расчетное время падения для него должно составлять: t = sqrt(2*h/g), где h — высота, g — ускорение свободного падения. В нашем случае (h=5м, g=9.81м/с^2) t ≈ 1.0096.
Запуск показал значение 1.02, что близко к нужному.

image

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

void FixedUpdate()

Результат оказался тот же самый (t=1.02). Неплохо.

Для действующей силы были затем использованы несколько разных значения. И всегда изменение действующей силы (rb.AddForce(0, xxx, 0);) вызывало изменение времени «падения», совпадающее с расчетным. Так что модель взаимодействия сил и массы оказалась вполне знакомой, ньютоновской.

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

image

Для начала стоило проверить простое падение без замедления (drag=0). Код, двигающий второй шарик был довольно прост:

 void FixedUpdate()

rb — это компонент Rigidbody сферы. gForceVector — вектор гравитации (0, 9.81, 0).

image

Пока все совпадает.

Теперь, левому шарику увеличиваем drag (drag=2). Он стал падать медленнее:

image

Интересный факт. Увеличение параметра drag до больших значений (бо́льших или равных примерно 50) приводило к тому, что шарик вообще не двигался. Изменение массы объекта никак не влияло на этот факт, что привело к мысли, что параметр drag — кинематический, то есть он зависит (и влияет) на положение, скорость, ускорение и т.д., не принимая в расчет силы или импульс.

Что еще могло влиять на алгоритм, где фигурировал drag? Возможно, частота обновления физики. Хотя это означало бы не самый лучший ход со стороны разработчиков. Но чем черт не шутит. Поменяем время обновления физики до 0.005 секунд.

image

Зависимость все же имеется. Однако, похоже, это вычислительные ошибки. Дальнейшие увеличения частоты обновления физики существенно время падения не меняют. Что, кстати, означает, что где-то в коде разработчиков должно быть что-то вроде «. *Time.fixedDeltaTime«.

Итак, что мы знаем про параметр drag? Он — кинематический (считается после действия всех сил). Умножается (хотя возможно и не он сам) на Time.fixedDeltaTime и уменьшает скорость. Самое простое, что можно было бы придумать с такими условиями, выглядит примерно так:

void FixedUpdate()

Новое действие выглядит довольно примитивно: одно умножение и одно вычитание (с поправкой на то, что действия осуществляются с векторами). Однако, с чего-то нужно начать. Проверяем этот код, для удобства автоматически присваивая переменной myDrag (из скрипта второй сферы) значение параметра drag первой сферы.

image

drag=1

image

drag=3

image

drag=15

image

drag=50

Собственно, здесь оба шарика так и не начали движение. Мне просто надоело ждать.

Итак, результат получился для меня неожиданный. Примитивный алгоритм, который задумывался как начальная точка, от которой бы я дальше отталкивался — оказался конечной точкой. Похоже, именно так и считается замедление в Unity с использованием параметра drag. С другой стороны — проще, значит быстрее (в плане времени выполнения).

Дальнейшие эксперименты расхождений между моим скриптом и встроенной физикой почти не показали. Почти. Оставалась одна мелочь. При значении drag=100 мой второй, движимый скриптом шарик, величественно поплыл вверх.

image

drag=100

В общем-то, этого следовало ожидать, исходя из алгоритма. Однако, в Unity подобного не наблюдается. Следовательно, нам осталась одна простейшая модификация кода:

void FixedUpdate()

Теперь, «отрицательное» движение исключено и мы имеем полноценную имитацию действия сил и торможения движка Unity.

Физический аналог непосредственно параметра drag подобрать проблематично. Можно лишь сказать, что он определяет нелинейное трение (или нелинейное сопротивление — кому как удобнее). При этом сам алгоритм прост и, вероятно, быстро выполняем. А потому, если от физической модели не требуется какой-то особой достоверности или большой предсказуемости — использование параметра drag не лишено смысла.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *