generated from Persson-dev/Godot-Xmake
third persson prototype
This commit is contained in:
63
godot/Scripts/Characters/Player.gd
Normal file
63
godot/Scripts/Characters/Player.gd
Normal file
@@ -0,0 +1,63 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user