Quick answer: Set Rigidbody2D Body Interpolation = Interpolate. Move the camera in LateUpdate (not Update or FixedUpdate). Read transform.position — LateUpdate sees the interpolated value.
Player runs across the screen. Sprite jitters by a fraction of a pixel each frame. The sprite is correct on physics ticks but the camera reads pre-tick positions on render frames.
The Symptom
Visible stutter on a moving 2D character even at 60 fps. Worse on high-refresh displays. Disabling the camera-follow script makes the player smooth in absolute terms (because every render frame shows the post-tick position) but the camera-follow stutter is the symptom you actually see.
The Fix
Step 1: Body Interpolation on the Rigidbody2D.
Rigidbody2D Inspector:
Body Interpolation: Interpolate
Unity now interpolates the visible transform between physics ticks. The simulation still ticks at FixedUpdate cadence; the rendered position is smooth.
Step 2: Camera follow in LateUpdate.
public class Camera2DFollow : MonoBehaviour
{
public Transform target;
public float smooth = 5f;
void LateUpdate()
{
var p = transform.position;
var t = target.position;
p.x = Mathf.Lerp(p.x, t.x, smooth * Time.deltaTime);
p.y = Mathf.Lerp(p.y, t.y, smooth * Time.deltaTime);
transform.position = p;
}
}
LateUpdate runs after the renderer has the interpolated position; reading target.position here returns the smoothed value the player will see.
Cinemachine
If you use Cinemachine, the virtual camera handles all this internally. Just set the Follow target. Cinemachine reads positions correctly without LateUpdate plumbing.
Verifying
Run on a high-refresh display. Move the player. Sprite should glide; camera follows smoothly. Without the fix: visible stair-stepping.
“Interpolate on the body. LateUpdate on the camera. Smooth at any refresh.”
Related Issues
For Godot interpolation, see Godot interpolation. For Cinemachine blends, see Cinemachine blend.
Interpolate. LateUpdate. Smooth.