extends KinematicBody const MAX_ANGULAR_VELOCITY = deg2rad(135.0) # rad/s const MAX_VELOCITY = 600.0 # m/s export var camera_relative_controls: bool = false func process_player_relative_controls(delta: float): rotate_y(Input.get_axis("right", "left") * MAX_ANGULAR_VELOCITY * delta) var movement_input = Vector3(0.0, 0.0, Input.get_axis("up", "down")) move_and_slide(transform.basis.xform(movement_input) * MAX_VELOCITY * delta) update_audio(movement_input.length_squared() > 0.1) func process_camera_relative_controls(delta: float): var screen_input = Vector3(Input.get_axis("left", "right"), Input.get_axis("down", "up"), 0.0) var world_input = get_viewport().get_camera().global_transform.basis.xform(screen_input) var movement_input = world_input - world_input.project(global_transform.basis.y) look_at(global_transform.origin + movement_input, Vector3(0.0, 1.0, 0.0)) move_and_slide(movement_input.normalized() * MAX_VELOCITY * delta) update_audio(movement_input.length_squared() > 0.1) func _physics_process(delta): if camera_relative_controls: process_camera_relative_controls(delta) else: process_player_relative_controls(delta) func update_audio(is_moving: bool): if is_moving != $AudioStreamPlayer.playing: $AudioStreamPlayer.playing = is_moving func _on_HitBox_area_entered(area: Area): if area.is_in_group("pickup"): area.queue_free()