summerengine/summer/character-animation-wiring
Claude Code and agent skill by summerengine/summer
- community
Checking that the SKILL.md file is still in the repository.
Wire a rigged character end to end: real clips and bones, locomotion states, method tracks, root motion.
Install
npx vskill@latest install summerengine/summer/character-animation-wiringSKILL.md
Character Animation Wiring — Rigged GLB to Living Character
The game-critical path: a rigged, animated character lands in the scene — from assets.generate_3d({ ..., rig: true }) + assets.generate_motion, or an imported GLB — and nothing moves yet. This skill wires it end to end: inspect what actually arrived, build locomotion, fire gameplay events off animation frames, add poses and head tracking, key the face, and handle root motion. Then prove it in a playtest — a wired tree that was never played is a claim, not a result.
Two lanes throughout:
- ctx lane (animation-tier engines): the animation ctx helpers on
summer_run_script—anim_state_machine,animate_method,bone_pose,look_at_modifier, plus theanimate()v2 extensions. One script per step, owner handled, failures come back as report entries. - raw lane (any engine): the same wiring through plain GDScript in
summer_run_script— the Animation/AnimationTree classes are fully script-bound, just verbose. On an older engine a missing ctx helper is a plainInvalid call to method ...script error; fall back to the raw lane, which works everywhere.
Frozen animation-tier signatures (see scene-scripting for the full stdlib):
When to use this skill
- A rigged GLB with clips is instanced and the character T-poses or slides.
- "Make the goblin idle, walk when moving, run when sprinting."
- Footstep sounds / attack hit-frames need to fire at exact animation times.
- A corpse/statue/mannequin needs a still pose; an NPC head should track the player.
- The character visibly moonwalks — the clip translates the root but the body stays put (root motion).
When NOT to use this skill
- No clips yet — generate first via
generate-motion(rigged Meshy target) or import them. - Continuous walk↔run blending by speed, upper-body attack overlays, OneShot hit reactions — that graph design lives in
animation-tree; this skill's state machine is the discrete idle/walk/run backbone. - Foot IK, additive lean, ragdoll —
procedural-animation. - Full viseme lipsync from audio —
facial-and-lipsync(this skill covers the blend-shape keying mechanism it builds on).
Step 1 — Inspect what actually came in
Never wire against assumed clip names or bone names. Imports differ: the AnimationPlayer may be nested inside the instance, clips may be namespaced (walk vs Walking_Woman vs mixamo_com), bone names vary by rig source. The instance's internals are not owned by the edited scene, so pass owned: false when searching:
Read the reports. Every later step quotes these exact strings. If the clip list is empty, the GLB imported without animations (or they landed as a separate AnimationLibrary asset) — route back to generate-motion / retarget before wiring anything.
Step 2 — Locomotion state machine (ctx lane)
ctx.anim_state_machine gets-or-creates the AnimationTree, wires it to the found (or given) AnimationPlayer, builds the AnimationNodeStateMachine, and sets active = true:
State names are yours; clip names must be the exact strings from Step 1. An unknown clip name produces a report entry listing the player's actual clips — never silent. Fix the spelling from that list; do not guess again.
Drive it from the controller script (host-edits the .gd):
Thresholded travel() is the discrete backbone. When the user wants a continuous speed blend or attack/hit overlays, extend the tree per animation-tree — those node types are beyond the anim_state_machine spec dict.
Step 3 — Method tracks: footsteps and attack frames
Gameplay events that must land on an animation frame (footstep audio at heel-strike, damage at the blade's contact frame) belong in a method-call track, not a timer:
The methods must exist on the target node's script — write them there first and check with summer_get_script_errors. Play the event clip alongside its motion clip (same timings) from the same tree. Method tracks fire during playback in the running game; a successful script result proves the track exists, not that the method fires — verification is a playtest where the footstep actually sounds.
Step 4 — Still poses and head tracking
A corpse over a railing, a statue mid-swing, a mannequin — edit-time poses, no clip needed:
Head tracking — one call creates the owned LookAtModifier3D under the skeleton:
Unknown props land in prop_warnings — read them. Angle limits, influence fade-out by distance, and spine-chain distribution are the difference between alive and possessed: tune per procedural-animation (A1/A2).
Step 5 — Facial keys via blend shapes
animate() accepts "blend_shapes/<name>" property paths (value tracks, weights 0..1) against the MeshInstance3D that owns the shapes — names come from Step 1's report:
That is the mechanism; a full audio-synced viseme timeline is facial-and-lipsync. Bone-track keyframes work the same way through animate() v2 — ctx.animate(character, "Skeleton3D:Head/rotation", keys, "nod") creates a proper bone rotation track (the helper owns the quaternion conversion; never hand-build quaternion tracks).
Step 6 — Root motion
Meshy/mocap locomotion clips translate the root bone forward (Meshy run moves ~5m per cycle). Two valid setups — pick one, never both:
- In-place movement (default): code drives
velocity, the clip should NOT translate the root. If the character lunges forward and snaps back every loop, the clip has baked root translation — strip it or switch to setup 2. - Root motion: the clip drives movement. Requires, on the AnimationTree:
root_motion_trackset to the root bone's track path (e.g."Skeleton3D:Hips"— the skeleton node path from Step 1, colon, the root bone name), then in_physics_processapplytree.get_root_motion_position()/get_root_motion_rotation()to the CharacterBody3D instead of input-driven velocity. ARootMotionViewnode visualizes the extracted motion in the editor (editor-only helper; it is invisible in the shipped game).
Symptoms map: sliding feet = setup 1 with speed thresholds mismatched to the clip's stride; lunge-and-snap = baked root translation under setup 1; character animates but never moves = setup 2 without the get_root_motion_* application code.
Root motion CANNOT be judged from the editor state. Playtest it: summer_play, then summer_get_runtime_tree + summer_inspect_runtime_node on the character — its live global_position must advance while walking — plus summer_screenshot target:"game" for the pixels. Claim only what those reads show.
Raw lane — the same wiring on older engines
Every class above is script-bound; ctx.anim_state_machine is convenience, not capability. The raw locomotion wiring:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckinglibrary/skills/character-animation-wiring/SKILL.md
Popularity
- Repository stars
- 90
- Repository forks
- 9
- 7-day trend score
- 21
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/summerengine/summer/character-animation-wiring)