Quick answer: With Rigidbody Interpolation on, a teleport creates a one-frame smear from the old position to the new. Set rb.position directly (not MovePosition), then briefly disable interpolation (rb.interpolation = None) for the teleport frame, or use Physics.SyncTransforms() after the assignment.

Here is how to fix Unity Rigidbody teleports that produce a visible smear or stretched-out blur as the body lurches across the screen. You set rb.position to the destination, but for one frame the renderer draws a streak between origin and destination because Interpolation tries to smooth between the two physics frames. The fix is to disable interpolation just for the teleport.

The Symptom

An object teleports across the level. For one rendered frame, you see it smeared along the path. With interpolation off, the teleport is instant but ongoing motion looks choppy. With interpolation on, motion is smooth but teleports leave artifacts.

What Causes This

Interpolation tracks two positions. Rigidbody Interpolation/Extrapolation interpolates the rendered transform between the previous and current physics positions. After a teleport, the previous position is the old spot; the renderer slides smoothly between them.

MovePosition queues motion. If you used MovePosition instead of position, the request is interpolated over the next physics step, exacerbating the smear.

SyncTransforms missing. The visual transform may not catch up to the physics position until the next physics step without a manual sync.

The Fix

Step 1: Set position directly and reset interpolation.

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Teleporter : MonoBehaviour
{
    private Rigidbody rb;
    void Awake() { rb = GetComponent<Rigidbody>(); }

    public void TeleportTo(Vector3 pos, Quaternion rot)
    {
        var oldInterp = rb.interpolation;
        rb.interpolation = RigidbodyInterpolation.None;

        rb.position = pos;
        rb.rotation = rot;
        rb.linearVelocity = Vector3.zero;
        rb.angularVelocity = Vector3.zero;
        Physics.SyncTransforms();

        rb.interpolation = oldInterp;
    }
}

The brief None during the teleport prevents Unity from smearing the visual.

Step 2: Use position, not MovePosition, for instant teleports.

// BAD: smooth-following request
rb.MovePosition(target);   // interpolated over next step

// GOOD: instant placement
rb.position = target;
Physics.SyncTransforms();

Step 3: Reset velocity to avoid carry-over. If the body had momentum before teleport, that momentum continues in the new position. For most teleports, zero velocity is what you want.

Step 4: For 2D, do the equivalent.

rb2d.position = newPos;
rb2d.linearVelocity = Vector2.zero;
Physics2D.SyncTransforms();

Step 5: For player teleports during a frame, sync the camera too. If a Cinemachine camera follows the player, it may also exhibit smear. Call vcam.OnTargetObjectWarped(player.transform, newPos - oldPos) after the teleport so the camera knows it is a discontinuity, not motion.

When To Keep Interpolation

Outside of teleports, leave Interpolation on for smooth visuals. Disable only for the teleport frame and restore. Always-off Interpolation produces jittery normal motion.

“Position teleports; MovePosition smooths. Disable interpolation for the teleport frame. Sync transforms. Restore.”

Related Issues

For physics jitter in general, see Physics Jittery Movement. For tunneling, see Physics Tunneling.

interpolation = None for one frame. position assignment. SyncTransforms. Restore. Clean teleport.