From workflows
Animate in Godot 4.x using AnimationPlayer (keyframed clips), AnimationTree (state machines/blend spaces), and Tween (procedural UI tweens).
How this skill is triggered — by the user, by Claude, or both
Slash command
/workflows:godot-animationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Choose and drive the right animation tool: `AnimationPlayer` (clips), `AnimationTree`
Choose and drive the right animation tool: AnimationPlayer (clips), AnimationTree
(blending/state machines), or Tween (short procedural moves). Targets Godot 4.3+.
When not to use: the movement logic that decides which state to play →
godot-2d-movement; UI layout (vs. UI tweening) → godot-ui-control; shader-driven
effects → godot-shaders.
AnimationPlayer — author keyframed clips (transforms, properties, method calls,
audio, even other animations). The source of truth for clip data.AnimationTree — blend and transition between those clips at runtime with a state
machine and/or blend spaces. Needs an AnimationPlayer to pull clips from.Tween — fire-and-forget procedural interpolation in code (create_tween()); ideal
for UI pops, fades, and one-off moves.AnimatedSprite2D + SpriteFrames, or keyframe the
frame property in an AnimationPlayer.AnimationPlayer, then add an AnimationTree
(active = true), set its anim_player, and design an AnimationNodeStateMachine or
AnimationNodeBlendSpace2D as the tree root.travel) or by setting blend
parameters.animation_finished signal and call/method tracks.@onready var anim: AnimationPlayer = $AnimationPlayer
func attack() -> void:
anim.play("attack")
await anim.animation_finished # resume after the clip ends
anim.play("idle")
@onready var tree: AnimationTree = $AnimationTree
func _ready() -> void:
tree.active = true # the tree drives animation; AnimationPlayer is the source
func set_state(state: StringName) -> void:
# The playback object controls an AnimationNodeStateMachine root.
var sm: AnimationNodeStateMachinePlayback = tree.get("parameters/playback")
sm.travel(state) # transitions using the graph's connections
func _physics_process(_d: float) -> void:
set_state(&"run" if velocity.length() > 5.0 else &"idle")
# Root is an AnimationNodeBlendSpace2D named "Move" with idle/run points placed in it.
func update_locomotion(input_dir: Vector2) -> void:
# Parameter path = "parameters/<node name>/blend_position".
tree.set("parameters/Move/blend_position", input_dir)
func pop_in(node: Control) -> void:
node.scale = Vector2.ZERO
node.modulate.a = 0.0
var tw := create_tween() # bound to this node's tree
tw.set_parallel(true) # run the two tweens together
tw.tween_property(node, "scale", Vector2.ONE, 0.2) \
.set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
tw.tween_property(node, "modulate:a", 1.0, 0.2) # sub-property via ":"
AnimationTree.active left false → nothing animates and travel() appears to do
nothing. Set active = true and assign the anim_player path."parameters/<NodeName>/..." and
must match the node names in the tree exactly (e.g. "parameters/playback",
"parameters/Move/blend_position"). A typo silently no-ops.AnimationTree is active, don't
also call AnimationPlayer.play() for the same tracks — let the tree own playback.Tween node to add in 4.x; create tweens in
code with create_tween() (which returns a Tween). They auto-start and free themselves.create_tween() again for a new
animation. Use set_loops() for repetition.yield/yield(anim, "...") is gone. Use await anim.animation_finished."modulate:a", "position:x". Tweening the whole
property instead overwrites siblings.SpriteFrames/AnimatedSprite2D, and Tween easing/chaining/callbacks,
read references/animation-tree-and-tween.md.godot-2d-movement — supplies the velocity/state that selects animations.godot-ui-control — UI that Tweens animate.godot-3d-essentials — 3D character scenes driven by AnimationTree.game-ai — state machines that mirror animation states.npx claudepluginhub gamedev-skills/awesome-gamedev-agent-skills --plugin gamedevWires Godot 4.5 AnimationTree state machines and blend spaces from existing clips. Activates when the user has idle/walk/run/attack clips and needs smooth transitions, hit reactions, or interrupts.
Provides GDScript and C# examples for Godot 4.3+ animations using AnimationPlayer for playback, AnimationTree for blending and state machines, sprite animation, and code-driven effects.
Generates idiomatic Godot 4.x GDScript code with type hints, annotations, signals, and patterns for CharacterBody2D/3D movement and state machines.