Unity 6.3
0 онлайн 42 гостей 3 в системе
Вход

Настройка столкновений между объектами LowLevelPhysics2D и API

Примечание: Эта документация посвящена написанию C# скрипты с использованием LowLevelPhysics2D API. Использовать 2D физики в Unity Editor используя компоненты, такие как Rigidbody 2D компонент, см. 2D физика вместо этого.

В LowLevelPhysics2D API коллизии включены по умолчанию.

По умолчанию применяется следующее:

  • Объекты используют слои GameObject, и все объекты находятся на встроенном слое По умолчанию.
  • Объекты сталкиваются с объектами на всех других слоях.
  • Можно использовать до 32 слоев.

Чтобы изменить это поведение, выполните следующие действия:

  1. Настройте LowLevelPhysics2D API на использование собственного набора из 64 слоев вместо слоев GameObject.
  2. Настройте слои, на которых находятся объекты, и создайте маски слоев, которые определяют слои, с которыми взаимодействует объект.

Примечание: Для настройки реакции физического объекта на столкновения, например, насколько он подпрыгивает, см. Настройка сцен LowLevelPhysics2D API с определениями.

Настройте API на использование собственного набора слоев

Выполните следующие действия:

  1. Создание ассета Physics Low Level Settings 2D. Дополнительные сведения см. в разделе Настройка глобальных физических параметров 2D.
  2. В течение Слои раздел Физика низкоуровневых настроек 2D ассет, способствовать Использовать полные слои.

PhysicsMask API теперь использует слои в разделе Physics Layer Names ассета Physics Low Level Settings 2D.

Используйте раздел Имена физических слоев для добавления, редактирования или удаления слоев. Дополнительные сведения см. в окне Настройки физики низкого уровня.

Изменить, какие объекты столкнутся в редакторе

Выполните следующие действия:

  1. Создайте слои, которые вам нужны. Дополнительные сведения см. в окне Physics Low Level Settings reference.

  2. Создать физический объект с публичным PhysicsShapeDefinition и прикрепить его к GameObject.

  3. Выберите GameObject, затем в окне Inspector откройте раскрывающееся меню Контактный фильтр.

  4. Установите Категории на слои, на которых вы хотите разместить объект. Например, первый встроенный слой называется По умолчанию.

  5. Установите Контакты на слои, с которыми объект должен столкнуться. Например, Ничего для отсутствия слоев.

Изменение объектов, столкнувшихся в сценарии

Выполните следующие действия:

  1. Создайте слои, которые вам нужны. Дополнительные сведения см. в окне Physics Low Level Settings reference.

  2. Создайте объект PhysicsMask с слоем, на котором вы хотите разместить объект. Например:

    PhysicsMask objectLayer = PhysicsLayers.GetLayerMask("Car");
    

    PhysicsLayers.GetLayerMask получает маску слоя независимо от того, используете ли вы слои GameObject или слои LowLevelPhysics2D API.

  3. Создайте другой объект PhysicsMask с слоями, с которыми объект должен столкнуться.

    PhysicsMask objectLayer = PhysicsLayers.GetLayerMask("Walls");
    
  4. Создайте объект ContactFilter с двумя масками физических слоев. Например:

    PhysicsShape.ContactFilter myContactFilter = new PhysicsShape.ContactFilter { categories = objectLayer, contacts = contactLayer },
    

    Вы также можете использовать PhysicsMask.All для представления всех слоев, или PhysicsMask.None для представления отсутствия слоев.

  5. Назначьте ContactFilter для PhysicsShape при создании. Например:

    PhysicsShapeDefinition shapeDefinition = new PhysicsShapeDefinition{
        contactFilter = myContactFilter
    };
    

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

Для получения дополнительной информации см. PhysicsMask.

Предотвращение прохождения объектов друг через друга

Поскольку физические тела движутся шагами, быстро движущиеся объекты могут иногда проходить через другие объекты без активации столкновения. Это называется туннелированием.

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

Пример

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

Для использования примера:

  1. Создание параметров низкого уровня физики 2D ассет, способствовать Использовать полные слои, и добавить слой под названием MyNewLayer.
  2. Прикрепите скрипт к GameObject в вашей сцене и перейдите в режим воспроизведения.
using UnityEngine;
using UnityEngine.LowLevelPhysics2D;

public class ContactFilters : MonoBehaviour
{
    void Start()
    {
        CircleGeometry smallCircleShape = new CircleGeometry{ radius = 0.5f };
        CircleGeometry largeCircleShape = new CircleGeometry{ radius = 3f };

        PhysicsWorld world = PhysicsWorld.defaultWorld;

        // Create a small falling circle
        PhysicsBody object1 = world.CreateBody(new PhysicsBodyDefinition
        { 
            position = new Vector2(0.5f, 8f),
            type = PhysicsBody.BodyType.Dynamic
        });

        // Create a shape on the MyNewLayer layer, which only collides with the MyNewLayer layer
        PhysicsMask objectLayer = PhysicsLayers.GetLayerMask("MyNewLayer");
        PhysicsMask collisionLayer = PhysicsLayers.GetLayerMask("MyNewLayer");
        PhysicsShape.ContactFilter contactFilter = new PhysicsShape.ContactFilter { 
            categories = objectLayer,
            contacts = collisionLayer
        };
        PhysicsShapeDefinition smallCircleDefinition = new PhysicsShapeDefinition{
            contactFilter = contactFilter
        };
        object1.CreateShape(smallCircleShape, smallCircleDefinition);

        // Create a larger static circle below, on the default layer
        PhysicsBody object2 = world.CreateBody(new PhysicsBodyDefinition
        { 
            position = new Vector2(0f, 0f),
            type = PhysicsBody.BodyType.Static
        });
        object2.CreateShape(largeCircleShape);

    }
}

Дополнительные ресурсы