Godot Version
4.4
Question
` Im trying to implement a slide function that halves your collider and upon ending the slide it returns to normal
extends CharacterBody3D
Parametry ruchu
@export var speed: float = 5.0
@export var jump_force: float = 4.5
@export var gravity: float = 9.8
Przyspieszenie
@export var ground_acceleration: float = 20.0
@export var air_acceleration: float = 5.0
@export var ground_friction: float = 15.0
@export var air_friction: float = 1.0
Slide
@export var slide_speed_multiplier: float = 2.5
@export var slide_duration: float = 1.0
@export var slide_cooldown: float = 0.5
@export var slide_height: float = 0.5
@export var slide_camera_offset: float = -0.5
Wall jump
@export var wall_jump_force: float = 6.0
@export var wall_jump_cooldown: float = 0.3
@export var wall_jump_horizontal_multiplier: float = 1.2
Czułość myszy
@export var mouse_sensitivity: float = 0.002
Referencje
@onready var camera: Camera3D = $Camera3D
@onready var collision_shape: CollisionShape3D = $CollisionShape3D
Zmienne wewnętrzne
var original_height: float
var original_camera_height: float = 0.8
var camera_pitch: float = 0.0
var last_wall_normal: Vector3 = Vector3.ZERO
var wall_jump_timer: float = 0.0
var is_sliding: bool = false
var slide_timer: float = 0.0
var slide_cooldown_timer: float = 0.0
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# Ustawienie początkowych wartości na podstawie collidera
original_height = collision_shape.shape.height
original_camera_height = camera.position.y
print("camera: ", original_camera_height)
func _input(event):
if event is InputEventMouseMotion:
rotate_y(-event.relative.x * mouse_sensitivity)
camera_pitch += event.relative.y * mouse_sensitivity
camera_pitch = clamp(camera_pitch, deg_to_rad(-90), deg_to_rad(90))
camera.rotation.x = -camera_pitch
func _physics_process(delta):
# Aktualizacja timerów
wall_jump_timer = max(wall_jump_timer - delta, 0.0)
slide_cooldown_timer = max(slide_cooldown_timer - delta, 0.0)
# Obsługa slide'u
if is_sliding:
slide_timer -= delta
if slide_timer <= 0 or not is_on_floor():
end_slide()
# Wejście w slide
if Input.is_action_just_pressed("slide") and is_on_floor() and slide_cooldown_timer <= 0 and not is_sliding:
start_slide()
# Grawitacja
if not is_on_floor():
velocity.y -= gravity * delta
# Kolizje ze ścianami
var is_on_wall = false
if get_last_slide_collision() != null:
last_wall_normal = get_last_slide_collision().get_normal()
is_on_wall = last_wall_normal.dot(Vector3.UP) < 0.1 && !is_on_floor()
# Skoki
if Input.is_action_just_pressed("ui_accept"):
if is_on_floor() and not is_sliding:
velocity.y = jump_force
elif is_on_wall && wall_jump_timer <= 0.0:
var wall_jump_dir = last_wall_normal * wall_jump_horizontal_multiplier
velocity = Vector3(
wall_jump_dir.x * wall_jump_force,
jump_force,
wall_jump_dir.z * wall_jump_force
)
wall_jump_timer = wall_jump_cooldown
# Ruch poziomy
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 not is_sliding:
var target_velocity = direction * speed
var horizontal_velocity = Vector2(velocity.x, velocity.z)
var target_horizontal = Vector2(target_velocity.x, target_velocity.z)
if input_dir != Vector2.ZERO:
var accel = ground_acceleration if is_on_floor() else air_acceleration
horizontal_velocity = horizontal_velocity.move_toward(target_horizontal, accel * delta)
else:
var friction = ground_friction if is_on_floor() else air_friction
horizontal_velocity = horizontal_velocity.move_toward(Vector2.ZERO, friction * delta)
velocity.x = horizontal_velocity.x
velocity.z = horizontal_velocity.y
move_and_slide()
func start_slide():
is_sliding = true
slide_timer = slide_duration
slide_cooldown_timer = slide_cooldown
# Zmiana wysokości collidera
var shape = collision_shape.shape.duplicate()
shape.height = slide_height
collision_shape.shape = shape
collision_shape.position.y = slide_height / 2 # Środek geometryczny
# Dostosowanie kameryw
camera.position.y = original_camera_height + slide_camera_offset
# Zastosowanie przyspieszenia
var current_speed = Vector3(velocity.x, 0, velocity.z).length()
var boost = max(speed * slide_speed_multiplier, current_speed)
velocity = velocity.normalized() * boost
func end_slide():
is_sliding = false
# Przywrócenie oryginalnego collidera
var shape = collision_shape.shape.duplicate()
shape.height = original_height
collision_shape.shape = shape
collision_shape.position.y = original_height / 2 # Środek geometryczny
print("po: ", original_height)
# Przywrócenie kamery
camera.position.y = original_camera_height
print("przywrocono kamere do pozycji: ", original_camera_height)
# Sprawdzenie przestrzeni nad głową
var space_check = get_world_3d().direct_space_state
var query = PhysicsRayQueryParameters3D.create(
global_position + Vector3.UP * 0.1, # Offset od podłogi
global_position + Vector3.UP * original_height,
0xFFFFFFFF # Maska kolizji
)
if not space_check.intersect_ray(query):
velocity.y = 0 # Reset prędkości Y
move_and_collide(Vector3.UP * 0.2) # Delikatne podniesienie
func _unhandled_input(event):
if event.is_action_pressed(“ui_cancel”):
get_tree().quit()
Could you help me fix this code?
`