Hello, I've created a level switcher, and it works when I switch from level 1 to 2 but it doesn't do anything when I try to go from level 2 to level 3

Here's my level switcher code :

extends Node



var next_level = null

@onready var current_level = $Level_1
@onready var anim = $AnimationPlayer


func _ready():
	current_level.level_changed.connect(self.handle_level_changed)
	$MusicWorld1.play()



func handle_level_changed(current_level_name: String):
	var next_level_name: String 
	
	match current_level_name:	
		"level1":
			next_level_name = "2.tscn"
		"level2":
			next_level_name = "3.tscn"
		_:
			return
			
	next_level = load("res://levels/level_" + next_level_name).instantiate()
	next_level.visible = false
	add_child(next_level)
	anim.play("fade_in")
	next_level.level_changed.connect(self.handle_level_changed)



func _on_animation_player_animation_finished(anim_name):
	match anim_name:
		"fade_in":
			current_level.cleanup()
			current_level = next_level
			current_level.visible = true
			next_level = null
			anim.play("fade_out")
		"fade_out":
			pass

Here is my level script that is attached to all my levels :

extends Node2D

signal level_changed(level_name)

@export var level_name = "level"



func cleanup():
	if $DescendingSound.playing:
		await $DescendingSound.finished
	queue_free()



func _on_door_change_scene():
	$DescendingSound.play()
	emit_signal("level_changed", level_name)

And here is my door script, attached to my door in my levels. To switch between levels the player must touch the door :

extends Area2D


signal changeScene

func _on_body_entered(body):
		
	if not ($Timer.time_left > 0):
		if body.is_in_group("player"):
			$AnimatedSprite2D.play("default")
			await get_tree().create_timer(1.5).timeout
			changeScene.emit()
Merged 1 post from Level switcher doesn't work for level 2 to 3.

You probably need to reconnect the level_changed signal each time new level is instantiated.