Animation Track Auditor
Finds AnimationPlayer tracks whose NodePath no longer points at a real node in the scene — before a playtester notices an animation that silently does nothing.
The problem
Rename, re-parent or delete a node that an animation moves, fades, or calls a method on, and the track that targeted it does not error. It does not warn in the editor. It does not print anything to the console, in the editor or in an exported build. Godot's AnimationPlayer simply skips any track whose NodePath doesn't resolve, every single time that animation plays. The only symptom is "that part of the animation doesn't do anything anymore" — easy to miss on a long animation, one buried among dozens of tracks, or one that only plays near the end of a cutscene nobody re-watches after every edit.
What's already out there, and why this is different
- Broken Reference Finder (also on this store, same author) and Godot Project Doctor both check
res://resource paths — scenes, textures, scripts, UIDs — against files that no longer exist on disk. Renaming a node inside a scene touches no file on disk at all, so neither tool, nor any other resource-path checker, can ever see this. - Node Path Finder (also on this store, same author) checks
get_node()/$path/%namecalls in scripts against the scene tree — the same silent-breakage problem, but for code, not forAnimationPlayertracks. An animation track'sNodePathis stored as data inside anAnimationresource, never as a line of GDScript, so a script checker cannot read it either; this tool and Node Path Finder check two genuinely different failure surfaces that happen to share the same root cause. - Godot Signal Checker checks editor-connected signal-to-method wiring in the Signals tab, a third, separate wiring mechanism with its own failure mode — not animation tracks either.
- A
godot-animation-player-refactor-style tool helps you fix paths while you are actively renaming a node right now, by editing tracks for you in the moment. It is not a project-wide, after-the-fact scanner you run to find every track that is already broken, including ones broken by a rename from weeks ago, by a teammate's commit, or inside a scene nobody has opened in a while.
What it does
- Reads every
.tscnfile's own[node ...]declarations to rebuild its real node tree, finds everyAnimationPlayerin it, and reads itsroot_nodeproperty (defaulting to.., exactly like Godot's own engine) and itslibrariesdict. - Follows each library to its real
Animationresources, whether the library is embedded in the same.tscnor saved externally as its own.tres/.resfile — both are common, and this checks both. - Resolves every track's
NodePaththe same two-step way the engine does at runtime: from theAnimationPlayer's own position, throughroot_node, then through the track's own path — correctly handling.., a bare.(the root-node target itself), nested multi-level paths, and%UniqueNameshorthand. - Every result carries a High confidence tier (no node with that name exists anywhere in the scene — almost always a stale rename or deletion) or Low (a node with that exact name exists elsewhere in the scene, just not at that path — likely the wrong depth or a moved node).
- Double-click a result for the full detail. "Export Markdown" writes
animation_track_report.md.
Known limitations (read before relying on a clean scan)
This checks that a track's NodePath resolves to a real node — it does not check that the property named after the : is a real, correctly spelled property on that node's class; that would need a full per-class property schema this tool does not ship. A node added only at runtime, never saved into the .tscn, is invisible to a static scan, the same limitation every static analyzer has. An Animation resource saved as its own standalone file rather than inside an AnimationLibrary's _data dict — rare in modern Godot 4, where every animation lives in a library — is skipped rather than guessed at. Treat a clean scan as "nothing obviously broken", not a formal guarantee — the same spirit as this author's other auditors.
Installing it
Drop addons/animation_track_auditor into your project's addons/ folder, then enable Animation Track Auditor under Project > Project Settings > Plugins. A new dock tab appears on the left.
Tested against a real project
test_project/ ships in the repo with a scene covering the default root_node, an explicit multi-level root_node override on a second AnimationPlayer, a value track, a method track, a . root-target track, a valid and an invalid %UniqueName track, a wrong-depth track (Low), a fully-missing track (High), and an externally-saved AnimationLibrary .tres file with one valid and one broken track — run via Godot_v4.7.2 --headless --script run_scan.gd.
scanned_scenes=1 scanned_players=3 checked_tracks=11 result_count=5
High | Player/Ghost | anim=move | player=AnimationPlayer | No node named "Ghost" exists anywhere in this scene...
High | %NotRegistered | anim=move | player=AnimationPlayer | %NotRegistered does not match any node marked...
High | NotAChild | anim=walk | player=Enemy/AnimationPlayer2 | No node named "NotAChild" exists anywhere...
High | TotallyGone | anim=vanish | player=AnimationPlayer3 | No node named "TotallyGone" exists anywhere...
Low | Enemy/Ghost/HealthBar | anim=move | player=AnimationPlayer | No node at "Enemy/Ghost/HealthBar", but a node named "HealthBar" exists elsewhere...
License
MIT. See LICENSE.
Changelog for version v1.1.0
2026-11-03 23:38:51
No changelog provided for this version.