Trouble Making Character Move With Camera

Trouble Making Character Move With Camera

Godot Version

4.3

Question

I have followed this tutorial: https://www.youtube.com/watch?v=-WuvOVqbsTk Help

And at the end when I want to make the character move with the camera, so when you are looking a certain direction and you press ‘W’ you go that direction you’re looking instead of the direction where you start. I followed the last part but I am still unsuccessful in it working.

Here is my code:


extends CharacterBody3D

@onready var neck := $neck
@onready var camera := $neck/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_accept") 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("move_left", "move_right", "move_forward", "move_backward")
	var direction = (neck.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()





func _input(event: InputEvent) -> void:
	if event is InputEventMouseButton:
		Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
	elif event.is_action_pressed("ui_cancel"):
		Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
		
	if Input.MOUSE_MODE_CAPTURED:
		if event is InputEventMouseMotion:
			neck.rotate_y(-event.relative.x*0.005)
			camera.rotate_y(-event.relative.x*0.005)
			camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-60), deg_to_rad(60))

Any ideas on how I can fix it?

i think this tutorial wants you to press the mouse_button to achieve this movement.
You can try this code:

func _input(event: InputEvent) -> void:
	if event is InputEventMouseMotion:
		neck.rotate_y(-event.relative.x*0.005)
		camera.rotate_y(-event.relative.x*0.005)
		camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-60), deg_to_rad(60))

I’m looking at this part:

	if Input.MOUSE_MODE_CAPTURED:
		if event is InputEventMouseMotion:
			neck.rotate_y(-event.relative.x*0.005)
			camera.rotate_y(-event.relative.x*0.005)

Why are you rotating both the neck and the camera around the Y axis? That should probably be only the neck.

You’re already using the neck’s basis for your movement, so that part should be fine.

1 Like

Not getting into specifics here, but there’s an awesome addon called PhantomCamera. Super detailed documentation as well as lots of customization. Works in both 2D and 3D. Figured I’d just mention it :slight_smile: