Changing scene in Godot

GDscript provides get_tree().change_scene_to_file(filepath) but we cannot pass data this way. So another way I found is to create a small scene manager that allows passing variables & data. Following is my code for godot scene manager (usage is given in comments):

extends Node

"""
!! USAGE:

APPROACH 1:

var level = SceneManager.load_scene("mylevel_path")
level.xyz
SceneManager.switch_scene(level)

APPROACH 2 (if function to be called dfrom scene):
SceneManager.switch_scene(
	SceneManager.load_scene("mylevel_path").with_data(myvar1, myvar2)
)
"""


var _current_scene: Node


func _ready():
	_current_scene = get_tree().current_scene


func load_scene(scene_path: String):
	var new_scn = load(scene_path).instantiate() # load new scene
	return new_scn


func switch_scene(new_scene: Node):
	if _current_scene: # if old exists
		_current_scene.queue_free() # remove it
	_current_scene = new_scene
	get_tree().root.add_child(new_scene)

Make sure to set this to AutoLoad (Singleton) in Godot so scene manager is instanced right after Godot boots.

This way you can pass data while instancing scenes. Make sure to assign the scene to _current_scene when loading the game for first time, else it will be null and throw an error.