Quick answer: Godot 4 tween created in _process running its first step before the frame renders? Tween advances on the same tick it's created - use call_deferred to start.

Spawn-with-fade-in animation. Fade tween created in spawn(); first frame shows the partially-faded state, not zero.

Defer tween creation

call_deferred("_start_fade")

Tween created next frame. First frame shows initial state.

Or set initial value explicitly

Set the property to 0 before creating the tween. The first step has the right value to interpolate from.

Use bind_node + create_tween

Bound to a node; create after the node enters tree. Initial frame is clean.

“Tweens advance on creation. Same-frame visible state changes.”

If your spawn animation looks 'mid-state' on frame 1, the tween is starting from the wrong value. Defer or pre-set.

Related reading