Используйте 2D физику в 3D пространстве с помощью LowLevelPhysics2D API
Примечание: Эта документация посвящена написанию C# скрипты с использованием LowLevelPhysics2D API. Использовать 2D физики в Unity Editor используя компоненты, такие как Rigidbody 2D компонент, см. 2D физика вместо этого.
Создайте мир физики 2D под любым углом в пространстве 3D, вместо традиционной плоскости x, y, обращенной к камере. Это позволяет использовать физику 2D в игре 3D.
Выполните следующие действия:
- Создание мира физики.
- Установите свойство
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();
}
}
Дополнительные ресурсы
- 3D GameObjects в 2D URP сценах
- PhysicsCore2D хранилище на GitHub.
- Справочная информация о всемирном определении для LowLevelPhysics2D API