class_name WilliamSkin extends Node3D @export_category("Tracking") @export var head_influence: float = 0.6 @export var eye_influence: float = 1.0 @onready var _animation_tree: AnimationTree = $AnimationTree @onready var _head: TrackingBone3D_head = $base/rig/Skeleton3D/track_head @onready var _eye_L: TrackingBone3D = $base/rig/Skeleton3D/track_eye_L @onready var _eye_R: TrackingBone3D = $base/rig/Skeleton3D/track_eye_R @onready var _default_target = $defaultTrackingTarget func set_eyes_target(target: Node3D) -> void: for eye in [ _eye_L, _eye_R ]: eye.target = target if target != null else _default_target eye.active = 1 eye.influence = eye_influence func set_head_target(target: Node3D) -> void: _head.target = target if target != null else _default_target _head.active = 1 _head.tween_influence(0.0 if target == null else head_influence) # manage talking and expressions func talk() -> void: _animation_tree.set("parameters/motion/transition_request", "talk") # manage vectored movement func current_state() -> String: return _animation_tree.get("parameters/motion/current_state") func set_hips_direction(direction: float) -> void: _animation_tree.set("parameters/hips_direction/blend_position", clamp(direction, -PI / 2, PI / 2)) func get_hips_direction() -> float: return _animation_tree.get("parameters/hips_direction/blend_position") func pose() -> void: _animation_tree.set("parameters/motion/transition_request", "pose") func idle() -> void: _animation_tree.set("parameters/motion/transition_request", "idle") func move_forward() -> void: _animation_tree.set("parameters/motion/transition_request", "forward") func move_backward() -> void: _animation_tree.set("parameters/motion/transition_request", "backward") func movement_speed(speed: float) -> void: _animation_tree.set("parameters/forward/blend_position", speed) _animation_tree.set("parameters/backward/blend_position", speed) func jump() -> void: _animation_tree.set("parameters/motion/transition_request", "fall") func fall() -> void: _animation_tree.set("parameters/motion/transition_request", "fall") func landing() -> void: _animation_tree.set("parameters/motion/transition_request", "landing")