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

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

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

После того, как вы настроите столкновения, для обнаружения столкновений и реагирования на них используйте методы обратного вызова столкновений.

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

  1. Чтобы включить методы обратного вызова коллизий, установите autoContactCallbacks свойства мир физики до true.

  2. Добавьте PhysicsCallbacks.IContactCallback в список реализованных интерфейсов в вашем скрипте. Например:

    public class DetectCollisions : MonoBehaviour, PhysicsCallbacks.IContactCallback
    {
        ...
    }
    
  3. Осуществление OnContactBegin2D и OnContactEnd2D методы интерфейса и добавьте код, который должен выполняться в начале и в конце столкновения.

  4. Чтобы активировать методы обратного вызова при возникновении коллизии, установите свойство contactEvents формы на true и свойство callbackTarget на this.

Например, следующий код создает круг, который регистрирует столкновение с более крупным кругом:

using UnityEngine;
using UnityEngine.LowLevelPhysics2D;

// Add the PhysicsCallbacks.IContactCallback interface
public class DetectCollisions : MonoBehaviour, PhysicsCallbacks.IContactCallback
{
    void Start()
    {
        PhysicsWorld world = PhysicsWorld.defaultWorld;
        
        // Set the world to use automatic contact callbacks
        // Don't do this in production code. Configure the setting using a Physics Low Level Settings 2D asset instead.
        world.autoContactCallbacks = true;

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

        // Create a larger static circle below
        PhysicsBody object2 = world.CreateBody(new PhysicsBodyDefinition
        { 
            position = new Vector2(0f, 0f),
            type = PhysicsBody.BodyType.Static
        });
        object2.CreateShape(new CircleGeometry { 
            radius = 3f,
        });

        // Set object 1 to activate collisions
        object1shape.contactEvents = true;  
        object1shape.callbackTarget = this;
    }

    // Log when the small circle collides
    public void OnContactBegin2D(PhysicsEvents.ContactBeginEvent eventData)
    {
        var contact = eventData.contactId.contact;
        Debug.Log("Collision started between shapes: " + contact.shapeA + " and " + contact.shapeB);
    }

    // Log when the small circle stops colliding
    public void OnContactEnd2D(PhysicsEvents.ContactEndEvent eventData)
    {
        var contact = eventData.contactId.contact;
        Debug.Log("Collision ended between shapes: " + contact.shapeA + " and " + contact.shapeB);
    }
}

Обнаружение перекрытия триггеров

Форма триггера не сталкивается с другими коллайдерами. Вместо этого другие коллайдеры проходят через нее. Для получения дополнительной информации см. Введение в коллизию в LowLevelPhysics2D API.

Чтобы определить, когда триггер сообщает о перекрытии с другой фигурой, выполните следующие действия:

  1. Чтобы включить методы обратного вызова триггеров, установите свойство autoTriggerCallbacks физического мира на true.

  2. Добавьте PhysicsCallbacks.ITriggerCallback в список реализованных интерфейсов в вашем скрипте.

  3. Осуществление OnTriggerBegin2D и OnTriggerEnd2D методы интерфейса и добавьте код, который должен выполняться в начале и в конце контакта.

  4. Чтобы активировать методы обратного вызова при возникновении контакта, на обеих формах установите свойство triggerEvents формы на true и свойство callbackTarget на this.

  5. Чтобы включить триггер, на форме триггера установите свойство isTrigger на true.

Для примера см. пример PhysicsShapeTriggerCallback в хранилище PhysicsCore2D на GitHub.

Получить контакты без обратного звонка

Чтобы получить информацию о контакте между объектами без обратного вызова, используйте событие APIs экземпляра мира. Например, чтобы получить информацию о столкновениях, которые начались, используйте метод PhysicsWorld.contactBeginEvents. Более подробную информацию см. в PhysicsWorld.

Важная: Этот подход является менее безопасным, поскольку методы возвращают ReadOnlySpan типа, который указывает непосредственно на память. Для получения дополнительных сведений см. Уничтожить LowLevelPhysics2D API объекты и управление памятью.

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