extends Camera3D @export_group("Movement") @export var move_speed: float = 10.0 @export var fast_move_multiplier: float = 3.0 @export var move_smoothing: float = 10.0 @export_group("Look") @export var mouse_sensitivity: float = 0.3 @export var invert_y: bool = false var _velocity: Vector3 = Vector3.ZERO var _yaw: float = 0.0 # Y rotation var _pitch: float = 0.0 # X rotation var _is_active: bool = false func _ready() -> void: #Current rotation _yaw = rotation_degrees.y _pitch = rotation_degrees.x func _unhandled_input(event: InputEvent) -> void: #Activate camera movement using mouse right button if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_RIGHT: _is_active = event.pressed Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if _is_active else Input.MOUSE_MODE_VISIBLE if event is InputEventMouseMotion and _is_active: _yaw -= event.relative.x * mouse_sensitivity var pitch_delta = event.relative.y * mouse_sensitivity _pitch += pitch_delta if invert_y else -pitch_delta _pitch = clamp(_pitch, -89.0, 89.0) if event.is_action_pressed("ui_cancel"): _is_active = false Input.mouse_mode = Input.MOUSE_MODE_VISIBLE func _physics_process(delta: float) -> void: rotation_degrees.y = _yaw rotation_degrees.x = _pitch if not _is_active: _velocity = _velocity.lerp(Vector3.ZERO, move_smoothing * delta) position += _velocity * delta return var input_dir := Vector3.ZERO if Input.is_key_pressed(KEY_W) or Input.is_key_pressed(KEY_UP): input_dir -= basis.z # avanti if Input.is_key_pressed(KEY_S) or Input.is_key_pressed(KEY_DOWN): input_dir += basis.z # indietro if Input.is_key_pressed(KEY_A) or Input.is_key_pressed(KEY_LEFT): input_dir -= basis.x # sinistra if Input.is_key_pressed(KEY_D) or Input.is_key_pressed(KEY_RIGHT): input_dir += basis.x # destra if Input.is_key_pressed(KEY_E) or Input.is_key_pressed(KEY_PAGEUP): input_dir += Vector3.UP # su (world space) if Input.is_key_pressed(KEY_Q) or Input.is_key_pressed(KEY_PAGEDOWN): input_dir += Vector3.DOWN # giù (world space) if input_dir != Vector3.ZERO: input_dir = input_dir.normalized() var speed := move_speed * fast_move_multiplier if Input.is_key_pressed(KEY_SHIFT) else move_speed var target_velocity := input_dir * speed _velocity = _velocity.lerp(target_velocity, move_smoothing * delta) position += _velocity * delta