extends CharacterBody3D
var rotate_speed = 0.001
@export var SPEED: float = 3.0 # Velocidad normal de caminar
#const SPEED = 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 velocidad_maxima_giro = 0.35
var suavizado_giro = 0.01
# -------------------------------------------
func _ready():
pass
func _physics_process(delta):
# Gravedad, siempre activa
if not is_on_floor():
velocity.y -= gravity * delta
# El salto se activa al mantener pulsado
if Input.is_action_pressed("ui_accept"):
velocity.y = JUMP_VELOCITY
# Lógica de movimiento normal
var current_speed = SPEED
var direction = Vector3.ZERO
# 1. Calculamos la dirección como si todo funcionara normal
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
# 2. EL FILTRO DE SEGURIDAD ABSOLUTO:
# Si en este preciso instante están las dos pulsadas, anulamos la velocidad inmediatamente
#if Input.is_action_pressed("ANDAALANTECONW") and Input.is_action_pressed("mouse_right"):
if Input.is_action_pressed("ANDAALANTECONW") and (Input.is_action_pressed("mouse_right") or Input.is_action_pressed("mouse_left")):
velocity.x = 0.0
velocity.z = 0.0
else:
# Si no se cumple la combinación, aplicamos el movimiento que calculamos antes
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)
move_and_slide()
# --- 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
var objetivo = direccion_giro * velocidad_maxima_giro
velocidad_giro_actual = lerp(velocidad_giro_actual, objetivo, suavizado_giro)
# Aplicamos la rotación suave
rotate_y(velocidad_giro_actual)
-----------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
Explicacion: Este GDScript, funciona muy bien alternando al disparar o al lanzar granadas el personaje, que no se mueva de su sitio con los pies quietos, un error que quedaba muy feo y este GDS lo resuelve; Tenia el problema que si presionaba -w-w que es para avanzar y caminar el personaje avanzaba de todas formas si estaba disparando con los pies parados o si lanzaba bomba de mano con los pies parados......