Menu
CoddyTech

GDScript Spickzettel

Zuletzt aktualisiert

Grundlagen und Ausgabe

Ein Skript erweitert einen Node-Typ, und Godot ruft seine Funktionen für dich auf.

OperationSyntax
Skript an einen Node-Typ hängenextends Node
Code, der beim Start des Nodes läuftfunc _ready() -> void: print("Hello, World!")
Werte ohne Trennzeichen ausgebenprint("HP: ", hp)
Werte durch Leerzeichen getrennt ausgebenprints("a", "b", 3)
Kommentar# This is a comment
Dokumentationskommentar## Shown in the editor's help
Mehrzeiliger Stringvar text := """Line one Line two"""
Fehler meldenpush_error("Health is negative")
Warnung meldenpush_warning("Old save file")

Variablen, Konstanten und Typen

Typen sind optional. Füge sie für Editor-Prüfungen, Autovervollständigung und schnelleren Code hinzu.

OperationSyntax
Variable (dynamischer Typ)var score = 0
Variable mit statischem Typvar speed: float = 200.0
Statischen Typ ableitenvar lives := 3
Konstanteconst MAX_HP = 100
Enumenum State { IDLE, RUN, JUMP }
Enum-Wert verwendenvar state: State = State.IDLE
Vektor- und Farbwertevar pos := Vector2(10, 20) var tint := Color(1, 0, 0)
Leere Objektreferenzvar target: Node = null
In Text, int oder float umwandelnstr(42), int("42"), float("3.5")
Float zu int (schneidet Nachkommastellen ab)int(3.9) # 3
Typ prüfenvalue is int, node is Sprite2D
In einen Typ castenvar sprite := node as Sprite2D

Operatoren

Bekannte Mathematik, dazu englische Wörter für Logik.

OperationSyntax
Addieren, subtrahieren, multiplizieren, dividierena + b, a - b, a * b, a / b
Ganzzahldivision (int / int)7 / 2 # 3
Rest7 % 3, fmod(7.5, 2.0)
Potenz2 ** 10 # 1024
Zusammengesetzte Zuweisungx += 1, x -= 1, x *= 2, x /= 2
Vergleich==, !=, <, >, <=, >=
Logika and b, a or b, not a
Logik (Symbolschreibweise)a && b, a || b, !a
Inline-ifvar label := "win" if score > 10 else "lose"
Enthalten in einer Sammlung"sword" in inventory
Bitweisea & b, a | b, a ^ b, ~a, a << 1, a >> 1

Kontrollfluss

Blöcke werden wie in Python durch Einrückung bestimmt. Godot rückt standardmäßig mit Tabs ein.

OperationSyntax
If, elif, elseif hp <= 0: die() elif hp < 20: print("Low HP") else: print("OK")
Einzeiliges ifif hp <= 0: die()
Über einen Bereich iterierenfor i in range(5): print(i) # 0 to 4
Bereich mit Start, Ende und Schrittweitefor i in range(10, 0, -2): print(i) # 10, 8, 6, 4, 2
n-mal wiederholenfor i in 3: print(i) # 0, 1, 2
Über ein Array iterierenfor item in items: print(item)
Typisierte Schleifenvariable (Godot 4.2+)for n: String in names: print(n.to_upper())
While-Schleifewhile hp > 0: hp -= 10
Schleife verlassen oder Durchlauf überspringenbreak, continue
Platzhalter für leeren Blockpass

Mustervergleich (match)

match führt den ersten Zweig aus, dessen Muster passt. Es gibt kein Fallthrough.

OperationSyntax
Werte vergleichenmatch state: State.IDLE: print("idle") State.RUN: print("run")
Mehrere Werte in einem Zweigmatch key: "w", "up": move_up()
Standardzweig (Wildcard)match n: 0: print("zero") _: print("other")
Wert an einen Namen bindenmatch cmd: "quit": get_tree().quit() var other: print("Unknown: ", other)
Array-Mustermatch pos: [0, 0]: print("origin") [var x, 0]: print("on the x axis at ", x)
Array mit beliebigem Restmatch args: ["move", ..]: print("move command")
Dictionary-Mustermatch item: {"type": "coin", "value": var v}: gold += v
Bedingung mit when (Godot 4.4+)match score: var s when s >= 90: print("A") var s when s >= 75: print("B") _: print("C")

Funktionen und Lambdas

Funktionen sind auch Werte: Du kannst sie speichern, übergeben und Argumente an sie binden.

OperationSyntax
Typisierte Parameter und Rückgabefunc add(a: int, b: int) -> int: return a + b
Kein Rückgabewertfunc reset() -> void: score = 0
Standardargumentfunc greet(who := "player") -> void: print("Hi, ", who)
Statische Funktionstatic func double(x: int) -> int: return x * 2
Einzeiliges Lambdavar square := func(x): return x * x
Callable aufrufensquare.call(4) # 16
Funktion als Wertvar on_done := reset on_done.call()
Argumente bindenvar add_ten := add.bind(10) print(add_ten.call(5)) # 15
Mehrzeiliges Lambdavar greet_all := func(names: Array) -> void: for n in names: print("Hi, ", n)
Auf einen Timer wartenawait get_tree().create_timer(1.0).timeout
Auf eine Coroutine wartenvar data = await fetch_data()

