Mouse not moving

Godot Version

Godot 4.5.1 (Steam)

Question

The mouse should move the camera, what am I doing wrong?

extends CharacterBody3D


@onready var head = $Head
@onready var camera = $Head/Camera3D
const SPEED = 5.0
const JUMP_VELOCITY = 4.5



func _physics_process(delta: float) -> void:
	# Add the gravity.
	if not is_on_floor():
		velocity += get_gravity() * delta

	# Handle jump.
	if Input.is_action_just_pressed("ui_jump") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	# Get the input direction and handle the movement/deceleration.
	# As good practice, you should replace UI actions with custom gameplay actions.
	var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
	var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
	if direction:
		velocity.x = direction.x * SPEED
		velocity.z = direction.z * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)
		velocity.z = move_toward(velocity.z, 0, SPEED)

	move_and_slide()

var mouse_sensitivity = 0.002
var mouse_look_sensitivity = 0.002
var camera_pitch = 0.0
const CAMERA_PITCH_MIN = deg_to_rad(-80.0) 
const CAMERA_PITCH_MAX = deg_to_rad(80.0)

func _ready():
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
	
func _unhandled_input(event):
	if event is InputEventMouseMotion:
		rotate_y(-event.relative.x * mouse_look_sensitivity)

		# Pitch (Rotate the Camera/X-axis)
		camera_pitch -= event.relative.y * mouse_sensitivity
		camera_pitch = clamp(camera_pitch, CAMERA_PITCH_MIN, CAMERA_PITCH_MAX)
		camera.rotation.x = camera_pitch

the only thing wrong with this (other than the lack of static typing) is that you are changing camera_pitch and then assigning it, and that it happens in _unhanded_input.

here’s what working code looks like:


func _unhandled_input(event: InputEvent) -> void:
	if event is InputEventMouseMotion:
		rotate_y(-event.relative.x * look_speed.x)
		v_cam.rotate_x(-event.relative.y * look_speed.y)

func _physics_process(delta: float) -> void:
	v_cam.rotation.x = clampf(v_cam.rotation.x, v_limit.y, v_limit.x)

if it’s not the code, you should check your Controls (UI elements) and make sure they are set to pass.
unhandled_input only works with input that has not been handled by UI, so an invisible Control can capture the input, preventing it from reaching the 3D.

It gives me an error about “v_cam” and v_limit. Must be the variables/identifiers, right?

For your code:

func _unhandled_input(event: InputEvent) -> void:
	if event is not InputEventMouseMotion:
		return

	rotate_y(-event.relative.x * mouse_look_sensitivity)
	camera.rotate_x(-event.relative.y * mouse_look_sensitivity)


func _physics_process(delta: float) -> void:
	camera.rotation.x = clampf(camera.rotation.x, CAMERA_PITCH_MIN, CAMERA_PITCH_MAX)

yes, I copied my code to show you. what matters is the order in which it happens.
but I would look at your UI (if you have one) as that could also be the problem.

it says “unreachable_code”

And it’s not working