kk! Sorry abt that, I’m very new to this. Here’s the full code so far
extends CharacterBody3D
@export var look_sensitivity : float = 0.0009
@export var jump_velocity : = 6.0
var speedometer := 0
@export var walk_speed := 10
@export var ground_accel := 14.0
@export var ground_decel := 10.0
@export var ground_friction := 6
@export var display_groundspeed := 0
@export var air_cap := 5
@export var air_accel := 30
@export var air_move_speed := 20.0
@export var display_airspeed := 0
var wish_dir := Vector3.ZERO
func get_move_speed() → float:
return walk_speed
#This used to check if you’re running or walking, then return the run or walk speed depending on which. Update this to just return the walk speed instead of using the get move speed
func _ready():
speedometer = get_tree().get_first_node_in_group(“Speedometer”)
func _handle_air_physics(delta) → void:
self.velocity.y -= ProjectSettings.get_setting(“physics/3d/default_gravity”) * delta
var cur_speed_in_wish_dir = self.velocity.dot(wish_dir)
var capped_speed = min((air_move_speed * wish_dir).length(), air_cap)
var add_speed_till_cap = capped_speed - cur_speed_in_wish_dir
if add_speed_till_cap > 0:
var accel_speed = air_accel * air_move_speed * delta
accel_speed = min(accel_speed, add_speed_till_cap)
self.velocity += accel_speed * wish_dir / 2
var display_airspeed = snapped(accel_speed, 0.01)
print(display_airspeed * 100)
speedometer.text = str("Speed: ", display_airspeed)
func _handle_ground_physics(delta) → void:
var cur_speed_in_wish_dir = self.velocity.dot(wish_dir)
var add_speed_till_cap = get_move_speed() - cur_speed_in_wish_dir
if add_speed_till_cap > 0:
var accel_speed = ground_accel * delta * get_move_speed()
accel_speed = min(accel_speed, add_speed_till_cap)
self.velocity += accel_speed * wish_dir
var control = max(self.velocity.length(), ground_decel)
var drop = control * ground_friction * delta
var new_speed = max(self.velocity.length() - drop, 0.0)
if self.velocity.length() > 0:
new_speed /= self.velocity.length()
self.velocity *= new_speed
var display_groundspeed = snapped(new_speed, 0.01)
print(display_groundspeed * 100)
func _unhandled_input(event):
if event is InputEventMouseButton:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
elif event.is_action_pressed(“ui_concel”):
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
if event is InputEventMouseMotion:
rotate_y(-event.relative.x * look_sensitivity)
$Head.rotate_x(-event.relative.y * look_sensitivity)
$Head.rotation.x = clamp($Head.rotation.x, deg_to_rad(-90), deg_to_rad(90))
func _physics_process(delta):
var input_dir = Input.get_vector(“right”, “left”, “down”, “up”).normalized()
wish_dir = self.global_transform.basis * Vector3(-input_dir.x, 0., -input_dir.y)
if Input.is_action_just_pressed("Escape"):
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
if is_on_floor():
if Input.is_action_just_pressed("jump"):
self.velocity.y = jump_velocity
_handle_ground_physics(delta)
else:
_handle_air_physics(delta)
move_and_slide()
func _process(delta):
pass