Strings

String-Methoden geben einen neuen String zurück und ändern nie das Original.

OperationSyntax
Mit % formatieren"%s has %d HP" % [name, hp]
Zwei Nachkommastellen"%.2f" % 3.14159 # "3.14"
Mit benannten Platzhaltern formatieren"{a} vs {b}".format({"a": 1, "b": 2})
Mit + verketten"Score: " + str(score)
Längetext.length()
Groß- oder Kleinschreibungtext.to_upper(), text.to_lower()
In Teile zerlegen"a,b,c".split(",") # ["a", "b", "c"]
Teile zusammenfügen", ".join(["a", "b", "c"])
Leerraum entfernen" hi ".strip_edges() # "hi"
Text ersetzentext.replace("cat", "dog")
Position findentext.find("lo") # -1 if missing
Beginnt oder endet mittext.begins_with("Hi"), text.ends_with("!")
Teilstringtext.substr(0, 5)
Enthält"ell" in "Hello" # true

Arrays

Arrays wachsen und schrumpfen. Ein typisiertes Array akzeptiert nur seinen Elementtyp.

OperationSyntax
Array-Literal (gemischte Typen)var items = [1, "two", 3.0]
Typisiertes Arrayvar scores: Array[int] = [10, 20, 30]
Per Index lesen (negativ zählt vom Ende)scores[0], scores[-1]
Am Ende anhängenscores.append(40), scores.push_back(40)
An einem Index einfügenscores.insert(0, 5)
Letztes Element entfernen und zurückgebenvar last = scores.pop_back()
Nach Wert oder Index entfernenscores.erase(20), scores.remove_at(0)
Enthält, Index vonscores.has(30), scores.find(30)
Länge, Leer-Prüfungscores.size(), scores.is_empty()
Sortierenscores.sort()
Mit eigener Regel sortierenenemies.sort_custom(func(a, b): return a.hp < b.hp)
Mapscores.map(func(x): return x * 2)
Filterscores.filter(func(x): return x > 15)
Reducescores.reduce(func(acc, x): return acc + x, 0)
Slice (Ende exklusiv)scores.slice(1, 3)

Dictionaries

Schlüssel-Wert-Paare. Schlüssel können jeden Typ haben, am häufigsten sind Strings.

OperationSyntax
Dictionary-Literalvar stats = {"hp": 100, "mp": 30}
Typisiertes Dictionary (Godot 4.4+)var prices: Dictionary[String, int] = {"sword": 50}
Schlüssel lesen oder schreibenstats["hp"], stats["xp"] = 50
Mit Standardwert lesenstats.get("luck", 0)
Schlüssel vorhandenstats.has("hp"), "hp" in stats
Schlüssel entfernenstats.erase("mp")
Schlüssel und Wertestats.keys(), stats.values()
Anzahl der Einträgestats.size()
Anderes Dictionary zusammenführen (true überschreibt)stats.merge({"luck": 5}), stats.merge(bonus, true)
Über Schlüssel iterierenfor key in stats: print(key, " = ", stats[key])

Klassen und Annotationen

Jedes Skript ist eine Klasse. Annotationen beginnen mit @.

OperationSyntax
Der Klasse einen globalen Namen gebenclass_name Player extends CharacterBody2D
Konstruktorfunc _init(start_hp := 100) -> void: hp = start_hp
Instanz erstellenvar p := Player.new()
Innere Klasseclass Item: var name := "" var price := 0
Elternversion dieser Methode aufrufenfunc _ready() -> void: super() print("child ready")
Andere Elternmethode aufrufensuper.take_damage(10)
Statische Variable (Godot 4.1+)static var count := 0
Im Inspector anzeigen@export var speed := 300.0
Mit Schieberegler-Bereich anzeigen@export_range(0, 100) var volume := 50
Kind-Node holen, sobald bereit@onready var sprite: Sprite2D = $Sprite2D
Setter und Gettervar hp := 100: set(value): hp = clampi(value, 0, 100) get: return hp
Skript im Editor ausführen@tool

Signale

Signale sind vollwertige Objekte: Deklariere sie und emittiere, verbinde und erwarte sie dann direkt.

OperationSyntax
Signal deklarierensignal died
Signal mit typisierten Argumentensignal health_changed(old_hp: int, new_hp: int)
Emittierendied.emit()
Mit Argumenten emittierenhealth_changed.emit(100, 80)
Mit einer Methode verbindenplayer.died.connect(_on_player_died)
Ein Lambda verbindenbutton.pressed.connect(func(): print("Clicked"))
Zusätzliche Argumente übergebenbutton.pressed.connect(_on_pressed.bind("start"))
Nur einmal auslösentimer.timeout.connect(_on_timeout, CONNECT_ONE_SHOT)
Trennenplayer.died.disconnect(_on_player_died)
Verbindung prüfenplayer.died.is_connected(_on_player_died)
Auf ein Signal wartenawait player.died

