Godot Version
Godot Engine 4.3
Question
Why does the player fall so weirdly in this code, its like there is no acceleration, whenever I jump I teleport a bit above the ground and then fall down in slo-mo, there is no accelleration and i cant figure out how to fix this, please ignore the German in the code
My Player:
Characterbody (Root)
Collisionshape3d (capsuleshape)
Node3d (named CameraPivot)
Camera3d (child of CameraPivot)
extends CharacterBody3D
# Bewegungseigenschaften
var speed = 5.0
var jump_force = 10.0 # Sprungkraft
var gravity = -9.8
var slide_speed = 30.0 # Schnelleres Sliden
var slide_impulse = 20.0 # Impuls, der beim Starten des Slidens hinzugefügt wird
# Maussteuerung
var mouse_sensitivity = 0.1
var vertical_min = -80
var vertical_max = 80
var vertical_angle = 0.0
# Speichern der Richtung, in die der Spieler gleitet
var slide_direction = Vector3.ZERO
# Flag, das angibt, ob der Spieler slidet
var is_sliding = false
# Kamera-Node für Effekte
@onready var camera_pivot = $CameraPivot # Pivot node für die Drehung der Kamera
@onready var camera = camera_pivot.get_node("Camera3D") # Die Kamera selbst
func _ready():
# Mauszeiger verstecken und fangen
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _input(event):
if event is InputEventMouseMotion:
# Horizontale Rotation (dreht den ganzen Körper um die Y-Achse)
rotate_y(deg_to_rad(-event.relative.x * mouse_sensitivity))
# Vertikale Rotation (nur die Kamera)
vertical_angle -= event.relative.y * mouse_sensitivity
vertical_angle = clamp(vertical_angle, vertical_min, vertical_max)
camera_pivot.rotation_degrees.x = vertical_angle
# Mausfreigabe bei Escape-Taste
if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
func _physics_process(delta):
var direction = Vector3.ZERO
var move_speed = speed # Standardgeschwindigkeit
velocity = Vector3.ZERO # Initialisiere velocity
# Wenn die Shift-Taste gedrückt wird und der Spieler auf dem Boden ist
if Input.is_action_pressed("ui_shift") and is_on_floor() and !is_sliding:
is_sliding = true
# Bestimme die Gleitrichtung basierend auf der Kamerarichtung (Blickrichtung)
slide_direction = -transform.basis.z.normalized() # Gleite immer nach vorne in Blickrichtung
# Impuls für das Sliden anwenden
velocity = slide_direction * slide_impulse # Direkter Impuls in die Gleitrichtung
move_speed = slide_speed # Setze die Geschwindigkeit für das Sliden
# Wenn der Spieler bereits im Sliden ist
if is_sliding:
# Schwerkraft anwenden, auch während des Slidens
velocity.y += gravity * delta # Schwerkraft wirkt auf den Spieler
# Behalte die horizontale Bewegung bei
velocity.x = slide_direction.x * slide_speed
velocity.z = slide_direction.z * slide_speed
# Logge die Gleitrichtung und die Geschwindigkeit während des Slidens
print("Slide Direction (during slide): ", slide_direction)
print("Velocity (during slide): ", velocity)
# Wenn Shift losgelassen wird, beende das Sliden
if !Input.is_action_pressed("ui_shift") and is_sliding:
is_sliding = false # Beende das Sliden
velocity = Vector3.ZERO # Setze die Geschwindigkeit zurück
# Normiere die Richtung und multipliziere mit der Bewegungsgeschwindigkeit (nur wenn nicht im Sliden)
var normal_velocity = Vector3.ZERO # Normale Bewegungsgeschwindigkeit
if !is_sliding:
if Input.is_action_pressed("ui_up"):
direction -= transform.basis.z
if Input.is_action_pressed("ui_down"):
direction += transform.basis.z
if Input.is_action_pressed("ui_left"):
direction -= transform.basis.x
if Input.is_action_pressed("ui_right"):
direction += transform.basis.x
direction = direction.normalized() * move_speed
normal_velocity.x = direction.x
normal_velocity.z = direction.z
# Schwerkraft anwenden, wenn der Spieler nicht auf dem Boden ist
if not is_on_floor():
velocity.y += gravity * delta # Schwerkraft wird hier nur angewendet, wenn der Spieler nicht auf dem Boden ist
# Sprung-Logik (nur wenn der Spieler auf dem Boden ist oder slidet)
if Input.is_action_just_pressed("ui_accept") and (is_on_floor() or is_sliding):
velocity.y = jump_force # Setze die vertikale Geschwindigkeit für das Springen
# Setze die berechnete Geschwindigkeit auf den CharacterBody3D (wichtig für move_and_slide())
velocity.x = normal_velocity.x
velocity.z = normal_velocity.z
# Bewegung anwenden (Hier wird move_and_slide ohne Argumente aufgerufen)
move_and_slide()