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
