CharacterBody2D/3D in Godot 4 — Vollständiger Leitfaden

1. Einführung

Godot 4 hat große Änderungen an der Charakterbewegung eingeführt. Die alten Nodes KinematicBody2D und KinematicBody3D wurden in CharacterBody2D und CharacterBody3D umbenannt, und die move_and_slide()-API wurde komplett neu gestaltet. Ob du von Godot 3 migrierst oder ganz neu anfängst — dieser Leitfaden deckt alles ab, was du wissen musst.

CharacterBody2D und CharacterBody3D sind Physik-Bodies, die für per Code gesteuerte Charaktere gedacht sind. Anders als RigidBody reagieren sie nicht automatisch auf Kräfte — du steuerst ihre Bewegung vollständig per Skript. Das macht sie ideal für Spielfiguren, NPCs und alles, was präzise, deterministische Bewegung braucht.

2. Was sich gegenüber Godot 3 geändert hat

Hier sind die wichtigsten Änderungen bei der Charakterbewegung zwischen Godot 3 und Godot 4:

Wichtige Erkenntnis

In Godot 3 gab move_and_slide() die resultierende Geschwindigkeit zurück. In Godot 4 gibt es einen bool zurück (ob eine Kollision aufgetreten ist), und die Geschwindigkeit wird direkt in der velocity-Eigenschaft aktualisiert.

3. Grundlegender 2D-Platformer-Controller

Dies ist der standardmäßige Side-Scrolling-Platformer-Controller. Der Charakter kann sich nach links/rechts bewegen und springen, wenn er am Boden ist. Das ist die Vorlage, die Godot beim Erstellen eines neuen CharacterBody2D-Skripts generiert.

GDScript — platformer_controller.gd
extends CharacterBody2D

const SPEED = 300.0
const JUMP_VELOCITY = -400.0

func _physics_process(delta: float) -> void:
    # Apply gravity when not on floor
    if not is_on_floor():
        velocity += get_gravity() * delta

    # Jump when on floor and jump pressed
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = JUMP_VELOCITY

    # Horizontal movement
    var direction := Input.get_axis("ui_left", "ui_right")
    if direction:
        velocity.x = direction * SPEED
    else:
        velocity.x = move_toward(velocity.x, 0, SPEED)

    move_and_slide()

Zeile-für-Zeile-Erklärung

Tipp: Erforderliche Node-Struktur

Dein CharacterBody2D braucht mindestens einen CollisionShape2D-Kind-Node mit einer zugewiesenen Form (z. B. RectangleShape2D oder CapsuleShape2D). Ohne diese erkennt move_and_slide() keine Kollisionen.

4. Grundlegender 2D-Top-Down-Controller

Für Top-Down-Spiele (RPGs, Twin-Stick-Shooter usw.) bewegst du dich ohne Gravitation in alle vier Richtungen. Der Code ist einfacher als bei einem Platformer.

GDScript — topdown_controller.gd
extends CharacterBody2D

const SPEED = 200.0

func _physics_process(delta: float) -> void:
    var input_direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    velocity = input_direction * SPEED
    move_and_slide()

So funktioniert es

Beschleunigung und Reibung hinzufügen

Für ein weicheres Gefühl mit Beschleunigung und Abbremsen:

GDScript — topdown_smooth.gd
extends CharacterBody2D

const SPEED = 200.0
const ACCELERATION = 1200.0
const FRICTION = 1000.0

func _physics_process(delta: float) -> void:
    var input_direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")

    if input_direction != Vector2.ZERO:
        velocity = velocity.move_toward(input_direction * SPEED, ACCELERATION * delta)
    else:
        velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)

    move_and_slide()

5. 3D-Third-Person-Controller

Die 3D-Variante folgt demselben Muster. Der Hauptunterschied ist die Arbeit mit Vector3 und die Nutzung von transform.basis, um 2D-Eingaben in Bewegung im 3D-Weltraum umzuwandeln.

GDScript — character_3d.gd
extends CharacterBody3D

const SPEED = 5.0
const JUMP_VELOCITY = 4.5

func _physics_process(delta: float) -> void:
    # Apply gravity
    if not is_on_floor():
        velocity += get_gravity() * delta

    # Jump
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = JUMP_VELOCITY

    # Get input and convert to 3D direction
    var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

    if direction:
        velocity.x = direction.x * SPEED
        velocity.z = direction.z * SPEED
    else:
        velocity.x = move_toward(velocity.x, 0, SPEED)
        velocity.z = move_toward(velocity.z, 0, SPEED)

    move_and_slide()

Wichtige Unterschiede zu 2D

Warnung: get_gravity() erfordert Godot 4.4+

Die Methode get_gravity() wurde in Godot 4.4 hinzugefügt. Verwende für ältere Versionen Vector2(0, ProjectSettings.get_setting("physics/2d/default_gravity")) für 2D oder Vector3(0, -ProjectSettings.get_setting("physics/3d/default_gravity"), 0) für 3D.

6. Referenz der wichtigsten Eigenschaften

Sowohl CharacterBody2D als auch CharacterBody3D teilen sich diese wichtigen Eigenschaften. Passe sie im Inspektor oder per Code an.

Eigenschaft Typ Standard Beschreibung
velocity Vector2 / Vector3 Vector2.ZERO Die Geschwindigkeit des Charakters. Setze sie, bevor du move_and_slide() aufrufst. Nach dem Aufruf wird sie mit der resultierenden Geschwindigkeit aktualisiert.
floor_snap_length float 1.0 Ersetzt move_and_slide_with_snap(). Distanz, mit der der Charakter an den Boden gesnappt wird. Auf 0 setzen, um es zu deaktivieren. Nützlich für Hänge und Treppen.
up_direction Vector2 / Vector3 Vector2.UP Legt fest, welche Richtung „oben“ ist. Das bestimmt, was als Boden, Wand oder Decke zählt. Standard ist (0, -1) in 2D, (0, 1, 0) in 3D.
floor_stop_on_slope bool true Wenn true, rutscht der Charakter im Stillstand nicht an Hängen hinunter. Für Platformer unerlässlich.
floor_max_angle float 0.785 (45°) Maximaler begehbarer Neigungswinkel in Radiant. Steilere Oberflächen werden als Wände behandelt. Verwende deg_to_rad(60), um 60 Grad einzustellen.
max_slides int 6 Maximale Anzahl an Kollisions-Iterationen pro move_and_slide()-Aufruf. Höhere Werte sind genauer, aber langsamer.
wall_min_slide_angle float 0.262 (15°) Minimaler Winkel für das Gleiten an Wänden. Verhindert, dass der Charakter an nahezu parallelen Wänden hängen bleibt.
platform_on_leave PlatformOnLeave ADD_VELOCITY Verhalten beim Verlassen einer beweglichen Plattform. ADD_VELOCITY erhält den Impuls, ADD_UPWARD_VELOCITY fügt nur die Aufwärtskomponente hinzu, DO_NOTHING ignoriert die Plattformgeschwindigkeit.
slide_on_ceiling bool true Wenn true, ist Gleiten an Decken erlaubt. Wenn false, wird die horizontale Geschwindigkeit beim Deckenkontakt gestoppt.

7. Kollisionserkennung nach move_and_slide()

Nach dem Aufruf von move_and_slide() kannst du die aufgetretenen Kollisionen inspizieren. Das ist nützlich, um auf bestimmte Collider-Typen zu reagieren, beim Landen Soundeffekte abzuspielen oder Wall-Jump-Mechaniken umzusetzen.

GDScript — collision_detection.gd
func _physics_process(delta: float) -> void:
    # ... set velocity here ...
    move_and_slide()

    # Check all collisions from this frame
    for i in get_slide_collision_count():
        var collision := get_slide_collision(i)
        var collider := collision.get_collider()
        print("Collided with: ", collider.name)
        print("Normal: ", collision.get_normal())
        print("Position: ", collision.get_position())

    # Practical example: bounce off enemies
    for i in get_slide_collision_count():
        var collision := get_slide_collision(i)
        if collision.get_collider().is_in_group("enemies"):
            velocity = collision.get_normal() * 300
            break

