Version: 2019.3
Rigidbodies (твёрдые тела)
Сочленения (Joints)

Коллайдеры (Colliders)

Collider components define the shape of a GameObject for the purposes of physical collisions. A collider, which is invisible, does not need to be the exact same shape as the GameObject’s mesh. A rough approximation of the mesh is often more efficient and indistinguishable in gameplay.

The simplest (and least processor-intensive) colliders are primitive collider types. In 3D, these are the Box Collider, Sphere Collider and Capsule Collider. In 2D, you can use the Box Collider 2D and Circle Collider 2D. You can add any number of these to a single GameObject to create compound colliders.

Compound colliders

Compound colliders approximate the shape of a GameObject while keeping a low processor overhead. To get further flexibility, you can add additional colliders on child GameObjects. For instance, you can rotate boxes relative to the local axes of the parent GameObject. When you create a compound collider like this, you should only use one Rigidbody component, placed on the root GameObject in the hierarchy.

Primitive colliders do not work correctly with shear transforms. If you use a combination of rotations and non-uniform scales in the Transform hierarchy so that the resulting shape is no longer a primitive shape, the primitive collider cannot represent it correctly.

Mesh colliders

There are some cases, however, where even compound colliders are not accurate enough. In 3D, you can use Mesh Colliders to match the shape of the GameObject’s mesh exactly. In 2D, the Polygon Collider 2D does not match the shape of the sprite graphic perfectly but you can refine the shape to any level of detail you like.

These colliders are much more processor-intensive than primitive types, so use them sparingly to maintain good performance. Also, a mesh collider cannot collide with another mesh collider (i.e., nothing happens when they make contact). You can get around this in some cases by marking the mesh collider as Convex in the Inspector. This generates the collider shape as a “convex hull” which is like the original mesh but with any undercuts filled in.

The benefit of this is that a convex mesh collider can collide with other mesh colliders so you can use this feature when you have a moving character with a suitable shape. However, a good rule is to use mesh colliders for scene geometry and approximate the shape of moving GameObjects using compound primitive colliders.

Static colliders

You can add colliders to a GameObject without a Rigidbody component to create floors, walls and other motionless elements of a Scene. These are referred to as static colliders. You should not reposition static colliders by changing the Transform position because this impacts heavily on the performance of the physics engine. Colliders on a GameObject that has a Rigidbody are known as dynamic colliders. Static colliders can interact with dynamic colliders but since they don’t have a Rigidbody, they do not move in response to collisions.

Физические материалы (Physics Materials)

Когда коллайдеры взаимодействуют, их поверхностям надо симулировать свойства материала, из которого они теоретически должны состоять. Например, слой льда будет более скользким, в то время как резиновый мяч будет предлагать больше трения и будет очень упругим. Хотя форма коллайдеров и не деформируется во время коллизий, их трение и упругость можно настроить используя физические материалы (Physics Materials). Настроить параметры так, как хочется, можно методом проб и ошибок, но, например, материал льда будет иметь нулевое (или очень маленькое) трение, а резиновый материал будет с большим показателем трения и почти идеальной упругостью. Для дополнительной информации по доступным параметрам, читайте страницы справки Physic Material и Physics Material 2D. Учтите, что, по историческим причинам, 3D ассет называется Physic Material, в то время как 2D эквивалент называется Physics Material 2D (с “s” после “Physic”).

Триггеры (Triggers)

В случае столкновения, система скриптинга может это обнаружить и выполнить действия, указанные в функции OnCollisionEnter. Однако вы также можете использовать физический движок просто для обнаружения того, что один коллайдер входит в пространство другого, без создания коллизии. Коллайдер, настроенный как триггер (с помощью свойства Is Trigger), не ведёт себя как твёрдый объект и просто будет пропускать другие коллайдеры сквозь себя. Когда другой коллайдер войдёт “на территорию” этого коллайдера, триггер вызовет функцию OnTriggerEnter в скриптах объекта, к которому присоединён триггер.

Collision callbacks for scripts

When collisions occur, the physics engine calls functions with specific names on any scripts attached to the objects involved. You can place any code you like in these functions to respond to the collision event. For example, you might play a crash sound effect when a car bumps into an obstacle.

On the first physics update where the collision is detected, the OnCollisionEnter function is called. During updates where contact is maintained, OnCollisionStay is called and finally, OnCollisionExit indicates that contact has been broken. Trigger colliders call the analogous OnTriggerEnter, OnTriggerStay and OnTriggerExit functions. Note that for 2D physics, there are equivalent functions with 2D appended to the name, eg, OnCollisionEnter2D. Full details of these functions and code samples can be found on the Script Reference page for the MonoBehaviour class.

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

Взаимодействия коллайдеров

Коллайдеры взаимодействуют друг с другом по разному, в зависимости от того, как настроены их компоненты Rigidbody. Тремя важными конфигурациями являются статичный коллайдер (Static Collider) (т.е. компонент Rigidbody отсутствует вообще), Rigidbody коллайдер (Rigidbody Collider), и кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider).

