thedivergentai/godot-animation-player
Expert patterns for AnimationPlayer including track types (Value, Method, Audio, Bezier), root motion extraction, animation callbacks, procedural animation generation, call mode optimization, and RESET tracks. Use for timeline-based animations, cutscenes, or UI transitions. Trigger keywords: AnimationPlayer, Animation, track_insert_key, root_motion, animation_finished, RESET_track, call_mode, animation_set_next, queue, blend_times.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-animation-player
Timeline-based keyframe animation: track choice, RESET, root motion, libraries — scripts own recipes.
Animation.CALL_MODE_CONTINUOUS for one-shot logic — Use CALL_MODE_DISCRETE.animation_finished for looping clips — Use animation_looped or poll current_animation.StringName.seek() without update=true when same-frame reads matter.active — Cull with notifiers.AnimationLibrary — Stop / wait for finished first.speed_scale for long sync — Prefer seek() against a shared clock.Animation.length metadata is double precision (was float).> Open the matching script before implementing that pattern. Deep recipes: track-authoring.md, root-motion-and-sequences.md, edge-cases.md.
| Need | Script |
|---|---|
| Method-track hit/state keys | method_track_logic.gd |
| Stance/weapon library swap | runtime_anim_lib_swapper.gd |
| Shader uniform timelines | dynamic_shader_animation.gd |
| Runtime track tweak | procedural_track_modifier.gd |
| Forced RESET orchestration | reset_track_orchestrator.gd |
| Bezier → procedural drive | bezier_curve_extraction.gd |
| Off-screen active cull | active_animation_culler.gd |
| Root motion ↔ physics | root_motion_physics_sync.gd |
| Part/equipment tracks | character_part_swapper_tracks.gd |
| TYPE_AUDIO footstep sync | precise_audio_sync.gd |
| Queue/branch sequences | animation_sequencer.gd |
| Code-built Animation resources | programmatic_anim.gd |
| Alt audio-track setup notes | audio_sync_tracks.gd |
CALL_MODE_CONTINUOUS invokes the method every frame across the key span — one-shot hitboxes/VFX need CALL_MODE_DISCRETE.material.albedo_color) duplicates resources into the scene — use instanced materials / shader_parameter/* tracks.animation_finished does not fire on looping clips — use animation_looped or poll current_animation.AnimationLibrary crashes or leaves bad transforms — stop or await finished before swap.speed_scale drifts for rhythm/multiplayer — shared-clock seek(t, true) for long sync.| Track | Use when | Avoid when |
|---|---|---|
| Value | Animate properties (pos, modulate, uniforms) | One-off runtime juice → Tween |
| Method | Hitboxes, SFX hooks, state flips at timestamps | CONTINUOUS call mode / missing method on path |
| Audio | Footsteps / VO locked to frames | Loose AudioStreamPlayer.play() drift |
| Bezier | Custom easing curves sampled at runtime | Simple linear fades |
Track authoring samples → track-authoring.md.
CharacterBody3D + Skeleton3D + AnimationPlayer: extract with get_root_motion_position() / rotation on the physics tick — root_motion_physics_sync.gd. Walk cycles that only move bones leave the body collider behind.
animation_set_next / queue / animation_sequencer.gd.play("run", -1, 1.0, 0.5) or set_default_blend_time.play("clip", -1, -1.0) for doors/cinematic rewind.Full recipes → root-motion-and-sequences.md.
| Need | Prefer |
|---|---|
| Timeline / many properties / reusable | AnimationPlayer |
| One-shot runtime / interruptible | Tween (godot-tweening) |
| Pattern | Script | WHY |
|---|---|---|
| Shared humanoid libraries | runtime_anim_lib_swapper.gd | One library, many models — play lib/clip |
| Decoupled timeline events | method_track_logic.gd | Method track → signaler → gameplay listeners |
| Off-screen CPU budget | active_animation_culler.gd | active = false or manual advance() |
| Code-built clips | programmatic_anim.gd | Dynamic targets not in FBX |
> Progressive disclosure: open Official Documentation links only when researching a specific API;
> load Related Skills when routing work to a peer domain — do not preload the whole lattice.
play/queue/seek, blend times, animation_finished vs animation_looped, and active culling.track_insert_key, call modes, audio/bezier helpers) and length/loop metadata.add_animation_library without duplicating tracks per model.advance() used by physics sync and budget managers.queue.AnimationPlayer.active for off-screen CPU savings.animation_finished / animation_looped / custom method-track signaling without lifecycle leaks..tres AnimationLibrary ownership so runtime swaps do not duplicate or mutate playing resources unsafely.travel() when locomotion outgrows AnimationPlayer queue/set_next.shader_parameter/*) without embedding materials.Take thedivergentai/godot-animation-player from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.