Ga naar hoofdinhoud

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 wilt 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.

Godot 4.5

Geschreven voor Godot 4.5.x — zie Godot-versies voor compatibiliteit.

Voorspel: een variabele die overal woont

Wat als de score op één vaste plek leefde, buiten alle nodes om, altijd bereikbaar met dezelfde naam? Hoe zou je dat technisch oplossen?

Antwoord

Je maakt een apart script (bijvoorbeeld global.gd) dat niet aan een node hangt. Daarna 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 node-script zet, leven alleen zolang die node bestaat. Global lost dat op door buiten de Scene Tree te leven.

Stap 1: Maak een nieuw script

  1. Ga naar FileSystem (linksonder).
  2. Klik met rechts → New Script.
  3. Noem het global.gd.
  4. 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 te registreren, laadt Godot het automatisch bij het opstarten en is het overal beschikbaar.

  1. Ga naar ProjectProject Settings.
  2. Klik bovenin op het tabblad Autoload. Zie je het niet meteen? Het tabblad staat naast General — eventueel even doorscrollen.
  3. Klik op het mapje naast Path en kies global.gd.
  4. Bij Node Name vul je Global in (met hoofdletter).
  5. Klik op Add.

Global is nu overal beschikbaar in je project.

Voorspel: wat als je deze stap vergeet?

Wat denk je dat er gebeurt als je Stap 3 overslaat en meteen Global.score += 1 in je muntje-script zet?

Antwoord

Godot crasht zodra die regel wordt uitgevoerd, met een melding als Identifier "Global" not declared in the current scope. Het script global.gd bestaat wel op schijf — maar Godot kent de naam Global pas nadat je hem in Autoload hebt geregistreerd. Een script zonder Autoload is als een boek in een gesloten kast: het bestaat, maar niemand kan erbij.

Stap 4: Refactor 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 je muntje-script:

extends Area2D

func _on_body_entered(body: Node2D) -> void:
Global.score += 1
print("Score: ", Global.score)
queue_free()

In je karakter-script: verwijder de regel var score = 0. 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 roep je op dezelfde manier aan:

Global.verlies_leven()
Global.reset()

Samenvatting

BegripUitleg
Global variableEen variabele die overal in je project beschikbaar is
AutoloadInstelling waarmee Godot een script automatisch laadt bij start
Global.scoreZo lees of schrijf je een globale variabele
extends NodeHet global script extends Node omdat het geen specifiek type nodig heeft
tip

Gebruik global variables voor dingen die je in meerdere scènes nodig hebt: score, levens, instellingen. Gebruik gewone var voor dingen die alleen in één node leven.

In de volgende les zet je Global.score op het scherm met een Label.

Opdracht 6.3.a: voeg levens toe aan Global

Je hebt nu Global.score. Pas dezelfde aanpak toe op levens.

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).

Klik hier voor een tip.
  • Open global.gd en voeg var levens = 3 toe onder var score = 0.
  • Open je vijand-script en vervang body.levens -= 1 door Global.levens -= 1.
  • Print de huidige waarde met print("Levens: ", Global.levens).
  • Verwijder ook var levens = 3 uit je karakter-script (zoals je dat met score deed).
Klik hier voor de oplossing.

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()

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:

  1. Ga naar Project → Project Settings → Autoload.
  2. Klik op het mapje naast Path en kies global.gd.
  3. Vul bij Node Name precies Global in (met hoofdletter G).
  4. Klik op Add.
Mijn score-variabele reset bij elke nieuwe scène

Oorzaak: Je gebruikt een gewone var score = 0 in een node-script. Als die node verdwijnt (bij het laden van een nieuwe scène), 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.