Quick answer: ParallaxBackground and Parallax2D move in response to the camera, not on their own. With no enabled Camera2D moving, nothing scrolls. Then check the scale (motion_scale on ParallaxLayer, scroll_scale on Parallax2D — 0 means fixed, 1 means moves with the world) and set the repeat size to the real texture width.

Parallax looks like it should be a property of the background, but in Godot it is a property of how the camera moves. That one fact explains most "my parallax doesn't scroll" reports.

First: which node are you using?

Godot 4.3 introduced Parallax2D, a single node that replaces the older ParallaxBackground + ParallaxLayer pair. Both still work, but the settings have different names. For new projects, Parallax2D is simpler.

Cause 1: there is no moving camera

Both systems read the viewport's canvas transform, which a Camera2D sets. If the scene has no Camera2D, the camera is not Enabled, or a different camera is current, the background has nothing to follow. Check the Remote tree while running: exactly one Camera2D should be current, and its position should change as the player moves.

If you want a background that scrolls without a camera (a menu screen, for instance):

# Parallax2D
$Clouds.autoscroll = Vector2(-20, 0)

# ParallaxBackground
func _process(delta):
    $ParallaxBackground.scroll_offset.x -= 20 * delta

Cause 2: the scale is zero, or one

Cause 3: the repeat size is wrong

Mirroring (ParallaxLayer Motion > Mirroring) or Parallax2D Repeat Size must equal the width of one copy of the texture after scaling. Too small and copies overlap; too big and gaps appear; zero means the layer does not repeat, so it scrolls off-screen and seems to disappear. A Sprite2D with Centered on also shifts the texture by half its width — turn Centered off and place it at (0, 0) to make the maths simple.

Cause 4: the background is under the wrong parent

ParallaxLayers only work as children of a ParallaxBackground. A ParallaxBackground is itself a CanvasLayer (layer -100 by default), so putting it inside another CanvasLayer or a SubViewport changes which camera it follows. Keep it as a direct child of the level scene.

Cause 5: pixel art jitter

If it scrolls but shimmers, enable Rendering > 2D > Snap 2D Transforms to Pixel for pixel art, and update the camera in the same process mode as the player (see process vs physics jitter).

Related fixes