Объединить LowLevelPhysics2D API формы
Примечание: Эта документация посвящена написанию C# скрипты с использованием LowLevelPhysics2D API. Использовать 2D физики в Unity Editor используя компоненты, такие как Rigidbody 2D компонент, см. 2D физика вместо этого.
Чтобы объединить физические формы в составную форму, создайте композицию с помощью объекта PhysicsComposer. Например, создайте форму автомобиля, объединив кузов автомобиля и два колеса.
Выполните следующие действия:
-
В верхней части вашего скрипта импортируйте библиотеку
Unity.Collections, которая содержит распределитель APIs, используемый составителем:using Unity.Collections; Создайте
Geometryфигуры, которые вы хотите объединить. Дополнительные сведения см. в Создать физический объект.-
Создать новый объект
PhysicsComposer. Передавать распределитель, который создает временную память для построения объединенного объекта. Например:PhysicsComposer physicsComposer = PhysicsComposer.Create(Allocator.Temp);Дополнительные сведения о распределителях см. в Allocator.
-
Добавьте каждый объект в составитель в качестве слоя, указав его геометрию, его положение и как объединить форму с существующими слоями. Например:
physicsComposer.AddLayer(circleGeometry, PhysicsTransform.identity, PhysicsComposer.Operation.OR);Более подробная информация о
Operation, см. Операции с слоями раздел. -
Создайте комбинированную форму с помощью
CreatePolygonGeometry. Передайте масштаб и распределитель, который создает память для хранения комбинированной формы. Например:using NativeArray<PolygonGeometry> combinedShape = composer.CreatePolygonGeometry(new Vector2(1f, 1f), Allocator.Temp);Примечание:
usingавтоматически удаляет память, выделенную дляNativeArray, когда она выходит за пределы области. Для получения дополнительной информации см. Уничтожение объектов LowLevelPhysics2D API и управление памятью. -
Создайте тело с комбинированной формой с помощью метода
CreateShapeBatch. Например:body.CreateShapeBatch(combinedShape, PhysicsShapeDefinition.defaultDefinition);
PhysicsComposer API объединяет CircleGeometry, CapsuleGeometry, PolygonGeometry, PhysicsShapeили любую закрытую область, определенную набором точек Vector2.
Операции с слоями
Доступны следующие операции PhysicsComposer.Operation:
OR: Добавление формы.AND: Сохраняет только перекрывающиеся области между новой и существующей фигурой.NOT: Вычитает новую форму из существующих форм.XOR: Удаляет перекрывающиеся области, но сохраняет неперекрывающиеся области.
Пример
Следующий пример сочетает форму круга и капсулы. Прикрепите этот скрипт к GameObject в сцене, затем перейдите в режим воспроизведения, чтобы проверить объединенную форму.
using UnityEngine;
using UnityEngine.LowLevelPhysics2D;
using Unity.Collections;
public class CombineShapes : MonoBehaviour
{
// Create the definition for a circle object
public CircleGeometry MyCircleGeometry = CircleGeometry.defaultGeometry;
public PhysicsTransform CircleTransform = new Vector2(0f, 0f);
// Create the definition for a capsule object
public CapsuleGeometry MyCapsuleGeometry = CapsuleGeometry.defaultGeometry;
public PhysicsTransform CapsuleTransform = new Vector2(0.75f, 0f);
private void Awake()
{
PhysicsWorld m_PhysicsWorld = PhysicsWorld.defaultWorld;
// Create a composer to combine shapes
PhysicsComposer composer = PhysicsComposer.Create(Allocator.Temp);
// Add both shapes to the composer
composer.AddLayer(MyCircleGeometry, CircleTransform);
composer.AddLayer(MyCapsuleGeometry, CapsuleTransform, PhysicsComposer.Operation.OR);
// Combine the shapes
using NativeArray<PolygonGeometry> combinedShape = composer.CreatePolygonGeometry(new Vector2(1f, 1f), Allocator.Temp);
// Create a body with the combined shapes
PhysicsBody body = m_PhysicsWorld.CreateBody();
body.CreateShapeBatch(combinedShape, PhysicsShapeDefinition.defaultDefinition);
// Destroy the composer to also destroy the temporary allocator.
composer.Destroy();
}
}
Дополнительные ресурсы
- Соедините LowLevelPhysics2D API объекты с соединениями
- PhysicsCore2D хранилище на GitHub.