Rigidbody2d unity как работает
Перейти к содержимому

Rigidbody2d unity как работает

  • автор:

Работа с компонентом 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 открывает возможности для интерактивного и динамичного игрового процесса.

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 (Твердое тело)

Rigidbodies enable your GameObjects to act under the control of physics. The Rigidbody can receive forces and torque to make your objects move in a realistic way. Any GameObject must contain a Rigidbody to be influenced by gravity, act under added forces via scripting, or interact with other objects through the NVIDIA PhysX physics engine.

Свойства

Свойство: Функция:
Mass The mass of the object (in kilograms by default).
Drag Какое воздушное сопротивление оказывается на объект пока он перемещается под воздействием этих сил. 0 означает отсутствие сопротивления, а бесконечность (infinity) тут же прекращает перемещение объекта.
Angular Drag Какое воздушное сопротивление оказывается на объект пока он вращается под воздействием силы вращения. 0 означает отсутствие сопротивления. Учтите что вы не можете остановить вращение объекта путём установки его углового сопротивления (Angular Drag) в бесконечное (infinity) положение.
Use Gravity При включении на объект действует гравитация.
Is Kinematic If enabled, the object will not be driven by the physics engine, and can only be manipulated by its Transform. This is useful for moving platforms or if you want to animate a Rigidbody that has a HingeJoint attached.
Interpolate Попробуйте одну из опций если вы замечаете тряску в перемещении своего твёрдого тела.
None Не применено никакой интерполяции.
Interpolate Сглаживание транформации основано на трансформации из предыдущего кадра.
Extrapolate Сглаживание трансформации основано на приблизительной трансформации следующего кадра.
Collision Detection Используется для предотвращения проникновения быстро перемещающихся объектов сквозь другие объекты без определения столкновений.
Discrete На всех остальных коллайдерах сцены используйте осторожное (Discreet) обнаружение столкновений. Другие коллайдеры будут использовать осторожное обнаружение столкновений при проверке на столкновения против них. Используется для нормальных столкновений (стандартное значение).
Continuous Используйте осторожное обнаружение столкновений против динамических коллайдеров (с твёрдыми телами) и непрерывное обнаружение столкновений против статичных меш коллайдеров (без твёрдых тел). Твёрдые тела установленные как непрерывные динамические (Continuous Dynamic) будут использовать непрерывное обнаружение столкновений при тестировании на столкновения против этого твёрдого тела. Другие твёрдые тела будут использовать осторожное обнаружение столкновений. Используется для объектов, с которыми нужно столкнуться при помощи динамического обнаружения столкновений. Всё это оказывает большое влияние на физическую производительность, поэтому оставьте данное значение установленным в Discrete, если не испытываете проблем со столкновением быстро движущихся объектов.
Continuous Dynamic Используйте непрерывное обнаружение столкновений против объектов настроенных на непрерывное и непрерывное динамическое столкновение. Также будет использоваться непрерывное обнаружение столкновений против статичных меш коллайдеров (без твёрдых тел). Для всех остальных коллайдеров будет использоваться осторожное обнаружение столкновений. Используется для быстро движущихся объектов.
Constraints Ограничения движения твёрдого тела:-
Freeze Position Выборочно останавливает перемещение твёрдого тела по осям X, Y и Z.
Freeze Rotation Выборочно останавливает вращение твёрдого тела по осям X, Y и Z.

Детали

Rigidbodies allow your GameObjects to act under control of the physics engine. This opens the gateway to realistic collisions, varied types of joints, and other very cool behaviors. Manipulating your GameObjects by adding forces to a Rigidbody creates a very different feel and look than adjusting the Transform Component directly. Generally, you shouldn’t manipulate the Rigidbody and the Transform of the same GameObject — only one or the other.

Наибольшее отличие между управлением трансформациями и твёрдыми телами заключается в использовании сил. Твёрдые тела могут управляться силами и вращением, трансформации же не могут. Трансформации можно перемещать и вращать, но это не то же самое, что и использование физики. Вы заметите разницу, когда решите сами испробовать это на деле. Добавление силы/вращения к твёрдому телу позволит изменить позицию и вращение компонента трансформаций (Transform) объекта. Вот почему вам нужно использовать только один из них. Изменение трансформаций при использовании физики может создать проблемы столкновениях и других вычислениях.

