Game Boot
Project Structure
autoload/ - All singleton scripts
├── game_manager.gd
├── save_manager.gd
├── audio_manager.gd
└── economy_manager.gd
scenes/
├── boot.tscn (first scene)
├── main_menu.tscn
└── game.tscn
boot.gd
The first scene that loads.
# ============================================
# boot.gd - First scene that loads
# ============================================
extends Node
func _ready():
# 1. Initialize autoloads that need setup:
SaveManager.load_settings()
AudioManager.set_volume(SaveManager.settings.volume)
# 2. Show loading screen:
$LoadingScreen.show()
# 3. Load resources:
await preload_resources()
# 4. Transition to main menu:
get_tree().change_scene_to_file("res://scenes/main_menu.tscn")
func preload_resources():
# Load heavy assets:
ResourceLoader.load_threaded_request("res://assets/big_texture.png")
# ... more resources
await get_tree().create_timer(0.5).timeout # Fake delay for demonstration
game_manager.gd
Autoload singleton
# ============================================
# game_manager.gd - AutoLoad singleton
# ============================================
extends Node
signal scene_changed(new_scene: String)
var current_scene: Node = null
func _ready():
# Get reference to first scene:
current_scene = get_tree().current_scene
print("GameManager initialized")
func change_scene(scene_path: String):
# Deferred call to avoid issues:
call_deferred("_deferred_change_scene", scene_path)
func _deferred_change_scene(scene_path: String):
# Clean up current scene:
if current_scene:
current_scene.free()
# Load new scene:
var new_scene = load(scene_path).instantiate()
get_tree().root.add_child(new_scene)
get_tree().current_scene = new_scene
current_scene = new_scene
scene_changed.emit(scene_path)
Add autoloads to Settings
Navigate to Project Settings > Autoload in the editor.
Add these in order (top to bottom matters):
1. SaveManager (loads first)
2. GameManager
3. AudioManager
4. EconomyManager (depends on GameManager signals)