I cant figure out what is wrong with the falling of my Player

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

You can’t add to gravity if you reset it to zero every frame.

That makes sense, thanks!