Nodes und Lebenszyklus

Die Callbacks, die Godot auf deinem Node aufruft, und die Aufrufe, die du am Szenenbaum machst.

OperationSyntax
Objekt erstellt (vor dem Baum)func _init() -> void: print("created")
Node und seine Kinder sind bereitfunc _ready() -> void: print("ready")
Jeder Framefunc _process(delta: float) -> void: position.x += 100.0 * delta
Jeder Physik-Tickfunc _physics_process(delta: float) -> void: velocity.y += 980.0 * delta move_and_slide()
Eingabe, die die UI nicht genutzt hatfunc _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("jump"): jump()
Node per Pfad holenget_node("Sprite2D"), $Sprite2D
Pfad mit Leerzeichen, eindeutiger Name$"UI/Health Bar", %HealthBar
Eingabeaktion prüfenInput.is_action_pressed("move_right")
Szene instanziierenvar enemy := preload("res://enemy.tscn").instantiate() add_child(enemy)
Node sicher löschenqueue_free()
Eltern und Kinderget_parent(), get_children()
Szene wechselnget_tree().change_scene_to_file("res://main.tscn")

Die GDScript-Syntax, die du beim Bauen eines Godot-Spiels brauchst, auf einer Seite. Dieser GDScript-Spickzettel ist eine Schnellreferenz für Godot 4: Variablen und statische Typen, Operatoren, Kontrollfluss und match, Funktionen und Lambdas, Strings, Arrays und Dictionaries, Klassen, Signale sowie die Node-Callbacks, die Godot in jedem Frame ausführt.

Alles hier ist Godot-4-Syntax, du siehst also @export, @onready, died.emit() und await statt der Formen aus Godot 3. Kopiere, was du brauchst, in dein Skript, oder probiere die Sprach-Snippets live im GDScript-Playground aus: Setz sie in _ready() und führe sie im Browser aus, ganz ohne Godot-Installation.

GDScript-Spickzettel FAQ

Ist dieser GDScript-Spickzettel kostenlos?
Ja. Dieser GDScript-Spickzettel ist komplett kostenlos, ohne Anmeldung. Setz dir ein Lesezeichen und komm zurück, wann immer du die genaue Syntax für ein Signal, ein match-Muster oder eine Array-Methode brauchst.
Ist dieser Spickzettel für Godot 4 oder Godot 3?
Godot 4. Die beiden Versionen unterscheiden sich so, dass kopierter Code bricht: Godot 4 nutzt die Annotationen @export und @onready statt der Schlüsselwörter export und onready, died.emit() und died.connect(callable) statt emit_signal("died") und connect mit Strings, await statt yield und super() statt .method(). Zeilen mit 4.1+, 4.2+ oder 4.4+ brauchen mindestens diese Godot-Version.
Was ist der Unterschied zwischen = und := in GDScript?
var x = 5 erzeugt eine dynamische Variable, die später jeden Typ aufnehmen kann. var x := 5 leitet den Typ aus dem Wert ab (hier int) und legt ihn fest, sodass eine spätere Zuweisung eines Strings ein Fehler ist. var x: int = 5 gibt den Typ explizit an. Statische Typen bringen dir Fehler im Editor, bessere Autovervollständigung und schnelleren Code.
Wie funktionieren Signale in GDScript?
Deklariere ein Signal mit signal died, sende es mit died.emit() und reagiere in einem anderen Node darauf mit player.died.connect(_on_player_died). Du kannst statt einer Methode ein Lambda verbinden, zusätzliche Argumente mit .bind() binden oder eine Funktion mit await player.died pausieren, bis das Signal ausgelöst wird.
Ist GDScript wie Python?
Es sieht ähnlich aus: Blöcke werden durch Einrückung bestimmt, und es nutzt for ... in, if/elif/else sowie englische Wörter wie and, or und not. Aber GDScript ist eine eigene Sprache, gebaut für Godot. Es hat optionale statische Typen, Signale, Annotationen wie @export und direkten Zugriff auf Nodes mit $.
Kann ich GDScript online üben?
Ja. Öffne den GDScript-Playground, um Snippets aus diesem Spickzettel im Browser auszuführen: Der Playground hängt dein Skript an einen Node, sodass Code in _ready() einmal läuft. Wenn du Struktur willst, führt dich Coddys kostenloser interaktiver GDScript-Kurs Schritt für Schritt von Variablen und Funktionen bis zu Klassen und Signalen.
Illustration der Programmiersprachen bei Coddy

Lerne GDScript mit Coddy

LOS GEHT'S