Обнаружение столкновений между объектами LowLevelPhysics2D и API
Примечание: Эта документация посвящена написанию C# скрипты с использованием LowLevelPhysics2D API. Использовать 2D физики в Unity Editor используя компоненты, такие как Rigidbody 2D компонент, см. 2D физика вместо этого.
После того, как вы настроите столкновения, для обнаружения столкновений и реагирования на них используйте методы обратного вызова столкновений.
Выполните следующие действия:
Чтобы включить методы обратного вызова коллизий, установите
autoContactCallbacksсвойства мир физики доtrue.-
Добавьте
PhysicsCallbacks.IContactCallbackв список реализованных интерфейсов в вашем скрипте. Например:public class DetectCollisions : MonoBehaviour, PhysicsCallbacks.IContactCallback { ... } Осуществление
OnContactBegin2DиOnContactEnd2Dметоды интерфейса и добавьте код, который должен выполняться в начале и в конце столкновения.Чтобы активировать методы обратного вызова при возникновении коллизии, установите свойство
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.
Чтобы определить, когда триггер сообщает о перекрытии с другой фигурой, выполните следующие действия:
Чтобы включить методы обратного вызова триггеров, установите свойство
autoTriggerCallbacksфизического мира наtrue.Добавьте
PhysicsCallbacks.ITriggerCallbackв список реализованных интерфейсов в вашем скрипте.Осуществление
OnTriggerBegin2DиOnTriggerEnd2Dметоды интерфейса и добавьте код, который должен выполняться в начале и в конце контакта.Чтобы активировать методы обратного вызова при возникновении контакта, на обеих формах установите свойство
triggerEventsформы наtrueи свойствоcallbackTargetнаthis.Чтобы включить триггер, на форме триггера установите свойство
isTriggerнаtrue.
Для примера см. пример PhysicsShapeTriggerCallback в хранилище PhysicsCore2D на GitHub.
Получить контакты без обратного звонка
Чтобы получить информацию о контакте между объектами без обратного вызова, используйте событие APIs экземпляра мира. Например, чтобы получить информацию о столкновениях, которые начались, используйте метод PhysicsWorld.contactBeginEvents. Более подробную информацию см. в PhysicsWorld.
Важная: Этот подход является менее безопасным, поскольку методы возвращают ReadOnlySpan типа, который указывает непосредственно на память. Для получения дополнительных сведений см. Уничтожить LowLevelPhysics2D API объекты и управление памятью.