Version: Unity 6.3 LTS (6000.3)
Language : English
Add a sprite to a LowLevelPhysics2D API object
Draw a debug visualization of LowLevelPhysics2D API objects

Move a GameObject with the LowLevelPhysics2D API

Note: This documentation is about writing C# scripts using the LowLevelPhysics2D API. To use 2D physics in the Unity Editor using components like the Rigidbody 2D component, refer to 2D physics instead.

By default, when you create an object with the LowLevelPhysics2D API, the object isn’t connected to GameObjects in the sceneA Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary
.

To move a GameObject, configure the physics object to update the Transform componentA Transform component determines the Position, Rotation, and Scale of each object in the scene. Every GameObject has a Transform. More info
See in Glossary
of the GameObject.

Follow these steps:

  1. To enable physics bodies updating Transform components globally, set the TransformWriteMode property of the world to Fast2D or Slow2D.

  2. To enable the physics body updating Transform components, set its TransformWriteMode to Current.

  3. To attach the Transform component of the GameObject to the physics body, set the transformObject property to the Transform component.

    Note: The transformObject property is available only in a C# script, not in the InspectorA Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
    See in Glossary
    window of a public PhysicsBodyDefinition object.

  4. Make sure the type property of the physics body is set to PhysicsBody.BodyType.Dynamic.

For example, attach the following script to a GameObject, then enter Play mode. The physics body falls under gravity, and updates the position in the Transform component in the Inspector window.

using UnityEngine;
using UnityEngine.LowLevelPhysics2D;

public class MoveGameObject : MonoBehaviour
{
    public PhysicsWorld world;
    public PhysicsWorldDefinition worldDefinition = PhysicsWorldDefinition.defaultDefinition;

    void Awake()
    {
        // Enable physics bodies updating transforms
        worldDefinition.transformWriteMode = PhysicsWorld.TransformWriteMode.Fast2D;
        world = PhysicsWorld.Create(worldDefinition);
    }    

    void Start()
    {
        // Create a body and shape 
        PhysicsBody circleBody = world.CreateBody();
        CircleGeometry circleGeometry = new CircleGeometry { radius = 2f };
        circleBody.CreateShape(circleGeometry);
        
        // Set body to dynamic so it falls under gravity
        circleBody.type = PhysicsBody.BodyType.Dynamic; 

        // Enable this physics body updating transforms
        circleBody.transformWriteMode = PhysicsBody.TransformWriteMode.Current;

        // Set the updated transform as the transform of this GameObject
        circleBody.transformObject = transform;
    }
}

Rotate objects more quickly

By default, Unity sets a limit on how fast a physics body rotates, to avoid forces becoming too large and objects passing through each other incorrectly. To remove the limit, create a Physics Low Level Settings 2D asset and set its Fast Rotation Allowed property to true. This property is recommended only for circular objects.

For more information, refer to Configure global 2D physics settings.

Interpolate positions

By default, the physics body updates the Transform component after Unity finishes calculating the physics simulation. To interpolate positions between simulation steps instead, set the TransformWriteMode of the physics body to Interpolate or Extrapolate.

Additional resources

Add a sprite to a LowLevelPhysics2D API object
Draw a debug visualization of LowLevelPhysics2D API objects