leaning into different run directions in a 3D space.

4.5.1

I am trying to implement a lean into my run animation?

So far it is still not leaning,the running animation and all others I have set so far still function. I have set up my animation tree correctly as far as i can tell but I am just getting an abrupt snap to the direction your moving and not that smooth lean I am looking for.

This is my current script for my character and my animation tree for said character.

extends CharacterBody3D
@onready var anim_player: AnimationPlayer = $Mesh/AnimationPlayer

@export var speed = 10.0
const JUMP_VELOCITY = 5
@onready var camera: Node3D = $CameraRig/Camera3D
@onready var anim_tree: AnimationTree = $AnimationTree
var last_lean := 0.0

func _physics_process(delta: float) -> void:

	#Add the gravity.
	if not is_on_floor():
		velocity += get_gravity() * delta

	#Handle jump.
	if Input.is_action_just_pressed("jump") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	#Handle movement in 2 planes
	var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
	var direction := (camera.global_basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
	direction = Vector3(direction.x, 0, direction.z).normalized() * input_dir.length()
	if direction:
		velocity.x = direction.x * speed
		velocity.z = direction.z * speed
	else:
		velocity.x = move_toward(velocity.x, 0, speed)
		velocity.z = move_toward(velocity.z, 0, speed)

	move_and_slide()
	turn_to(direction)
	
	
	var current_speed := velocity.length()
	const RUN_SPEED := 3.5
	#const BLEND_SPEED := 0.2
		
	if not is_on_floor() and velocity.y < 0:
		anim_tree.set("parameters/movement/transition_request", "fall")
	else: 
		anim_tree.set("parameters/movement/transition_request", "jump_start")
	

	if current_speed > RUN_SPEED and is_on_floor():
		anim_tree.set("parameters/movement/transition_request", "run")
		var lean := direction.dot(global_basis.x)
		last_lean = lerpf(last_lean, lean, 0.3)
		anim_tree.set("parameters/run_lean/add_mount", lean)
	elif current_speed > 0 and is_on_floor():
		anim_tree.set("parameters/movement/transition_request", "walk")
		var walk_speed := lerpf(0.5,1.75,current_speed / RUN_SPEED)
		anim_tree.set("parameters/walk_speed/scale", walk_speed)
	elif is_on_floor():
		anim_tree.set("parameters/movement/transition_request", "idle")
		
		
func turn_to(direction: Vector3) -> void:
	if direction.length() > 0:
		var yaw := atan2(-direction.x, -direction.z)
		yaw = lerp_angle(rotation.y, yaw, 0.25)
		rotation.y = yaw

	if current_speed > RUN_SPEED and is_on_floor():
		anim_tree.set("parameters/movement/transition_request", "run")
		var lean := direction.dot(global_basis.x)
		last_lean = lerpf(last_lean, lean, 0.3)
		anim_tree.set("parameters/run_lean/add_mount", lean)

You’re setting add_amount to lean and last_lean isn’t used anywhere.

Ive honestly hit a wall on how i can set that up, this is my first project so I’m not too sure how to proceed form here.