Skip to main content

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

  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 in te stellen, laadt Godot het automatisch bij het opstarten en is het overal beschikbaar.

  1. Ga naar ProjectProject Settings
  2. Klik op het tabblad Autoload
  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

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

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

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:

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