class_name PlayerMovement extends RefCounted @export var _move_speed: float = 8 @export var _move_acceleration: float = 100 @export var _move_deceleration: float = 50 @export var _fall_speed: float = 20 @export var _fall_acceleration: float = 25 var move_input: Vector2 var _move_direction: Vector3 func movement( velocity: Vector3, delta: float, is_on_floor: bool, can_move: bool ) -> Vector3: velocity = _lateral_movement(velocity, delta, can_move) velocity = _vertical_movement(velocity, delta, is_on_floor) return velocity func _lateral_movement(velocity: Vector3, delta: float, can_move: bool) -> Vector3: move_input = Input.get_vector("move_left", "move_right", "move_up", "move_down") if move_input.length() > 0 and can_move: _move_direction = Vector3(move_input.x, 0, move_input.y).normalized().rotated( Vector3.UP, Referencer.main_camera.rotation.y ) var new_velocity := _move_direction * _move_speed new_velocity.y = velocity.y velocity = velocity.move_toward(new_velocity, _move_acceleration * delta) else: var new_velocity := Vector3.ZERO new_velocity.y = velocity.y velocity = velocity.move_toward(new_velocity, _move_deceleration * delta) return velocity func _vertical_movement(velocity: Vector3, delta: float, is_on_floor: bool) -> Vector3: if not is_on_floor: var new_velocity := velocity new_velocity.y = -_fall_speed velocity = velocity.move_toward(new_velocity, _fall_acceleration * delta) else: velocity.y = 0 return velocity