generated from Persson-dev/Godot-Xmake
64 lines
2.2 KiB
GDScript
64 lines
2.2 KiB
GDScript
extends CharacterBody3D
|
|
|
|
const LERP_VALUE : float = 0.15
|
|
|
|
var snap_vector : Vector3 = Vector3.DOWN
|
|
var speed : float
|
|
|
|
@export_group("Movement variables")
|
|
@export var walk_speed : float = 2.0
|
|
@export var run_speed : float = 5.0
|
|
@export var jump_strength : float = 15.0
|
|
@export var gravity : float = 50.0
|
|
|
|
const ANIMATION_BLEND : float = 7.0
|
|
|
|
@onready var player_mesh : Node3D = $Mesh
|
|
@onready var spring_arm_pivot : Node3D = $SpringArmPivot
|
|
@onready var animator : AnimationTree = $AnimationTree
|
|
|
|
func _physics_process(delta):
|
|
var move_direction : Vector3 = Vector3.ZERO
|
|
move_direction.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
|
move_direction.z = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forwards")
|
|
move_direction = move_direction.rotated(Vector3.UP, spring_arm_pivot.rotation.y)
|
|
|
|
velocity.y -= gravity * delta
|
|
|
|
if Input.is_action_pressed("run"):
|
|
speed = run_speed
|
|
else:
|
|
speed = walk_speed
|
|
|
|
velocity.x = move_direction.x * speed
|
|
velocity.z = move_direction.z * speed
|
|
|
|
if move_direction:
|
|
player_mesh.rotation.y = lerp_angle(player_mesh.rotation.y, atan2(velocity.x, velocity.z), LERP_VALUE)
|
|
|
|
var just_landed := is_on_floor() and snap_vector == Vector3.ZERO
|
|
var is_jumping := is_on_floor() and Input.is_action_just_pressed("jump")
|
|
if is_jumping:
|
|
velocity.y = jump_strength
|
|
snap_vector = Vector3.ZERO
|
|
elif just_landed:
|
|
snap_vector = Vector3.DOWN
|
|
|
|
apply_floor_snap()
|
|
move_and_slide()
|
|
animate(delta)
|
|
|
|
func animate(delta):
|
|
if is_on_floor():
|
|
animator.set("parameters/ground_air_transition/transition_request", "grounded")
|
|
|
|
if velocity.length() > 0:
|
|
if speed == run_speed:
|
|
animator.set("parameters/iwr_blend/blend_amount", lerp(animator.get("parameters/iwr_blend/blend_amount"), 1.0, delta * ANIMATION_BLEND))
|
|
else:
|
|
animator.set("parameters/iwr_blend/blend_amount", lerp(animator.get("parameters/iwr_blend/blend_amount"), 0.0, delta * ANIMATION_BLEND))
|
|
else:
|
|
animator.set("parameters/iwr_blend/blend_amount", lerp(animator.get("parameters/iwr_blend/blend_amount"), -1.0, delta * ANIMATION_BLEND))
|
|
else:
|
|
animator.set("parameters/ground_air_transition/transition_request", "air")
|