Qamico

How to use Move Position in Unity

Move Position is a physics-based function used to reposition a Rigidbody in a controlled way.

It behaves similarly to moving an object through its Transform component, but with one key difference: it keeps the physics system informed about the motion, allowing collisions, interpolation, and simulation to remain consistent.

So how does it actually work—and when should you use it?

In most physics-driven movement setups, objects are moved by applying forces. This produces natural motion, but it can feel heavy or imprecise for tight control scenarios.

But what if you still want physics features like gravity and collisions, while also moving an object directly and predictably?

A common example is character movement in 2D or top-down games. Pure force-based movement can feel sluggish, while directly changing the Transform position ignores physics entirely.

Setting a Transform position effectively “teleports” the object. The physics engine only realizes the change on the next update, which can cause jittery collisions, incorrect interpolation, and extra recalculations behind the scenes.

Older Unity versions especially struggled with this pattern due to the cost of repeated physics corrections.

Instead, Unity provides Rigidbody.MovePosition, which moves a Rigidbody to a target position while keeping the physics system aware that the motion is intentional.

Here’s an example:

public class MovePositionExample : MonoBehaviour
{
    public Rigidbody rb;
    public float speed = 1;

    Vector3 moveAxis;

    void Update()
    {
        moveAxis = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        moveAxis = Vector3.ClampMagnitude(moveAxis, 1);
    }

    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + (moveAxis * speed * Time.fixedDeltaTime));
    }
}

While this looks similar to manually changing position, Unity treats it differently internally.

Rigidbody Position vs MovePosition

In Unity, movement is really just frequent updates to an object’s stored position. The illusion of motion comes from updating that position over time.

You can move a Rigidbody by directly modifying rb.position, like this:

rb.position += moveAxis * speed * Time.fixedDeltaTime;

This approach is efficient and physics-aware, but it behaves more like teleporting the object every physics step. The engine updates collider positions afterward, but it does not treat the motion as a continuous movement path.

As a result, features like interpolation may not behave correctly.

A key limitation is timing: physics in Unity runs on a fixed timestep (commonly 50 Hz), which is independent from frame rate. That can make movement feel uneven if not smoothed.

Normally, you would solve this using interpolation, which smooths visual motion between physics updates.

However, interpolation does not work properly when motion is treated as direct position assignment, since the system doesn’t recognize a continuous movement trajectory.

This is where MovePosition becomes important.

Why MovePosition is different

When you use Rigidbody.MovePosition, Unity treats the change as intentional movement rather than a teleport.

Even though you are still specifying a new position each physics step, the engine understands the object is “traveling” between points. This allows interpolation to work correctly when enabled.

For best results, this method is typically used with:

  • A kinematic Rigidbody
  • Interpolation enabled

In this setup, Unity can smoothly render motion between fixed updates, even though movement is still driven manually.

This makes it especially useful for controlled movement systems like:

  • Platformer characters
  • Top-down controllers
  • Vehicles with scripted handling
  • Physics-aware but non-force-based movement

When to use each method

If you want to instantly relocate an object (a true teleport), setting rb.position is appropriate.

If you want natural physics simulation, use forces (AddForce, impulses, etc.).

If you want precise, deterministic movement that still respects physics and interpolates smoothly, use MovePosition.

In short: MovePosition sits in the middle ground—it gives you the control of transform movement with the awareness of physics.