Version: 5.4
Меш-коллайдер (Mesh Collider)
Sphere Collider

Rigidbody (Твердое тело)

Твёрдые тела позволяют вашим игровым объектам взаимодействовать с помощью физики. Для реалистичного перемещения твёрдых тел, на последние воздействуют сила вращения и другие силы. Любой игровой объект должен содержать в себе твёрдое тело, чтобы быть подверженным гравитации, действовать согласно назначенным путём скриптинга силам, или взаимодействовать с другими объектами через физический движок NVIDIA PhysX.

Свойства

Свойство: Функция:
Mass The mass of the object (in kilograms by default).
Drag Какое воздушное сопротивление оказывается на объект пока он перемещается под воздействием этих сил. 0 означает отсутствие сопротивления, а бесконечность (infinity) тут же прекращает перемещение объекта.
Angular Drag Какое воздушное сопротивление оказывается на объект пока он вращается под воздействием силы вращения. 0 означает отсутствие сопротивления. Учтите что вы не можете остановить вращение объекта путём установки его углового сопротивления (Angular Drag) в бесконечное (infinity) положение.
Use Gravity При включении на объект действует гравитация.
Is Kinematic При включении, объект не будет управляться физическим движком, и сможет управляться только при помощи своей трансформации. Полезно при перемещении платформ или если вам необходимо анимировать твёрдое тело, которое имеет назначенный HingeJoint.
Interpolate Попробуйте одну из опций если вы замечаете тряску в перемещении своего твёрдого тела.
- None Не применено никакой интерполяции.
- Interpolate Сглаживание транформации основано на трансформации из предыдущего кадра.
- Extrapolate Сглаживание трансформации основано на приблизительной трансформации следующего кадра.
Collision Detection Используется для предотвращения проникновения быстро перемещающихся объектов сквозь другие объекты без определения столкновений.
- Discrete На всех остальных коллайдерах сцены используйте осторожное (Discreet) обнаружение столкновений. Другие коллайдеры будут использовать осторожное обнаружение столкновений при проверке на столкновения против них. Используется для нормальных столкновений (стандартное значение).
- Continuous Используйте осторожное обнаружение столкновений против динамических коллайдеров (с твёрдыми телами) и непрерывное обнаружение столкновений против статичных меш коллайдеров (без твёрдых тел). Твёрдые тела установленные как непрерывные динамические (Continuous Dynamic) будут использовать непрерывное обнаружение столкновений при тестировании на столкновения против этого твёрдого тела. Другие твёрдые тела будут использовать осторожное обнаружение столкновений. Используется для объектов, с которыми нужно столкнуться при помощи динамического обнаружения столкновений. Всё это оказывает большое влияние на физическую производительность, поэтому оставьте данное значение установленным в Discrete, если не испытываете проблем со столкновением быстро движущихся объектов.
- Continuous Dynamic Используйте непрерывное обнаружение столкновений против объектов настроенных на непрерывное и непрерывное динамическое столкновение. Также будет использоваться непрерывное обнаружение столкновений против статичных меш коллайдеров (без твёрдых тел). Для всех остальных коллайдеров будет использоваться осторожное обнаружение столкновений. Используется для быстро движущихся объектов.
Constraints Ограничения движения твёрдого тела:-
- Freeze Position Выборочно останавливает перемещение твёрдого тела по осям X, Y и Z.
- Freeze Rotation Stops the Rigidbody rotating around the local X, Y and Z axes selectively.

Детали

Твёрдые тела позволяют вам действовать в рамках использования физическим движком. И это открывает возможности использования реалистичных столкновений, различных типов соединений (joints) и других очень замечательных возможностей. Манипуляция вашими игровыми объектами, путём добавления физических сил к их твёрдым телам создаёт совершенно иной подход и видимость чем прямолинейная настройка компонента Transform. Обычно, вы не должны управлять твёрдым телом (Rigidbody) и трансформациями (Transform) одновременно - только одним из них.