Nützliche KinematicCollision-Methoden

8. Migrations-Spickzettel

Schnelle Referenz zum Umschreiben von Godot-3-Code auf Godot 4:

Godot 3 Godot 4
KinematicBody2D CharacterBody2D
KinematicBody3D CharacterBody3D
velocity = move_and_slide(velocity, Vector2.UP) velocity = ...
move_and_slide()
move_and_slide_with_snap(vel, snap, up) floor_snap_length = 4.0
move_and_slide()
var vel = move_and_slide(...)
gibt velocity zurück
move_and_slide()
velocity-Eigenschaft wird direkt aktualisiert
var gravity = ProjectSettings.get("physics/2d/default_gravity") get_gravity() (4.4+)
move_and_slide(..., up_direction, ...) up_direction = Vector2.UP (als Eigenschaft gesetzt)
move_and_slide(..., stop_on_slope, ...) floor_stop_on_slope = true (als Eigenschaft gesetzt)
Godots Auto-Konverter

Wenn du ein Godot-3-Projekt in Godot 4 öffnest, bietet die Engine an, dein Projekt zu konvertieren. Sie benennt Nodes um und versucht, Skripte zu aktualisieren, bekommt move_and_slide()-Aufrufe aber nicht immer richtig hin. Wahrscheinlich musst du deinen Bewegungscode manuell korrigieren.

9. Häufige Fehler

Fehler 1: Argumente an move_and_slide() übergeben

Falsch
# ERROR: move_and_slide() takes no arguments in Godot 4
velocity = move_and_slide(velocity, Vector2.UP)
Richtig
# Set velocity, then call move_and_slide() with no arguments
velocity.x = direction * SPEED
move_and_slide()

Fehler 2: Vergessen, velocity vor move_and_slide() zu setzen

Falsch — velocity wird nie gesetzt, also bewegt sich nichts
func _physics_process(delta: float) -> void:
    move_and_slide()  # velocity is Vector2.ZERO — nothing happens

Fehler 3: _process() statt _physics_process() verwenden

move_and_slide() muss in _physics_process() aufgerufen werden, das mit einer festen Rate läuft (standardmäßig 60 Hz). _process() zu verwenden koppelt die Physik an die Render-Framerate und führt zu inkonsistentem Verhalten.

Fehler 4: CollisionShape nicht einrichten

Ein CharacterBody2D/CharacterBody3D ohne CollisionShape-Kind bewegt sich durch alles hindurch. Godot zeigt im Editor ein Warnsymbol an, wenn die Kollisionsform fehlt.

Fehler 5: velocity.y in jedem Frame mit Gravitation überschreiben

Falsch — setzt velocity.y zurück, sodass Springen nie funktioniert
# This overwrites any jump velocity!
velocity.y = gravity * delta  # should be +=, not =
Richtig — akkumuliert Gravitation
# Gravity accumulates over time
velocity += get_gravity() * delta

Fehler 6: Gravitation anwenden, während man am Boden ist

Umschließe die Gravitation immer mit if not is_on_floor(). Ohne diese Prüfung akkumuliert die Gravitation weiter, während man am Boden ist. Wenn der Charakter von einer Kante läuft, stürzt er mit extremer Geschwindigkeit ab, statt natürlich zu fallen.

10. Charakter-Controller mit KI einrichten

Soll KI deinen Charakter-Controller einrichten?

Mit Godot MCP Pro können KI-Assistenten CharacterBody-Nodes erstellen, Physikeigenschaften konfigurieren, Kollisionsformen einrichten, Bewegungsskripte schreiben, dein Spiel starten und die Bewegung testen — alles aus natürlichsprachlichen Prompts.

add_node setup_physics_body setup_collision set_physics_layers create_script simulate_key play_scene capture_frames
Godot MCP Pro holen — $15