## Free-look camera controller for the test scene. ## WASD to move, mouse drag (right-click) to look around, scroll to change speed. extends Camera3D @export_group("Movement") @export var move_speed: float = 20.0 @export var fast_multiplier: float = 3.0 @export var smooth_factor: float = 10.0 @export_group("Mouse Look") @export var mouse_sensitivity: float = 0.003 @export var pitch_limit: float = 89.0 var _yaw: float = 0.0 var _pitch: float = 0.0 var _looking: bool = false var _velocity: Vector3 = Vector3.ZERO func _ready() -> void: var euler := rotation _yaw = euler.y _pitch = euler.x func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseButton: var mb := event as InputEventMouseButton if mb.button_index == MOUSE_BUTTON_RIGHT: _looking = mb.pressed Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if _looking else Input.MOUSE_MODE_VISIBLE if mb.button_index == MOUSE_BUTTON_WHEEL_UP: move_speed = minf(move_speed * 1.2, 500.0) if mb.button_index == MOUSE_BUTTON_WHEEL_DOWN: move_speed = maxf(move_speed / 1.2, 1.0) if event is InputEventMouseMotion and _looking: var motion := event as InputEventMouseMotion _yaw -= motion.relative.x * mouse_sensitivity _pitch -= motion.relative.y * mouse_sensitivity _pitch = clampf(_pitch, deg_to_rad(-pitch_limit), deg_to_rad(pitch_limit)) func _process(delta: float) -> void: rotation = Vector3(_pitch, _yaw, 0.0) var input_dir := Vector3.ZERO if Input.is_physical_key_pressed(KEY_W): input_dir.z -= 1.0 if Input.is_physical_key_pressed(KEY_S): input_dir.z += 1.0 if Input.is_physical_key_pressed(KEY_A): input_dir.x -= 1.0 if Input.is_physical_key_pressed(KEY_D): input_dir.x += 1.0 if Input.is_physical_key_pressed(KEY_E) or Input.is_physical_key_pressed(KEY_SPACE): input_dir.y += 1.0 if Input.is_physical_key_pressed(KEY_Q) or Input.is_physical_key_pressed(KEY_CTRL): input_dir.y -= 1.0 input_dir = input_dir.normalized() var speed := move_speed if Input.is_physical_key_pressed(KEY_SHIFT): speed *= fast_multiplier var target_velocity := (global_transform.basis * input_dir) * speed _velocity = _velocity.lerp(target_velocity, clampf(smooth_factor * delta, 0.0, 1.0)) global_position += _velocity * delta