Наибольшее отличие между управлением трансформациями и твёрдыми телами заключается в использовании сил. Твёрдые тела могут управляться силами и вращением, трансформации же не могут. Трансформации можно перемещать и вращать, но это не то же самое, что и использование физики. Вы заметите разницу, когда решите сами испробовать это на деле. Добавление силы/вращения к твёрдому телу позволит изменить позицию и вращение компонента трансформаций (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 потомков. Однако, твёрдые тела также будут падать вниз под воздействием силы тяжести и реагировать на события столкновений.

Скриптинг

Чтобы контролировать свои твёрдые тела, вы будете в основном использовать скрипты для добавления сил и вращения. Вы можете это сделать, вызвав на твёрдом теле (Rigidbody) объекта AddForce() и AddTorque(). Помните что при использовании физики вы не должны напрямую менять трансформацию объекта.

Анимация

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.

Коллайдеры

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

Colliders define the physical boundaries of a Rigidbody
Colliders define the physical boundaries of a Rigidbody

Добавьте коллайдер при помощи меню Component->Physics. Посетите страницу руководства компонентов для получения дополнительной информации по каждому конкретному коллайдеру:

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

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.

A real-world Compound Collider setup
A real-world Compound Collider setup

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

Меш коллайдеры не могут нормально сталкиваться друг с другом. Если меш коллайдер помечен как Convex, тогда он может сталкиваться с другим меш коллайдером. Обычным выходом из ситуации будет использование примитивных коллайдеров для любых движущихся объектов, и меш коллайдеров для статичных второстепенных объектов.

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

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. Continuous collision detection is supported for Box-, Sphere- and CapsuleColliders. Note that continuous collision detection is intended as a safety net to catch collisions in cases where objects would otherwise pass through each other, but will not deliver physically accurate collision results, so you might still consider decreasing the fixed Time step value in the TimeManager inspector to make the simulation more precise, if you run into problems with fast moving objects.

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

Размер вашего игрового объекта играет большую роль по сравнению с массой твёрдого тела. Если вы заметили что ваше твёрдое тело ведёт себя не так, как вы изначально задумывали - медленно двигается, колеблется, или некорректно сталкивается - попробуйте настроить масштаб своего меш ассета. Стандартная единица измерения в 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 разного размера, будет вполне нормальным изменять значения масштаба осей трансформаций вашего объекта. Плохой стороной этого процесса является то, что физическая симуляция должна брать на себя основную часть работы во время создания экземпляров объекта, а это в свою очередь может сказаться на снижении производительности в вашей игре. Но это не ужасная потеря, и это не так уж эффективно как при использовании для масштабирования ваших объектов двух других опций. Также не забывайте о том, что неравномерное масштабирование может привести к непредсказуемому поведению при использовании наследования. Поэтому, в таких случаях лучше в своём пакете трёхмерного моделирования изначально создавать свои объекты в правильном масштабе.

Советы

  • Относительная Mass двух твёрдых тел, определяющая то, как они реагируют на столкновение друг с другом.
  • Установка Mass одного твёрдого тела больше массы другого твёрдого тела не подразумевает того, что при свободном падении оно будет падать быстрее. Используйте для этого Drag.
  • Маленькое значение Drag заставляет объект казаться тяжёлым, а большое лёгким. Типичные значения для Drag находятся между .001 (твёрдый блок или метал) и 10 (пёрышко).
  • Если вы напрямую управляете компонентом Transform своего объекта, но хотите воспользоваться физикой, тогда назначьте ему твёрдое тело (Rigidbody) и сделайте его кинематическим (Kinematic).
  • Если вы перемещаете игровой объект через его компонент преобразования (Transform), но хотите получать сообщения о столкновениях/переключениях, вы должны назначить перемещающемуся объекту компонент твёрдое тело (Rigidbody).
  • Вы не можете остановить вращение объекта путём установки его углового сопротивления (Angular Drag) в бесконечное (infinity) положение.
Меш-коллайдер (Mesh Collider)
Sphere Collider