class_name PlayerMovement extends Node const TURN_SPEED = 30.0 const SPEED = 8.0 @export var player:CharacterBody3D var inputDir:Vector2 = Vector2.ZERO func canMove() -> bool: if PAUSE.isMovementPaused(): return false return true func _physics_process(delta:float) -> void: var cameraCurrent = get_viewport().get_camera_3d() if !cameraCurrent: return # Player movement var directionAdjusted = Vector3.ZERO if canMove(): # Use camera orientation for movement direction var cam_basis = cameraCurrent.global_transform.basis # Forward and right vectors, ignore vertical component var forward = -cam_basis.z forward.y = 0 forward = forward.normalized() var right = cam_basis.x right.y = 0 right = right.normalized() directionAdjusted = (forward * inputDir.y + right * inputDir.x).normalized() # Rotate player to face movement direction if moving if directionAdjusted.length() > 0.01: var targetRot = atan2(directionAdjusted.x, directionAdjusted.z) player.rotation.y = lerp_angle( player.rotation.y, targetRot, TURN_SPEED * delta ) # Apply gravity if not on floor if !player.is_on_floor(): player.velocity += PHYSICS.GRAVITY * delta # Set velocity and move player.velocity.x = directionAdjusted.x * SPEED player.velocity.z = directionAdjusted.z * SPEED player.move_and_slide()