Unity 6.3
0 онлайн 97 гостей 3 в системе
Вход
2D разработка игр Шаг 164 из 198

Используйте 2D физику в 3D пространстве с помощью LowLevelPhysics2D API

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

Создайте мир физики 2D под любым углом в пространстве 3D, вместо традиционной плоскости x, y, обращенной к камере. Это позволяет использовать физику 2D в игре 3D.

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

  1. Создание мира физики.
  2. Установите свойство transformPlane мира на XZ или ZY.

Физическая система продолжает использовать координаты и векторы 2D Vector2, но Unity преобразует конечные позиции в пространство 3D в соответствии с transformPlane:

  • XY означает, что ось x остается горизонтальной, а ось y остается вертикальной, так что мир обращен к камере в пространстве 3D. Это значение по умолчанию.
  • XZ означает, что ось x остается горизонтальной, но ось y становится глубиной, так что мир лежит плотно в пространстве 3D.
  • ZY означает, что ось x становится глубиной, но ось y остается вертикальной, так что мир стоит вертикально в пространстве 3D.

Для ручного преобразования координат между типами 2D Vector2 и 3D Vector3 используйте вспомогательные методы в PhysicsMath API.

В следующем примере используется плоскость XZ, которая создает физический мир 2D, который лежит плотно на земле в пространстве 3D.

Чтобы проверить эффект, вам может потребоваться установить вид Scene в режим 3D. Дополнительные сведения см. в Меню гаджетов.

using Unity.Collections;
using UnityEngine;
using UnityEngine.LowLevelPhysics2D;

public class CreateXZPlane : MonoBehaviour
{
    public PhysicsWorld world;

    private void Start()
    {
        // Create a world with a transform plane of XZ, which is the floor in 3D space.
        PhysicsWorldDefinition worldProperties = new PhysicsWorldDefinition
        {
            transformPlane = PhysicsWorld.TransformPlane.XZ,
            gravity = Vector2.zero
        };
        world = PhysicsWorld.Create(worldProperties);

        // Create a square boundary
        PhysicsBody boundary = world.CreateBody();
        using NativeList<Vector2> extentPoints = new NativeList<Vector2>(Allocator.Temp)
        {
            new(-4f, 4f),
            new(4f, 4f),
            new(4f, -4f),
            new(-4f, -4f)
        };
        ChainGeometry boundaryWalls = new ChainGeometry(extentPoints.AsArray());
        boundary.CreateChain(boundaryWalls, PhysicsChainDefinition.defaultDefinition);

        // Create a body and set it moving
        PhysicsBodyDefinition bodyDefinition = new PhysicsBodyDefinition();
        bodyDefinition.type = PhysicsBody.BodyType.Dynamic;
        bodyDefinition.linearVelocity = new Vector2(7.3f, 5.7f);
        bodyDefinition.angularVelocity = 0f;
        PhysicsBody body = world.CreateBody(bodyDefinition);

        // Add a shape with a bouncy material
        body.transformObject = transform;
        PhysicsShapeDefinition shapeDefinition = new PhysicsShapeDefinition();
        shapeDefinition.surfaceMaterial = new PhysicsShape.SurfaceMaterial{bounciness = 1f, friction = 0f};
        body.CreateShape(new CircleGeometry { radius = 1f }, shapeDefinition);
    }

    private void OnDisable()
    {
        world.Destroy();
    }
}

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