Godot Version
4.2.2
Question
So I’m trying to recode my fps controller through composition to try make it more modular. However, for the camera movement I’m having issues. The camera input is correctly being moved to the movement component through signals, however the speed at which the camera rotates on the x axis is extremely slow. For rotating on the y axis I’m just rotating the player itself rather than the camera, however for this the player rotates extremely fast.
I used this method of rotation previously and it was working okay, this was when everything was in one script.
InputComponent.gd:
class_name InputComponent extends Node
signal movement(movement_input: Vector2)
signal camera_movement(mouse_delta: Vector2)
@export var MouseSensitivity: float = 2.0
func _ready():
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
func _input(event):
if event.is_action_pressed("exit"):
get_tree().quit()
var movement_input = Input.get_vector("movement_left", "movement_right", "movement_forward", "movement_back")
emit_signal("movement", movement_input)
func _unhandled_input(event):
var mouse_input = event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED
if mouse_input:
var mouse_delta = -event.relative
emit_signal("camera_movement", mouse_delta)
MovementComponent.gd:
extends Node
@export_category("Components")
@export var Camera: Camera3D
@export var CharacterController: CharacterBody3D
@export var InputReceiver: InputComponent:
set(value):
InputReceiver = value
InputReceiver.movement.connect(on_movement_input)
InputReceiver.camera_movement.connect(on_camera_movement)
@export_category("Movement Settings")
@export var MovementSpeed: float = 5.0
@export var CameraPitchMin: float = -90
@export var CameraPitchMax: float = 90
var movement_direction: Vector3 = Vector3.ZERO
var mouse_rotation: Vector3 = Vector3.ZERO
var player_rotation: Vector3 = Vector3.ZERO
var camera_rotation: Vector3 = Vector3.ZERO
var mouse_delta_input: Vector2 = Vector2.ZERO
func on_movement_input(movement_input: Vector2) -> void:
movement_direction = (CharacterController.transform.basis * Vector3(movement_input.x, 0, movement_input.y)).normalized()
var vel = Vector2(movement_direction.x, movement_direction.z)
func on_camera_movement(mouse_delta: Vector2) -> void:
var delta = get_process_delta_time()
mouse_rotation.x += mouse_delta.y * delta
mouse_rotation.y += mouse_delta.x * delta
mouse_rotation.x = clamp(mouse_rotation.x, CameraPitchMin, CameraPitchMax)
func _physics_process(delta):
if CharacterController == null:
push_warning("CharacterController component is not set!")
return
if Camera == null:
push_warning("Camera component is not set!")
return
player_rotation = Vector3(0, mouse_rotation.y, 0)
camera_rotation = Vector3(mouse_rotation.x, 0, 0)
camera_rotation *= delta
Camera.transform.basis = Basis.from_euler(camera_rotation)
Camera.rotation.z = 0
# Rotate the player
CharacterController.transform.basis = Basis.from_euler(player_rotation)
mouse_delta_input = Vector2.ZERO
if movement_direction:
CharacterController.velocity.x = movement_direction.x * MovementSpeed
CharacterController.velocity.z = movement_direction.z * MovementSpeed
else:
CharacterController.velocity.x = 0
CharacterController.velocity.z = 0
CharacterController.move_and_slide()
Any help on this is greatly appreciated