Rigidbodies must be explicitly added to your GameObject before they will be affected by the physics engine. You can add a Rigidbody to your selected object from Components->Physics->Rigidbody in the menu. Now your object is physics-ready; it will fall under gravity and can receive forces via scripting, but you may need to add a Collider or a Joint to get it to behave exactly how you want.

Наследование

Когда объект находится под управлением физики, он перемещается частично независимо от своих родителей. Если вы переместите одного из родителей, они потянут за собой Rigidbody потомков. Однако, твёрдые тела также будут падать вниз под воздействием силы тяжести и реагировать на события столкновений.

Скриптинг

To control your Rigidbodies, you will primarily use scripts to add forces or torque. You do this by calling AddForce() and AddTorque() on the object’s Rigidbody. Remember that you shouldn’t be directly altering the object’s Transform when you are using physics.

Анимация

For some situations, mainly creating ragdoll effects, it is neccessary to switch control of the object between animations and physics. For this purpose Rigidbodies can be marked isKinematic. While the Rigidbody is marked isKinematic, it will not be affected by collisions, forces, or any other part of the physics system. This means that you will have to control the object by manipulating the Transform component directly. Kinematic Rigidbodies will affect other objects, but they themselves will not be affected by physics. For example, Joints which are attached to Kinematic objects will constrain any other Rigidbodies attached to them and Kinematic Rigidbodies will affect other Rigidbodies through collisions.

Коллайдеры

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

коллайдеры определяют физические границы твёрдого тела

Add a Collider with the Component->Physics menu. View the Component Reference page of any individual Collider for more specific information:

  • Box коллайдер — примитивная форма куба
  • Сферический коллайдер — примитивная форма сферы
  • Капсульный коллайдер — примитивная форма капсулы
  • Меш коллайдер — создаёт коллайдер из меша объекта, не может сталкиваться с другим меш коллайдером
  • Wheel Collider — специально для создания автомобилей и другого транспорта
  • Terrain Collider — handles collision with Unity’s terrain system

Составные коллайдеры

Compound Colliders are combinations of primitive Colliders, collectively acting as a single Collider. They come in handy when you have a model that would be too complex or costly in terms of performance to simulate exactly, and want to simulate the collision of the shape in an optimal way using simple approximations. To create a Compound Collider, create child objects of your colliding object, then add a Collider component to each child object. This allows you to position, rotate, and scale each Collider easily and independently of one another. You can build your compound collider out of a number of primitive colliders and/or convex mesh colliders.

Настройка составного коллайдера реального мира

На картинке сверху, игровой объект Gun Model с назначенным твёрдым телом и несколькими примитивными коллайдерами в качестве потомков игрового объекта. При движении Rigidbody родителя под воздействием сил, потомки коллайдеры будут двигаться вместе с ним в том же направлении. Примитивные коллайдеры будут сталкиваться с меш коллайдерами окружающей среды, и родительский Rigidbody изменит способ своего перемещения, основываясь на силах, применённых к нему и том, как его потомки коллайдеры взаимодействуют с другими коллайдерами в сцене.

Mesh Colliders can’t normally collide with each other. If a Mesh Collider is marked as Convex, then it can collide with another Mesh Collider. The typical solution is to use primitive Colliders for any objects that move, and Mesh Colliders for static background objects.

Непрерывное обнаружение столкновений

Continuous collision detection is a feature to prevent fast-moving colliders from passing each other. This may happen when using normal (Discrete) collision detection, when an object is one side of a collider in one frame, and already passed the collider in the next frame. To solve this, you can enable continuous collision detection on the rigidbody of the fast-moving object. Set the collision detection mode to Continuous to prevent the rigidbody from passing through any static (ie, non-rigidbody) MeshColliders. Set it to Continuous Dynamic to also prevent the rigidbody from passing through any other supported rigidbodies with collision detection mode set to Continuous or Continuous Dynamic. Непрерывное обнаружение столкновений поддерживается для Box-, Sphere- и Capsule коллайдеров. Учтите, что непрерывное обнаружение столкновений служит в качестве системы поддержки для отлова столкновений в тех случаях, когда объекты могли бы пройти сквозь друг друга, но она не предоставляет физически аккуратных результатов столкновений, поэтому вы можете всё ещё счесть нужным уменьшить значение фиксированного временного шага (fixed Time step) в инспекторе менеджера времени (TimeManager), чтобы симуляция прошла более точно если вы испытывали бы проблемы с быстро движущимися объектами.

Используйте правильный размер

Размер вашего игрового объекта играет большую роль по сравнению с массой твёрдого тела. Если вы заметили что ваше твёрдое тело ведёт себя не так, как вы изначально задумывали — медленно двигается, колеблется, или некорректно сталкивается — попробуйте настроить масштаб своего меш ассета. Стандартная единица измерения в Unity 1 юнит = 1 метр, Например, разрушающийся на части небоскрёб выглядит гораздо иначе нежели башня, собранная из игрушечных блоков, поэтому объекты разного размера должны быть смоделированы в масштабе.

If you are modeling a human make sure the model is around 2 meters tall in Unity. To check if your object has the right size compare it to the default cube. You can create a cube using GameObject > 3D Object > Cube. The cube’s height will be exactly 1 meter, so your human should be twice as tall.

If you aren’t able to adjust the mesh itself, you can change the uniform scale of a particular mesh asset by selecting it in Project View and choosing Assets->Import Settings… from the menu. Here, you can change the scale and re-import your mesh.

Если в вашей игре необходимо сделать так, чтобы создавались экземпляры объектов типа GameObject разного размера, будет вполне нормальным изменять значения масштаба осей трансформаций вашего объекта. Плохой стороной этого процесса является то, что физическая симуляция должна брать на себя основную часть работы во время создания экземпляров объекта, а это в свою очередь может сказаться на снижении производительности в вашей игре. Но это не ужасная потеря, и это не так уж эффективно как при использовании для масштабирования ваших объектов двух других опций. Также не забывайте о том, что неравномерное масштабирование может привести к непредсказуемому поведению при использовании наследования. Поэтому, в таких случаях лучше в своём пакете трёхмерного моделирования изначально создавать свои объекты в правильном масштабе.

Советы

  • The relative Mass of two Rigidbodies determines how they react when they collide with each other.
  • Making one Rigidbody have greater Mass than another does not make it fall faster in free fall. Use Drag for that.
  • A low Drag value makes an object seem heavy. A high one makes it seem light. Typical values for Drag are between .001 (solid block of metal) and 10 (feather).
  • Если вы напрямую управляете компонентом Transform своего объекта, но хотите воспользоваться физикой, тогда назначьте ему твёрдое тело (Rigidbody) и сделайте его кинематическим (Kinematic).
  • Если вы перемещаете игровой объект через его компонент преобразования (Transform), но хотите получать сообщения о столкновениях/переключениях, вы должны назначить перемещающемуся объекту компонент твёрдое тело (Rigidbody).
  • Вы не можете остановить вращение объекта путём установки его углового сопротивления (Angular Drag) в бесконечное (infinity) положение.

Компонент Rigidbody 2d Unity

  • Body Type — тип тела. Три варианта, dynamic — динамическое тело(с массой), cinematic — тело без массы, statc — жестко зафиксированное тело.
  • Simulated — TO DO.
  • Use Auto Mass — использовать автоматический расчет массы. Расчитывается исходя из размеров Коллайдера.
  • Mass — масса.
  • Linear Drag — размер линейного сопротивления.
  • Angular Drag — размер сопротивления на поворот объекта.
  • Gravity Scale — угол, при котором на объект действует гравитация.
  • Collision Detection — как обрабатывать столкновения между объектами. Discrete — событие столкновения регистрируется при взаимодействии коллайдеров, во время программно обновления расчетов. Continuous — столкновение регистрируется, когда коллайдер объекта должен коснуться другого коллайдера, между обновлениям расчетов.
  • Sleeping Mode — для экономии ресурсов, объект может спать, sleeping mode обрабатывает этот эффект. Never Sleep — объект никогда не спит. Start Awake — объект изначально не спящий. Start Asleep — объект спит, но может быть разбужен внешними воздействиями.
  • Interpolate — сглаживание объекта. None — сглаживание не применяется. Interpolate — применяется сглаживание, основанное на предыдущем и текущем кадрах. Extrapolate — применяется сглаживание, основанное на текущем и будущем кадрах.
  • Constraints — ограничение на движение твердого тела. Freeze Position — Останавливает движение объекта, движущегося по осям X и Y. Freeze Rotation — останавливает объект, вращающийся вокруг оси Z.

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

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

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