Mostrando entradas con la etiqueta Maravilloso GDScript para manejar una camara fija en Godot 4.7 ; en 3d;. Mostrar todas las entradas
Mostrando entradas con la etiqueta Maravilloso GDScript para manejar una camara fija en Godot 4.7 ; en 3d;. Mostrar todas las entradas

martes, 27 de octubre de 2026

Maravilloso GDScript para manejar una camara fija en Godot 4.7 ; en 3d;

 extends Camera3D


@export_group("Movimiento y Cámara")

@export var speed: float = 5.0

@export var mouse_sensitivity: float = 0.003


@export_group("Zoom / Enfoque (Rueda del Ratón)")

@export var zoom_speed: float = 3.0

@export var min_fov: float = 10.0   # Enfoque máximo (teleobjetivo)

@export var max_fov: float = 120.0   # Enfoque mínimo (gran angular)


@export_group("Límites de Desplazamiento (Metros)")

@export var limit_forward: float = 10.0    # Máximo W (Adelante)

@export var limit_backward: float = 5.0    # Máximo S (Atrás)

@export var limit_left: float = 8.0        # Máximo A (Izquierda)

@export var limit_right: float = 8.0       # Máximo D (Derecha)


var rotation_x: float = 0.0

var start_position: Vector3


func _ready() -> void:

Input.mouse_mode = Input.MOUSE_MODE_CAPTURED

start_position = global_position


func _unhandled_input(event: InputEvent) -> void:

if event.is_action_pressed("ui_cancel") or (event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE):

get_tree().quit()


# Control de la vista con el movimiento del ratón

if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:

rotate_y(-event.relative.x * mouse_sensitivity)

rotation_x -= event.relative.y * mouse_sensitivity

rotation_x = clamp(rotation_x, deg_to_rad(-89.0), deg_to_rad(89.0))

rotation.x = rotation_x


# Control del zoom / enfoque con la rueda del ratón

if event is InputEventMouseButton and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:

if event.pressed:

if event.button_index == MOUSE_BUTTON_WHEEL_UP:

fov = clamp(fov - zoom_speed, min_fov, max_fov)

elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:

fov = clamp(fov + zoom_speed, min_fov, max_fov)


func _process(delta: float) -> void:

var input_dir := Vector3.ZERO


if Input.is_key_pressed(KEY_W):

input_dir.z -= 1  # W: Adelante

if Input.is_key_pressed(KEY_S):

input_dir.z += 1  # S: Atrás

if Input.is_key_pressed(KEY_A):

input_dir.x -= 1  # A: Izquierda

if Input.is_key_pressed(KEY_D):

input_dir.x += 1  # D: Derecha


if input_dir != Vector3.ZERO:

input_dir = input_dir.normalized()


# Movemos en el plano horizontal para no volar al mirar arriba/abajo

var forward := -global_transform.basis.z

forward.y = 0

forward = forward.normalized()


var right := global_transform.basis.x

right.y = 0

right = right.normalized()


# Calculamos el intento de movimiento

var movement := (right * input_dir.x + forward * -input_dir.z) * speed * delta

var target_position := global_position + movement


# Medimos la distancia acumulada desde el origen

var offset := target_position - start_position


# Aplicamos los 4 límites independientes (W, S, A, D)

offset.x = clamp(offset.x, -limit_left, limit_right)

offset.z = clamp(offset.z, -limit_forward, limit_backward)


# Asignamos la posición corregida manteniendo la altura fija (Y)

global_position = Vector3(start_position.x + offset.x, start_position.y, start_position.z + offset.z)



-------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------

Explicacion, caracteristicas: Enfoque  desde rueda del mouse, giros de 360 grador en eje -y- limitaciones de avance por escenario , con teclas -w-a-s-d-.....todo calibrado desde el inspector.