extends RigidBody signal rover_exit_level const EPSILON = 0.0001 const SPEED = 300.0 const TURN = 2.5 var heading := Vector3.BACK func _physics_process(delta): var input = Vector3(Input.get_axis("right", "left"), 0.0, Input.get_axis("down", "up")) if input.length_squared() > EPSILON: $visual/BeetleIX.drive() else: $visual/BeetleIX.idle() heading = heading.rotated(Vector3.UP, input.x * TURN * delta).normalized() $visual.global_transform = $visual.global_transform.looking_at($visual.global_transform.origin + heading, Vector3.UP) func _integrate_forces(state): add_central_force(Input.get_axis("down", "up") * heading * SPEED) var c_mag = heading.cross(linear_velocity).y var c = Vector3.UP.cross(heading).normalized() * c_mag add_central_force(c * 1.0) func _unhandled_input(event): if event.is_action_pressed("action"): for area in $"%interact_box".get_overlapping_areas(): if area.has_meta("owner"): area = area.get_meta("owner") if area.on_rover_interact(self): break func _on_exit_interact_box_area_entered(area): emit_signal("rover_exit_level")