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

Объединить LowLevelPhysics2D API формы

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

Чтобы объединить физические формы в составную форму, создайте композицию с помощью объекта PhysicsComposer. Например, создайте форму автомобиля, объединив кузов автомобиля и два колеса.

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

  1. В верхней части вашего скрипта импортируйте библиотеку Unity.Collections, которая содержит распределитель APIs, используемый составителем:

    using Unity.Collections;
    
  2. Создайте Geometry фигуры, которые вы хотите объединить. Дополнительные сведения см. в Создать физический объект.

  3. Создать новый объект PhysicsComposer. Передавать распределитель, который создает временную память для построения объединенного объекта. Например:

    PhysicsComposer physicsComposer = PhysicsComposer.Create(Allocator.Temp);
    

    Дополнительные сведения о распределителях см. в Allocator.

  4. Добавьте каждый объект в составитель в качестве слоя, указав его геометрию, его положение и как объединить форму с существующими слоями. Например:

    physicsComposer.AddLayer(circleGeometry, PhysicsTransform.identity, PhysicsComposer.Operation.OR);
    

    Более подробная информация о Operation, см. Операции с слоями раздел.

  5. Создайте комбинированную форму с помощью CreatePolygonGeometry. Передайте масштаб и распределитель, который создает память для хранения комбинированной формы. Например:

    using NativeArray<PolygonGeometry> combinedShape = composer.CreatePolygonGeometry(new Vector2(1f, 1f), Allocator.Temp);
    

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

  6. Создайте тело с комбинированной формой с помощью метода 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();
    }   
}

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