class_name Player extends CharacterBody3D # class variables @export_category("Movement") @export var _walk_speed := 5.0 @export var _jump_speed := 9.0 @export var _fall_speed := 2.0 @export var _locked_z := true @export_category("Camera") @export var _camera_distance := 5.0 @export var _dof_blur_far_distance := 5.0 @export var _camera_pivot_rotate_y := 0.0 var _last_movement_direction := Vector3.RIGHT @onready var _skin: KnightSkin = $skin @onready var _camera_pivot: Node3D = $"camera-pivot" @onready var _spring_arm: SpringArm3D = $"camera-pivot/SpringArm3D" @onready var _camera: Camera3D = $"camera-pivot/SpringArm3D/Camera3D" @onready var _camera_attr: CameraAttributes = _camera.attributes # inherited functions func _ready() -> void: _spring_arm.spring_length = _camera_distance _camera_attr.dof_blur_far_distance = _dof_blur_far_distance _camera_pivot.rotate_y(_camera_pivot_rotate_y) func _input(event: InputEvent) -> void: if event.is_action_released("player-jump"): if velocity.y > 0: velocity.y = 0 elif event.is_action_pressed("player-attack"): _skin.attack() func _physics_process(delta: float) -> void: # Add the gravity. if not is_on_floor(): velocity += get_gravity() * _fall_speed * delta _process_player_input(delta) _process_player_skin(delta) move_and_slide() # my functions func _process_player_input(_delta: float) -> void: # Handle jump. if Input.is_action_just_pressed("player-jump") and is_on_floor(): velocity.y = _jump_speed # Get the input direction and handle the movement/deceleration. # As good practice, you should replace UI actions with custom gameplay actions. var input_dir := Input.get_vector("player-left", "player-right", "player-up", "player-down") var direction := -(transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: velocity.x = direction.x * _walk_speed if not _locked_z: velocity.z = direction.z * _walk_speed _last_movement_direction = direction else: velocity.x = 0 velocity.z = 0 func _process_player_skin(_delta: float) -> void: _skin.global_rotation.y = Vector3.BACK.signed_angle_to(_last_movement_direction, Vector3.UP) if is_on_floor(): _skin.move(velocity.length()) else: _skin.fall()