extends Node3D @export_range(0.0, 1.0) var sensitivity: float = 0.25 # Mouse state var _mouse_position = Vector2(0.0, 0.0) var _total_pitch = 0.0 var _vel_multiplier = 4 func _input(event): # Receives mouse motion if event is InputEventMouseMotion: _mouse_position = event.relative # Receives mouse button input if event is InputEventMouseButton: match event.button_index: MOUSE_BUTTON_RIGHT: # Only allows rotation if right click down Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED if event.pressed else Input.MOUSE_MODE_VISIBLE) MOUSE_BUTTON_WHEEL_UP: # Increases max velocity _vel_multiplier = clamp(_vel_multiplier * 1.1, 0.2, 20) MOUSE_BUTTON_WHEEL_DOWN: # Decereases max velocity _vel_multiplier = clamp(_vel_multiplier / 1.1, 0.2, 20) # Updates mouselook and movement every frame func _process(_update): _update_mouselook() func _update_mouselook(): # Only rotates mouse if the mouse is captured if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: _mouse_position *= sensitivity var yaw = _mouse_position.x var pitch = _mouse_position.y _mouse_position = Vector2(0, 0) # Prevents looking up/down too far pitch = clamp(pitch, -20 - _total_pitch, 60 - _total_pitch) _total_pitch += pitch rotate_y(deg_to_rad(-yaw)) rotate_object_local(Vector3(1,0,0), deg_to_rad(-pitch))