Global variables (Autoload)
In de vorige les heb je var score = 0 in je karakter gezet en vanuit het muntje body.score += 1 aangeroepen. Dat werkt — totdat je de score op het scherm wil tonen en je vanuit een Label-script via get_node("../CharacterBody2D").score moet gaan zoeken. Eén verschuiving in de scene-tree en het breekt.
In deze les leer je een schonere oplossing: global variables die overal in je project beschikbaar zijn.
Predict
Wat als de score op een vaste plek leefde, buiten alle nodes om, altijd bereikbaar met dezelfde naam?
Hoe zou je dat technisch oplossen?
Bekijk het antwoord
Je maakt een apart script (bijv. global.gd) dat niet aan een node hangt. Vervolgens vertel je Godot via Autoload: "laad dit script automatisch bij het opstarten en houd het de hele speelsessie in de lucht". Vanaf dat moment kun je vanuit elk ander script Global.score schrijven of lezen.
Geen get_node(...) meer, geen kapotte links als je iets verplaatst.
Het probleem in één regel
Variabelen die je in een script zet, leven alleen zolang die node bestaat. Global lost dat op door buiten de scene-tree te leven.
Een globaal script maken
Stap 1: Maak een nieuw script
- Ga naar FileSystem (linksonder)
- Klik met rechts → New Script
- Noem het
global.gd - Zorg dat er geen node aan gekoppeld is — het is een los script
Stap 2: Voeg je variabelen toe
extends Node
var score = 0
var levens = 3
Dat is alles! Dit script bevat variabelen die je overal wilt gebruiken.
Stap 3: Stel het in als Autoload
Dit is de belangrijkste stap. Door het script als Autoload in te stellen, laadt Godot het automatisch bij het opstarten en is het overal beschikbaar.
- Ga naar Project → Project Settings
- Klik op het tabblad Autoload
- Klik op het mapje naast Path en kies
global.gd - Bij Node Name vul je
Globalin (met hoofdletter) - Klik op Add
Nu is Global overal beschikbaar in je project.
Refactor: van body.score naar Global.score
In de vorige les hoogde je de score op via body.score += 1. Nu we een Global hebben, gebruiken we dat in plaats van de variabele in het karakter.
Stap A — Pas je muntje-script aan
extends Area2D
func _on_body_entered(body: Node2D) -> void:
Global.score += 1
print("Score: ", Global.score)
queue_free()
Stap B — Verwijder var score uit je karakter
In je CharacterBody2D-script kun je nu de regel var score = 0 weghalen — die hebben we niet meer nodig. De score leeft voortaan in Global.
Overal dezelfde syntax: Global.variabelnaam. Geen get_node(...), geen kapotte links bij hernoemen.
Functies in je global script
Je kunt ook functies toevoegen aan je global script:
extends Node
var score = 0
var levens = 3
func reset():
score = 0
levens = 3
func verlies_leven():
levens -= 1
if levens <= 0:
print("Game Over!")
Deze functies roep je op dezelfde manier aan:
Global.verlies_leven()
Global.reset()
Samenvatting
| Begrip | Uitleg |
|---|---|
| Global variable | Een variabele die overal in je project beschikbaar is |
| Autoload | Een instelling waarmee Godot een script automatisch laadt bij het opstarten |
Global.score | Zo lees of schrijf je een globale variabele vanuit elk script |
extends Node | Het global script extends Node omdat het geen specifiek type nodig heeft |
Gebruik global variables voor dingen die je in meerdere scenes nodig hebt, zoals score, levens, of instellingen. Gebruik gewone variabelen (var) voor dingen die alleen in één node bestaan.
In de volgende les zet je Global.score op het scherm met een Label.
Er gaat iets mis
Global werkt niet / Global.score geeft een fout
Oorzaak: Global is geen ingebouwd Godot-concept. Het is een script dat je zelf als Autoload moet registreren. Zonder die instelling kent Godot de naam Global niet.
Oplossing:
- Ga naar Project → Project Settings → Autoload
- Klik op het mapje naast Path en kies
global.gd - Vul bij Node Name precies
Globalin (met hoofdletter G) - Klik op Add
Mijn score-variabele reset elke keer als ik een nieuwe scene laad
Oorzaak: Je gebruikt een gewone var score = 0 in een script dat aan een node is gekoppeld. Als die node verdwijnt (bijv. bij het laden van een nieuwe scene), verdwijnt ook de variabele.
Oplossing: Zet de variabele in global.gd in plaats van in het node-script. Dat script blijft de hele speelsessie bestaan.
Make-opdracht: voeg levens toe aan Global
Je hebt nu Global.score. Pas dezelfde aanpak toe op levens.
Opdracht: Voeg var levens = 3 toe aan global.gd en laat je vijand-script Global.levens -= 1 doen bij contact (in plaats van body.levens -= 1 uit de vorige les).
Tip
- Open
global.gden voegvar levens = 3toe ondervar score = 0 - Open je vijand-script en vervang
body.levens -= 1doorGlobal.levens -= 1 - Print de huidige waarde met
print("Levens: ", Global.levens) - Verwijder ook
var levens = 3uit je karakter-script (zoals je dat metscoredeed)
Antwoord
In global.gd:
extends Node
var score = 0
var levens = 3
In je vijand-script:
extends Area2D
func _on_body_entered(body: Node2D) -> void:
Global.levens -= 1
print("Levens: ", Global.levens)
queue_free()