extends CharacterBody3D
var rotate_speed = 0.001
@export var SPEED: float = 3.0 # Velocidad normal de caminar
const RUN_SPEED = 10.0 # Velocidad más alta para correr
const JUMP_VELOCITY = 2.5
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
# --- NUEVAS VARIABLES PARA EL GIRO SUAVE ---
var velocidad_giro_actual = 0.0
@export var velocidad_maxima_giro: float = 0.35
var suavizado_giro = 0.01
# -------------------------------------------
func _ready():
pass
func _physics_process(delta):
# 1. GRAVEDAD: Siempre activa si no tocamos el suelo
if not is_on_floor():
velocity.y -= gravity * delta
# 2. EL SALTO: Ahora usa tu acción "SALTA" (la barra espaciadora)
# Solo se activa un golpe por pulsación y exige estar tocando el suelo
if Input.is_action_just_pressed("SALTA") and is_on_floor():
velocity.y = JUMP_VELOCITY
# Lógica de movimiento normal
var current_speed = SPEED
var direction = Vector3.ZERO
# 3. CALCULAMOS DIRECCIÓN Y VELOCIDAD SEGÚN ENTRADAS
if Input.is_action_pressed("CORRECACA"):
direction = -transform.basis.z
current_speed = RUN_SPEED
else:
# Nota: Usamos solo el eje vertical (Y) del vector para caminar adelante/atrás
var input_dir = Input.get_vector("GIRAIZQUIERDACONA", "GIRADERECHACOND", "ANDAATRASCONS", "ANDAALANTECONW")
direction = (transform.basis * Vector3(0, 0, input_dir.y)).normalized()
current_speed = SPEED
# 4. EL FILTRO DE SEGURIDAD ABSOLUTO (¡Tu lógica!)
if (Input.is_action_pressed("ANDAALANTECONW") or Input.is_action_pressed("ANDAATRASCONS") or Input.is_action_pressed("SALTA")) and (Input.is_action_pressed("mouse_right") or Input.is_action_pressed("mouse_left")):
# Frenazo en seco en el plano horizontal (X, Z), pero permitimos que la Y siga su curso
velocity.x = 0.0
velocity.z = 0.0
else:
# Si no se cumple la combinación, aplicamos el movimiento normal por el suelo
if direction:
velocity.x = direction.x * current_speed
velocity.z = direction.z * current_speed
else:
velocity.x = move_toward(velocity.x, 0, current_speed)
velocity.z = move_toward(velocity.z, 0, current_speed)
# 5. MOVER EL CUERPO (Aplica X, Y y Z de golpe)
move_and_slide()
# --- 6. LÓGICA DE GIRO SUAVE ---
var direccion_giro = 0.0
if Input.is_action_pressed("GIRAIZQUIERDACONA"):
direccion_giro += 0.5
if Input.is_action_pressed("GIRADERECHACOND"):
direccion_giro -= 0.5
# Calculamos el objetivo y suavizamos la velocidad de la rotación
var objetivo = direccion_giro * velocidad_maxima_giro
velocidad_giro_actual = lerp(velocidad_giro_actual, objetivo, suavizado_giro)
# Aplicamos la rotación suave en el eje Y
rotate_y(velocidad_giro_actual)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Explicacion: perfilando mejorando de forma realista los movimientos de un CharacterBody3D antes al saltar el personaje, se apoyaba en el mismo aire y saltaba mas hacia arriba sin ninguna base, eso no tiene sentido, aqui ya no lo hace.......