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"):
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; GDSscript para Godot 4.6.3; maneja al CharacterBody3D para que camine y si dispara se detenga; El problema que tenia era que cuando disparaba y estaba con los pies quietos el personaje del juego seguia avanzando, este GDS resuelve que al presionar el disparo automaticamente aunque este presionada la tecla de avanzar la "W" el personaje se para en su sitio.....y si sueltas la tecla del boton derecho del mouse, automaticamente anda y avanza al estar presionada claro la tecla "W" de avanzar y animacion caminar, estre gds esta combinado con otro de animaciones exclusivas del personaje,,,,,,es bastante lioso combinar varios conceptos, yo me ayudo de la IA si no no podria ni hacer ni entender......