Composite Collider 2D
Composite Collider 2D компонент Функциональная часть GameObject. GameObject может содержать любое количество компонентов. В Unity есть много встроенных компонентов, и вы можете создавать свои собственные, написав сценарии, которые наследуются от MonoBehaviour. Подробнее
См. в Словарь – это Коллайдер Невидимая форма, используемая для обработки физических столкновений объекта. Коллайдер не обязательно должен быть точно такой же формы, как сетка объекта — грубое приближение часто бывает более эффективным и неразличимым в игровом процессе. Подробнее
См. в Словарь , который взаимодействует с системой 2D-физики. В отличие от большинства коллайдеров, он не определяет внутреннюю форму. Вместо этого он объединяет формы любого Box Collider 2D или Polygon Collider 2D, которые вы настроили для использования. . Composite Collider 2D использует вершины (геометрию) любого из этих коллайдеров и объединяет их вместе в новую геометрию, управляемую самим Composite Collider 2D.
Оба Box Collider Компонент коллайдера в форме куба, который обрабатывает коллизии игровых объектов, таких как игральные кости и кубики льда. Подробнее
См. в Словарь Компоненты 2D и Polygon Collider 2D имеют Использовано Составной флажок. Установите этот флажок, чтобы прикрепить их к Composite Collider 2D. Эти коллайдеры также должны быть прикреплены к тому же железному телу 2D, что и составной 2D-коллайдер. Когда вы включаете параметр Используется композитом, другие свойства этого компонента исчезают, так как теперь они контролируются подключенным двухмерным композитным коллайдером.
Дополнительную информацию о сценариях с помощью CompositeCollider 2D см. в документации API CompositeCollider2D.
Свойства | Функции |
---|---|
Density | Измените плотность, чтобы изменить расчет массы GameObject, связанного Rigidbody Компонент, позволяющий воздействовать на GameObject смоделированной гравитацией и другими силами. Подробнее См. в Словарь 2D. Если вы установите значение 0, связанный с ним Rigidbody 2D игнорирует Collider 2D для всех расчетов масс, включая расчеты центра масс. Обратите внимание, что этот параметр доступен только в том случае, если вы включили параметр Использовать автомассу в связанном компоненте Rigidbody 2D. |
Material | PhysicsMaterial2D Используйте для регулировки трения и отскока, возникающего между 2D-материалами. физические объекты при их столкновении Подробнее См. в Словарь , определяющий свойства класса collisions Столкновение происходит, когда физический движок обнаруживает, что коллайдеры двух игровых объектов соприкасаются или перекрываются, когда хотя бы один из них имеет компонент Rigidbody и в движении. Подробнее См. в Словарь , такие как трение и отскок. |
Is Trigger | Установите этот флажок, если хотите, чтобы Composite Collider 2D вел себя как триггер (см. обзорную документацию по коллайдерам, чтобы узнать больше о триггерах). |
Used by Effector | Установите этот флажок, если хотите, чтобы Composite Collider 2D использовался присоединенным компонентом Effector 2D. |
Offset | Установите локальное смещение двухмерной геометрии коллайдера. |
Geometry Type | При объединении коллайдеров вершины из выбранных коллайдеров объединяются в один из двух разных типов геометрии. Используйте это раскрывающееся меню, чтобы задать тип геометрии: Контуры или Многоугольники. |
Outlines | Создает 2D-коллайдер с полыми контурами, идентичный тому, что создает 2D-коллайдер. |
Polygons | Создает 2D-коллайдер со сплошными многоугольниками, идентичный тому, что создает 2D-полигональный коллайдер. |
Generation Type | Метод, используемый для управления генерацией геометрии при изменении двухмерного композитного коллайдера или любого из составляющих его коллайдеров. |
Synchronous | Когда в Composite Collider 2D или любом из используемых им коллайдеров вносятся изменения, Unity немедленно генерирует новую геометрию. |
Manual | Генерация новой геометрии происходит только по запросу. Чтобы запросить генерацию, либо вызовите API скрипта CompositeCollider2D.GenerateGeometry, либо нажмите кнопку Regenerate Geometry, которая появляется под выбором . |
Vertex Distance | Установите значение минимального интервала, разрешенного для любых вершин, собранных из составных коллайдеров. Любая вершина ближе этого предела удаляется. Это позволяет контролировать эффективное разрешение компоновки вершин. |
Edge Radius | Управляет радиусом вокруг ребер, чтобы вершины были круглыми. Это приводит к большему коллайдеру 2D с закругленными выпуклыми углами. Значение по умолчанию для этого параметра равно 0 (без радиуса). Это работает, только если для параметра Тип геометрии установлено значение Контуры. |
Коллайдеры (Colliders)
Collider components define the shape of an object for the purposes of physical collisions. A collider, which is invisible, need not be the exact same shape as the object’s mesh and in fact, a rough approximation is often more efficient and indistinguishable in gameplay.
The simplest (and least processor-intensive) colliders are the so-called 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. Any number of these can be added to a single object to create compound colliders.
With careful positioning and sizing, compound colliders can often approximate the shape of an object quite well while keeping a low processor overhead. Further flexibility can be gained by having additional colliders on child objects (eg, boxes can be rotated relative to the local axes of the parent object). When creating a compound collider like this, there should only be one Rigidbody component, placed on the root object in the hierarchy.
Note, that primitive colliders will not work correctly with shear transforms — that means that if you use a combination of rotations and non-uniform scales in the Transform hierarchy so that the resulting shape would no longer match a primitive shape, the primitive collider will not be able to represent it correctly.
Однако существуют случаи, где даже составные коллайдеры недостаточно точны. В 3D вы можете использовать Mesh Colliders, чтобы создать коллайдер, идентичный по форме мешу объекта. В 2D Polygon Collider 2D сгенерирует форму примерно совпадающую с графикой спрайта. Не идеально, но вы можете изменить его форму до любого уровня детализации. Эти коллайдеры нагружают процессор сильнее, чем примитивные коллайдеры, так что используйте их экономно, чтобы сохранить высокую производительность. Также Mesh Collider не сможет сталкиваться с другими Mesh Collider (другими словами, при их контакте ничего не произойдёт). В некоторых случаях вы можете обойти это пометив Mesh Collider в инспекторе как Convex (выпуклый). Это создаст коллайдер формы “выпуклой оболочки”, который такой же, как и оригинальный меш, но с “заполненными” углублениями. Польза от этого в том, что выпуклый Mesh Collider может сталкиваться с другими Mesh Collider, так что вы сможете использовать эту функцию, когда у вас есть двигающийся персонаж с подходящей формой. Тем не менее хорошим общим правилом будет использование Mesh Collider для геометрии сцены, и имитировать приближённую к реальности форму для двигающихся объектов с помощью примитивных коллайдеров.
Для создания пола, стен и других неподвижных элементов сцены, к объектам без компонента Rigidbody можно добавлять коллайдеры. Они называются static (статичными) коллайдерами. Обычно вам не следует перемещать статичные коллайдеры изменяя положение их трансформации, т.к. это сильно повлияет на производительность физического движка. Коллайдеры на объекте, у которого есть Rigidbody, известны как динамичные коллайдеры. Статичные коллайдеры могут взаимодействовать с динамичными коллайдерами, но, т.к. у них нету Rigidbody, они не сдвинутся в ответ на коллизии (столкновения).
Страницы справки для различных типов коллайдеров, указанных выше, имеют дополнительную информацию об их свойствах и способах использования.
Физические материалы (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) | Да | Да | Да | Да | Да | Да |
Коллайдеры (Colliders)
Collider components define the shape of an object for the purposes of physical collisions. A collider, which is invisible, need not be the exact same shape as the object’s mesh and in fact, a rough approximation is often more efficient and indistinguishable in gameplay.
The simplest (and least processor-intensive) colliders are the so-called 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. Any number of these can be added to a single object to create compound colliders.
With careful positioning and sizing, compound colliders can often approximate the shape of an object quite well while keeping a low processor overhead. Further flexibility can be gained by having additional colliders on child objects (eg, boxes can be rotated relative to the local axes of the parent object). When creating a compound collider like this, there should only be one Rigidbody component, placed on the root object in the hierarchy.
Note, that primitive colliders will not work correctly with shear transforms — that means that if you use a combination of rotations and non-uniform scales in the tranform hierarchy so that the resulting shape would no longer match a primitive shape, the primitive collider will not be able to represent it correctly.
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 object’s mesh exactly. In 2D, the Polygon Collider 2D will generally 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, however, so use them sparingly to maintain good performance. Also, a mesh collider will normally be unable to collide with another mesh collider (ie, nothing will happen when they make contact). You can get around this in some cases by marking the mesh collider as Convex in the inspector. This will generate 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 may be able to use this feature when you have a moving character with a suitable shape. However, a good general rule is to use mesh colliders for scene geometry and approximate the shape of moving objects using compound primitive colliders.
Colliders can be added to an object without a Rigidbody component to create floors, walls and other motionless elements of a scene. These are referred to as static colliders. In general, you should not reposition static colliders by changing the Transform position since this will impact heavily on the performance of the physics engine. Colliders on an object that does have a Rigidbody are known as dynamic colliders. Static colliders can interact with dynamic colliders but since they don’t have a Rigidbody, they will not move in response to collisions.
Страницы справки для различных типов коллайдеров, указанных выше, имеют дополнительную информацию об их свойствах и способах использования.
Физические материалы (Physics Materials)
When colliders interact, their surfaces need to simulate the properties of the material they are supposed to represent. For example, a sheet of ice will be slippery while a rubber ball will offer a lot of friction and be very bouncy. Although the shape of colliders is not deformed during collisions, their friction and bounce can be configured using Physics Materials. Getting the parameters just right can involve a bit of trial and error but an ice material, for example will have zero (or very low) friction and a rubber material with have high friction and near-perfect bounciness. See the reference pages for Physic Material and Physics Material 2D for further details on the available parameters. Note that for historical reasons, the 3D asset is actually called Physic Material (without the S) but the 2D equivalent is called Physics Material 2D (with the S).
Триггеры (Triggers)
The scripting system can detect when collisions occur and initiate actions using the OnCollisionEnter function. However, you can also use the physics engine simply to detect when one collider enters the space of another without creating a collision. A collider configured as a Trigger (using the Is Trigger property) does not behave as a solid object and will simply allow other colliders to pass through. When a collider enters its space, a trigger will call the OnTriggerEnter function on the trigger object’s scripts.
Функции обратного вызова при коллизии
В случае коллизий, физический движок вызывает функции с особыми именами в скриптах, которые присоединены к вовлечённым в коллизию объектам. Вы можете поместить любой код в эти функции для реакции на событие столкновения. Например, вы можете проиграть звук аварии, когда автомобиль врезается в препятствие.
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 объекты будут врезаться в статичный коллайдер, но его не сдвинут.
В физический движок заложено предположение, что статичные коллайдеры никогда не двигаются или меняются, и, на основе этого предположения, движок делает полезные оптимизации. Следовательно, статичные коллайдеры нельзя включать/выключать, двигать или масштабировать во время игрового процесса. Если вы измените статичный коллайдер, то в результате физическим движком будет вызван дополнительный внутренний перерасчёт, который будет сопровождаться большим падением производительности. Хуже того, изменения иногда могут оставить коллайдер в неопределённом состоянии, в результате чего будут производиться ошибочные физические расчёты. Например, рейкаст к изменённому статичному коллайдеру может не обнаружить коллайдера или обнаружить его в случайном месте в пространстве. Кроме того Rigidbody объекты, в которых врежется статичный коллайдер, не обязательно будут “разбужены”, и статичный коллайдер не применит никакого трения. По этим причинам, следует изменять только коллайдеры с Rigidbody. Если вы хотите, чтобы на коллайдер объекта не влияли встречные Rigidbody, но чтобы его можно было двигать при помощи скрипта, то вам следует прикрепить кинематический Rigidbody компонент к нему, нежели вообще не добавлять Rigidbody.
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) | Да | Да | Да | Да | Да | Да |
Как использовать функции столкновений в Unity: OnCollisionEnter/Stay/Exit, OnTriggerEnter…
Столкновения (Collisions) играют важную роль в компьютерных играх. Это, пожалуй, не конкретная механика, а объемный пласт взаимодействия между игровыми объектами.
В этой статье (потом, возможно, серии статей) мы разберем, как работать со столкновениями в Unity, как ловить и обрабатывать их в коде, глубже погрузимся в тему и постараемся ответить на часто возникающие вопросы.
Предполагается, что вы уже знаете Unity и С# на базовом уровне: посмотрели один-два туториальчика, почитали парочку статей, успели потыкать в движке что-то самостоятельно и хотите продолжать развиваться
Как работает система столкновений? Что такое коллайдеры?
Система столкновений Unity работает за счет коллайдеров (Colliders).
Коллайдер — это компонент, который представляет собой невидимые «границы» объекта.
Часто они совпадают с формой самого объекта (как в реальном мире), хотя это и не обязательно.
Unity поддерживает разнообразные формы коллайдеров:
- BoxCollider — форма прямоугольного параллелепипеда
- SphereCollider — сфера
- CapsuleCollider — капсула (математически, сфероид или эллипсоид вращения)
- MeshCollider — кастомная форма 3Д-меша, соответствующая форме самого меша.
- BoxCollider2D — прямоугольник
- CircleCollider2D — круг
- PolygonCollider2D — кастомная форма 2Д-спрайта, повторяющая форму самого спрайта.
- .
Повторюсь, коллайдеры задают границы объектов, которые используются при расчете физики. Например:
Кубик лежит на столе: и куб, и стол имеют границы, поэтому не проходят сквозь друг друга.
В героя попала шальная пуля: мы зафиксируем это и уменьшим его здоровье.
Герой бежит и упирается в стену: он не может пробежать сквозь стену, потому что они оба имеют границы.
Триггеры
Триггеры — это те же коллайдеры. Серьезно, всего одна галочка в любом компоненте коллайдера превращает его в триггер!
Но триггеры «физически прозрачны». Другими словами, объекты, помеченные как триггеры*, не являются твердыми телами и пропускают любое другое тело сквозь себя.
Триггеры в основном используют как некие зоны, или области, попадание в которые влечет за собой какие-то последствия. Например:
Комната в ядовитым газом — это один большой триггер: герой проходит сквозь него без физического взаимодействия, но все время, пока герой внутри, он получает пассивный урон от яда.
Зона видимости врага — тоже триггер: когда герой находится в этой зоне, враг видит его и стреляет по нему.
Зона открытия двери — тоже может быть триггером: расположим эту зону рядом с дверью. Если игрок нажимает кнопку E находясь внутри этой зоны (т.е. достаточно близко к двери), то она открывается, иначе — нет.
Обработка столкновений
Самое интересное и важное: как правильно из кода узнать, что столкновение произошло и обработать это?
Для этого разработчики Unity подкатили нам целую набор функций. Предлагаю на практике подробно рассмотреть как работает одна из них, а потом на ее примере обсудим другие.
Итак, перед вами сцена с большой платформой, кубиком и шариком (а также небольшим освещением). Давайте сделаем так, чтобы при падении шарика на кубик последний уничтожался.
Давайте повесим коллайдеры на объекты: на шарик — SphereCollider , на кубик — BoxCollider . Помимо этого, обоим объектам добавим компонент Rigidbody .
Скорее всего, вы уже знаете, что Rigidbody — это компонент, который добавляет объектом физику. Именно благодаря ему шарик будет падать, а при соприкосновении с кубиком — отскочит от него.
Создадим скрипт Ball.cs в папке Scripts. Сразу повесим его на шарик, чтобы потом не забыть. В скрипт нужно добавить следующий код:
public class Ball : MonoBehaviour < private void OnCollisionEnter(Collision collision) < print("Collision detected"); >>
Функция OnCollisionEnter будет вызвана автоматически, когда шарик соприкоснется с чем-либо. Самим где-либо вызывать ее не надо.
Попробуйте запустить код и убедитесь, что в консоль выводится нужная фраза при столкновении с кубиком.
Единственный аргумент collision хранит информацию о столкновении. В частности он содержит переменную gameObject , в которой хранится объект, с которым произошло столкновение.
Попробуйте заменить print(«Collision detected») на print(collision.gameObject) и увидите, что при столкновении в консоль выводится информация о нашем кубике:
Теперь вместо принта будем удалять этот самый кубик:
private void OnCollisionEnter(Collision collision)
Функция Destroy() позволяет уничтожить какой-либо объект. Первым аргументом она принимает сам объект (в нашем случае кубик), а вторым — опционально — через сколько секунд должно произойти уничтожение.
Сохраните скрипт и запустите игру, чтобы увидеть, как шарик уничтожает сначала кубик, а затем — неожиданно — и пол! Да, ведь пол — это такой же объект, который имеет коллайдер (можете проверить:)
Как сделать чтобы пол не удалялся?
Самым правильным будет повесить на пол специальный тег, по которому его можно будет отличить от других объектов. Для этого выберите пол, создайте новый тег в инспекторе, нажав «Add Tag. » и назовите его Floor . После этого вновь выберите пол и прикрепите к нему этот тег (он появится в списке).
Теперь добавим в код проверку, чтобы уничтожать только те объекты, которые НЕ имеют тега «Floor»:
private void OnCollisionEnter(Collision collision) < if (collision.gameObject.tag != "Floor") < Destroy(collision.gameObject); >>
(Ну, или можно было все оставить как есть и сказать, что это не баг, а фича)
Перейдем к другим функциям
Не закрывайте проект. Замените написанную функцию на такую:
private void OnCollisionStay(Collision collision)
Запустив проект, вы увидите, что строка выводится в консоль каждый божий кадр.
Функция OnCollisionStay срабатывает каждый* кадр, когда объекты соприкасаются хоть чуть-чуть.
А функция OnCollisionExit срабатывает всего один кадр — когда касание прекратилось.
* На самом деле, не совсем: это физическая функция и она срабатывает каждый физический кадр. Детское объяснение в одну строку: Unity обрабатывает физику отдельно от не-физики: физика обрабатывается только в «физических кадрах», коими являются не все.
Опять к триггерам
Обсудим теперь триггеры. Вы можете попробовать отметить галочку «Is Trigger» в компоненте SphereCollider у шара. Запустив игру вы моментально поймете, что такое триггеры, если у вас пока не сложилось представление:)
Перейдите теперь на другую сцену, TriggersLesson, в папке «Scenes». Запустив игру вы увидите, что играете за капсулу, превращать которую в нормального героя мне было лень:)
Давайте сделаем так, чтобы при входе в горящую зону наш герой увеличивался, при нахождении в ней — мигал, а при выходе — вновь уменьшался.
Помним, что эта зона — триггер (можете в этом убедиться, в компоненте коллайдере отмечена галочка IsTrigger), а потому будем использовать триггерные функции. Найдем в папке Scripts файл Player.cs . Он уже содержит некоторые функции, отвечающие за перемещение игрока. Добавьте в конце еще несколько функций:
private void OnTriggerEnter(Collider other)
Обратите внимание, что триггерные функции НЕ принимают в качестве аргумента объект типа Collision, т.е. информацию о столкновении, так как самого столкновения не было. Вместо этого они просто хранят ссылку на компонент-коллайдер того объекта, с которым столкнулись. В нашем случае, так как скрипт висит на герое, переменная other ссылаться на саму зону.
Мы проверяем, является ли она нашим триггером и увеличиваем объект.
Если оставить все как есть, то в круг можно несколько раз входить-выходить и достигнуть гигантских размеров. Давайте это исправим:)
private void OnTriggerExit(Collider other) < if (other.gameObject.tag == "FireZone") transform.localScale /= 2; >
Похожая функция: проверяем, вошли ли мы действительно в зону и уменьшаем игрока.
private void OnTriggerStay(Collider other) < if (other.gameObject.tag == "FireZone") < Color color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f)); GetComponent().material.color = color; > >
Эта функция создаст разноцветное случайное мерцание. Мы просто меняем цвет материала, примененного к мешу. Для этого мы обращаемся к компоненту MeshRenderer.
Кстати, каждый кадр использовать GetComponent() — плохая практика. Это сильно бьет по производительности. Поэтому компоненты стоит кэшировать. Я уже сделал это в 9-й и 14-й строках: объявил переменную и инициализировал ее в функции Awake. Теперь просто замените вызов GetComponent() на переменную _mesh .
Кстати, закэшировал я и компонент Rigidbody , который мне тоже нужен каждый кадр для перемещения персонажа.
Мне кажется, эта статья итак уже выходит довольно длинной, поэтому я опишу как использовать 2Д-версии функций столкновения в следующей статье (если она будет. )
ДЗ:
В качестве практики предлагаю вам поработать с обеими сценами. Например, можно сделать следующее:
- На первой сцене вместо скрипта для шарика напишите скрипт для кубика, который будет изменять цвет шарика на, скажем, зеленый, когда коснется его. Возьмите код изменения цвета из конца урока и убедитесь, что кубик случайно не красит еще и пол!
- На второй сцене выньте камеру из персонажа в иерархии, размножьте их на сцене и полностью перепишите их скрипт, чтобы они бегали в случайные стороны. А потом создайте скрипт для огненной зоны, в котором реализуйте все, что мы делали в этом уроке. Теперь у вас по карте бегает куча недоделанных миньонов, каждый из которых вырастает и мелькает, когда попадает в огненную зону!
На этом все!
P.S. Это моя первая статья. Буду рад увидеть комментарии с конструктивной критикой. Также готов ответить на вопросы в комментариях.
P.P.S. Кто-нибудь знает, куда люди обычно прикрепляют ссылки, такие как у меня здесь — на папку с игрой? А то на гугл диске не очень хочется место занимать, а онлайн-файлообменники позволяют расположить файлы только на конкретные срок.