Description
Changelog
Reviews (0)

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/%name calls in scripts against the scene tree — the same silent-breakage problem, but for code, not for AnimationPlayer tracks. An animation track's NodePath is stored as data inside an Animation resource, 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 .tscn file's own [node ...] declarations to rebuild its real node tree, finds every AnimationPlayer in it, and reads its root_node property (defaulting to .., exactly like Godot's own engine) and its libraries dict.
  • Follows each library to its real Animation resources, whether the library is embedded in the same .tscn or saved externally as its own .tres/.res file — both are common, and this checks both.
  • Resolves every track's NodePath the same two-step way the engine does at runtime: from the AnimationPlayer's own position, through root_node, then through the track's own path — correctly handling .., a bare . (the root-node target itself), nested multi-level paths, and %UniqueName shorthand.
  • 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.

Reviews

Animation Track Auditor has no reviews yet.

Login to write a review.

Consider supporting the creators!

If you enjoyed this asset consider supporting its creator. Follow the link below.