40 lines
1.3 KiB
GDScript
40 lines
1.3 KiB
GDScript
extends CharacterBody3D
|
|
|
|
@export var acceleration: float = 10.0
|
|
@export var brake_intensity: float = 5.0
|
|
@export var rotation_speed: float = 1.5
|
|
@export var gravity: float = 9.8
|
|
@export var max_speed: float = 30.0
|
|
|
|
var current_speed: float = 0.0
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
# Apply gravity
|
|
if not is_on_floor():
|
|
velocity.y -= gravity * delta
|
|
|
|
# Get input direction
|
|
var input_forward = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
|
|
var input_rotation = Input.get_action_strength("turn_right") - Input.get_action_strength("turn_left")
|
|
|
|
# Handle rotation
|
|
if input_rotation != 0:
|
|
rotate_y(-input_rotation * rotation_speed * delta)
|
|
|
|
# Handle acceleration and braking
|
|
if input_forward > 0:
|
|
# Accelerate forward
|
|
current_speed = move_toward(current_speed, max_speed, acceleration * delta)
|
|
elif input_forward < 0:
|
|
# Accelerate backward
|
|
current_speed = move_toward(current_speed, -max_speed / 2, acceleration * delta)
|
|
else:
|
|
# No input, gradually slow down
|
|
current_speed = move_toward(current_speed, 0, brake_intensity * delta)
|
|
|
|
# Apply movement in the direction the vehicle is facing
|
|
var direction = -global_transform.basis.z
|
|
velocity.z = direction.x * current_speed
|
|
velocity.x = direction.z * current_speed
|
|
|
|
move_and_slide()
|