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
- ParallaxLayer Motion > Scale and Parallax2D Scroll Scale: (0, 0) keeps the layer fixed to the screen; (1, 1) moves it exactly like the world, so it looks like it is not a parallax at all. Distant layers want small values such as (0.2, 0) and near layers (0.8, 0).
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).