Advanced character movement
Fri Feb 09 2024 22:36:16 GMT+0000 (Coordinated Universal Time)
Saved by @azariel
extends CharacterBody3D
@onready var nek = $nek
@onready var head = $nek/head
@onready var standing_collison_shape = $standing_collison_shape
@onready var crouching_collison_shape = $crouching_collison_shape
@onready var ray_cast_3d = $RayCast3D
@onready var camera_3d = $nek/head/Camera3D
var current_speed = 5.0
const walking_speed = 5.0
const sprinting_speed = 8.0
const crouching_speed = 3.0
const jump_velocity = 4.5
const mouse_sens = 0.089
var lerp_speed = 10.0
var free_look_tilt_amount = 8
var direction = Vector3.ZERO
var crouching_depth = -0.5
var walking = false
var sprinting = false
var crouching = false
var free_looking = false
var sliding = false
var slide_timer = 0.0
var slide_timer_max = 1.0
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _input(event):
if event is InputEventMouseMotion:
if free_looking:
nek.rotate_y(deg_to_rad(-event.relative.x * mouse_sens))
nek.rotation.y = clamp(nek.rotation.y,deg_to_rad(-60),deg_to_rad(60))
else:
rotate_y(deg_to_rad(-event.relative.x * mouse_sens))
head.rotate_x(deg_to_rad(-event.relative.y * mouse_sens))
head.rotation.x = clamp(head.rotation.x,deg_to_rad(-89),deg_to_rad(89))
func _physics_process(delta):
var input_dir = Input.get_vector("left", "right", "forward", "backward")
if Input.is_action_pressed("crouch"):
current_speed = crouching_speed
head.position.y = lerp(head.position.y, crouching_depth,delta*lerp_speed)
standing_collison_shape.disabled = true
crouching_collison_shape.disabled = false
if sprinting:
sliding = true
slide_timer = slide_timer_max
walking = true
sprinting = false
crouching = false
elif !ray_cast_3d.is_colliding():
standing_collison_shape.disabled = false
crouching_collison_shape.disabled = true
head.position.y = lerp(head.position.y,0.0,delta*lerp_speed)
if Input.is_action_pressed("sprint"):
current_speed = sprinting_speed
walking = false
sprinting = true
crouching = false
else:
current_speed = walking_speed
walking = true
sprinting = false
crouching = false
#
if Input.is_action_pressed("free_look"):
free_looking = true
camera_3d.rotation.z = -deg_to_rad(nek.rotation.y*free_look_tilt_amount)
else:
free_looking = false
nek.rotation.y = lerp(nek.rotation.y,0.0,delta*lerp_speed)
camera_3d.rotation.z = lerp(camera_3d.rotation.y,0.0,delta*lerp_speed)
# Add the gravity.
if not is_on_floor():
velocity.y -= gravity * delta
# Handle jump.
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = jump_velocity
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
direction = lerp(direction,(transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized(),delta*lerp_speed)
if direction:
velocity.x = direction.x * current_speed
velocity.z = direction.z * current_speed
else:
velocity.x = move_toward(velocity.x, 0, current_speed)
velocity.z = move_toward(velocity.z, 0, current_speed)
move_and_slide()



Comments