Статичный коллайдер (Static Collider)

Это игровой объект, у которого есть коллайдер, но нету Rigidbody. Статичные коллайдеры используются для геометрии уровней, которая всегда стоит на месте и совсем не двигается. Встречные Rigidbody объекты будут врезаться в статичный коллайдер, но его не сдвинут.

The physics engine assumes that static colliders never move or change and can make useful optimizations based on this assumption. Consequently, static colliders should not be disabled/enabled, moved or scaled during gameplay. If you do change a static collider then this will result in extra internal recomputation by the physics engine which causes a major drop in performance. Worse still, the changes can sometimes leave the collider in an undefined state that produces erroneous physics calculations. For example a raycast against an altered Static Collider could fail to detect it, or detect it at a random position in space. Furthermore, Rigidbodies that are hit by a moving static collider will not necessarily be “awoken” and the static collider will not apply any friction. For these reasons, only colliders that are Rigidbodies should be altered. If you want a collider object that is not affected by incoming rigidbodies but can still be moved from a script then you should attach a Kinematic Rigidbody component to it rather than no Rigidbody at all.

Rigidbody коллайдер (Rigidbody Collider)

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

Кинематические Rigidbody коллайдеры (Kinematic Rigidbody Collider)

Это игровой объект, к которому прикреплён коллайдер и кинематический Rigidbody (т.е. свойство IsKinematic компонента Rigidbody включено). Изменяя компонент Transform, вы можете перемещать объект с кинематическим Rigidbody, но он не будет реагировать на коллизии и приложенные силы так же, как и не кинематические Rigidbody. Кинематические Rigidbody должны использоваться для коллайдеров, которые могут двигаться или периодически выключаться/включаться, иначе они будут вести себя как статичные коллайдеры. Примером этого является скользящая дверь, которая обычно является недвижимым физическим препятствием, но по надобности может открываться. В отличие от статичного коллайдера, движущийся кинематический Rigidbody будет применять трение к другим объектам и, в случае контакта, будет “будить” другие Rigidbody.

Даже когда они неподвижны, кинематические Rigidbody коллайдеры ведут себя иначе, в отличие от статичных коллайдеров. Например, если коллайдер настроен как триггер, то вам также понадобится добавить к нему Rigidbody, чтобы можно было в вашем скрипте принимать события триггера. Если вы не хотите, чтобы триггер падал под действием силы гравитации или подвергался влиянию физики, то тогда вы можете включить свойство IsKinematic.

A Rigidbody component can be switched between normal and kinematic behavior at any time using the IsKinematic property.

A common example of this is the “ragdoll” effect where a character normally moves under animation but is thrown physically by an explosion or a heavy collision. The character’s limbs can each be given their own Rigidbody component with IsKinematic enabled by default. The limbs will move normallly by animation until IsKinematic is switched off for all of them and they immediately behave as physics objects. At this point, a collision or explosion force will send the character flying with its limbs thrown in a convincing way.

Матрица действий коллизии

Когда сталкиваются 2 объекта, количество различных событий в скрипте зависит от конфигураций компонентов Rigidbody столкнувшихся объектов. Схемы ниже содержат детали того, какие функции событий будут вызваны, основываясь на присоединённых к объектам компонентах. В некоторых комбинациях эффект производится только на один из двух объектов, так что помните правило - законы физики не применяются к объектам, у которых нет присоединённого Rigidbody.

Происходит определение столкновений, и при их возникновении посылаются сообщения
Статичный коллайдер (Static Collider) Rigidbody коллайдер (Rigidbody Collider) Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider) Статичный коллайдер-триггер (Static Trigger Collider) Rigidbody коллайдер-триггер (Rigidbody Trigger Collider) Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider)
Статичный коллайдер (Static Collider)   Да        
Rigidbody коллайдер (Rigidbody Collider) Да Да Да      
Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider)   Да        
Статичный коллайдер-триггер (Static Trigger Collider)            
Rigidbody коллайдер-триггер (Rigidbody Trigger Collider)            
Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider)            
При коллизиях отсылаются сообщения триггера
Статичный коллайдер (Static Collider) Rigidbody коллайдер (Rigidbody Collider) Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider) Статичный коллайдер-триггер (Static Trigger Collider) Rigidbody коллайдер-триггер (Rigidbody Trigger Collider) Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider)
Статичный коллайдер (Static Collider)         Да Да
Rigidbody коллайдер (Rigidbody Collider)       Да Да Да
Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider)       Да Да Да
Статичный коллайдер-триггер (Static Trigger Collider)   Да Да   Да Да
Rigidbody коллайдер-триггер (Rigidbody Trigger Collider) Да Да Да Да Да Да
Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider) Да Да Да Да Да Да
Rigidbodies (твёрдые тела)
Сочленения (Joints)