====== GDScript — Kurzes Cheatsheet (Deutsch) ====== Dieses Cheatsheet fasst die wichtigsten Elemente von GDScript (Godot 3 & 4) kompakt zusammen. Codebeispiele sind kurz und direkt anwendbar. ===== Allgemeines ===== * Kommentar: # Einzeiliger Kommentar * Datei-Scope: * extends Node2D # Erbt von einem Node-Typ * class_name MyClass # Globaler Klassenname (registriert im Editor) ===== Variablen & Typen ===== ==== Dynamisch / untypisiert ==== var x = 5 ==== Getypt (empfohlen) ==== var speed: int = 200 const MAX_HP: int = 100 ==== onready (erst nach Knoten-Initialisierung): ==== @onready var sprite = $Sprite ==== export (sichtbar/konfigurierbar im Editor) ==== @export var speed := 200 @export (int, 0, 400) var health := 100 # Hinweis: Hint-Syntax kann je nach Version leicht variieren ===== Funktionen ===== ==== Definition ==== func my_func(param: int) -> String: return str(param) ==== Lebenszyklus-Hooks ==== func _ready(): # nach dem Hinzufügen in die Szene func _process(delta): # every frame (nicht-physikalisch) func _physics_process(delta): # physics frame ==== Sichtbarkeits-/Annotations ==== @tool # Skript läuft auch im Editor (Godot 3/4) export, onready, class_name siehe oben ===== Knoten & Szenen ===== ==== Zugriff ==== var player = get_node("Player") var p = $Player/SubNode ==== Instanziieren ==== var Packed = preload("res://Enemy.tscn") var enemy = Packed.instantiate() # Godot 4 var enemy = Packed.instance() # Godot 3 (alte Methode) add_child(enemy) ==== Entfernen ==== queue_free() ===== Ressourcen laden ===== ==== preload (compile-time, schneller) ==== var TEX = preload("res://sprite.png") ==== load (runtime) ==== var TEX = load("res://sprite.png") ===== Signale ===== ==== Definieren / Emittieren ==== signal hit(damage) emit_signal("hit", 10) ==== Verbinden ==== connect("hit", self, "_on_hit") $Button.connect("pressed", self, "_on_pressed") ==== Godot 4: Typed signal syntax möglich ==== signal hit(damage: int) ===== Eingabe (Input) ===== ==== _input(event) ==== func _input(event): if event is InputEventKey and event.pressed: if event.scancode == KEY_SPACE: jump() ==== Input-Mapping (Project Settings -> InputMap) ==== if Input.is_action_pressed("ui_right"): ... ===== Await / Coroutines / Timer ===== ==== Godot 3 yield ==== yield(get_tree().create_timer(1.0), "timeout") ==== Godot 4 await ==== await get_tree().create_timer(1.0).timeout ==== Timer-Node ==== $Timer.start(2.0) ===== Collections ===== ==== Array ==== var a = [1, 2, 3] a.append(4) for i in a: ... ==== Dictionary: ==== var d = {"hp": 10, "name": "Player"} if d.has("hp"): ... ===== Kontrollstrukturen ===== ==== if/elif/else ==== if x > 0: # die Zahl ist größer Null pass elif x < 0: # die Zahl ist kleiner Null pass else: # die Zahl ist Null pass ==== match (Godot 4 / GDScript 2.0): ==== match value: 1: ... _: ... ==== for/while: ==== for i in range(5): ... while cond: ... ===== Fehlerbehandlung & Debug ===== * print(), push_error(), push_warning() * assert(condition, "message") [[https://docs.godotengine.org/de/4.5/tutorials/scripting/gdscript/gdscript_basics.html#assert-keyword|Online-Doku]] * ===== Best Practices (Kurz) ===== * Typisieren wo möglich (besseres Autocomplete & Fehlercheck) * Export für Editor-Bearbeitbarkeit * onready für Knoten-Referenzen * Verwende preload für häufig genutzte Ressourcen * Trenne Gameplay-Logik in übersichtliche Methoden * Nutze Signals statt eng gekoppelter Node-Referenzen (lockere Kopplung) ==== Nützliche One-Liner==== === Position setzen (Node2D) === position = Vector2(100, 200) === Bewegung === velocity = velocity.move_toward(target, speed * delta) === Prüfen ob in Gruppe === if is_in_group("enemies"): ... === Connect per Code: === some_node.connect("signal", self, "_method") ===== Kurze Beispiele ===== ==== Player (Grundgerüst) ==== extends CharacterBody2D class_name Player export var speed: float = 200.0 onready var sprite = $Sprite func _physics_process(delta): var dir = Vector2.ZERO if Input.is_action_pressed("ui_right"): dir.x += 1 if Input.is_action_pressed("ui_left"): dir.x -= 1 velocity.x = dir.x * speed move_and_slide()