XESOFT Asset Store
Animation Event Keeper for Unity: visual timeline with managed and saved markers, animation preview, playback controls, color-coded marker legend.
← All assets
Available now Unity 2022.3 LTS or newer v1.2.0 Full C# source Editor-only

Animation Event Keeper

Reimport-proof & Rename-proof Animation Events

Animation Events that survive FBX reimport AND survive receiver method renames. Apply once; a small database + postprocessor re-applies through Unity's official pipeline forever. Rename Guard validates every event-to-method link after each compile and heals receiver renames project-wide in one click (or automatically via the [AnimationEventFormerlyKnownAs] attribute). Project X-Ray scans your whole project, names every doomed event before the next reimport eats it, and Adopt All makes the whole project reimport-proof in one click. Editor-only, full C# source, safe to remove.

A small tool with a big job: it remembers what Unity forgets.

The problem

Animation Events on FBX clips vanish.

Author a hitbox event on a clip imported from an FBX. Walk away, come back tomorrow, hit Reimport. The event is gone. The standard workaround is to duplicate the clip out of the FBX so it lives in a free-standing .anim file. That fragments your animation pipeline, breaks Mecanim setups, and bloats your project. Keeper fixes it at the source.

Without Keeper

Events disappear silently

AnimationUtility.SetAnimationEvents writes to the in-memory runtime clip only. The next time the FBX reimports, Unity regenerates the AnimationClip sub-asset from scratch and the events are wiped. Your receiver methods stop firing. Nothing tells you. The Console stays clean. You find out from a tester.

With Keeper

Events come back, automatically

Apply once. The recipe lands in a small database; the postprocessor re-applies it on every future import through Unity's official pipeline. Reimport, source-control swap, Mecanim refresh, CI build, six months later: events stay put. No babysitting.

How it fits together

Authoring and persistence are separate.

You author the recipe in the editor window. The database stores it. The postprocessor enforces it on every import. Unity reads standard Animation Events at runtime, the same as it always has. Remove Keeper and your applied events stay on disk.

RecipeAuthored in
the editor window
DatabaseScriptableObject
in user-data folder
PostprocessorAuto-runs on
every FBX import
AnimationClipStandard Unity
Animation Events
Two ways to work

Author one, or apply to dozens.

Author

Tune a single clip visually

Drop a clip onto the Author tab, scrub the preview to find the pose, double-click the timeline to add events, drag markers to retune. Pick functions from the receiver component dropdown. Apply writes only to the clip you are editing, so loading multiples for comparison is safe.

Batch

Apply one recipe to many clips

Switch to the Batch tab, drop an FBX or select a folder of clips, see a Create / Update preview per clip, and apply with one click. The same recipe writes to all listed targets. Per-row remove buttons trim the list down when an FBX has more clips than you actually need.

What's inside

Everything event authoring needs.

Reimport-proof persistence

The core promise. Apply a recipe once, and your events survive every FBX reimport, source-control swap, Mecanim refresh, Unity restart, and CI build. A small editor database remembers what you authored, and a postprocessor re-applies it through Unity's official import pipeline automatically. No duplicating clips out of the FBX, no fragile workarounds.

Rename Guard

After every script compile, Keeper validates every event-to-method link in the database and detects receiver method renames. Three-tier confidence ladder: Certain (a method tagged [AnimationEventFormerlyKnownAs] exists, auto-applied by default), Likely (the bound receiver type lost the method and gained exactly one compatible one this compile, inferred from a snapshot diff), Possible (closest name-similarity, always requires review). One-click Rebind All rewrites every matching spec across the database AND strips the stale old-name events off each affected clip.

[AnimationEventFormerlyKnownAs] attribute

Tag a renamed receiver method with its old name and Rename Guard heals it automatically on recompile, the same mental model as Unity's [FormerlySerializedAs]. The attribute lives in a tiny XeSoft.AnimationEventKeeper.Runtime assembly, marked [Conditional("UNITY_EDITOR")] so every usage is stripped from player builds. Zero runtime footprint.

Project X-Ray

A read-only scan of every AnimationClip under Assets/. Names four failure modes per clip with evidence: Doomed events (live only in the FBX runtime override, the next reimport deletes them, this is objectively detectable), Broken links (no compatible receiver method anywhere in your code), Whitespace names (Unity's confirmed silent-dispatch bug), and Duplicates. Clips with events but no recipe are listed as unprotected adoption candidates.

Adopt All

One click creates a Keeper recipe for every unprotected clip in the project, making the entire thing reimport-proof and Rename-Guard-covered in one pass. Strictly additive: never overwrites an existing recipe. Events whose function name has exactly one compatible host type in your code are auto-bound; ambiguous ones stay unbound for the function picker. Revert Last Adoption deletes precisely what adoption created, GUID-tracked so asset moves do not strand the revert.

Torture Test

Per asset, force-reimport 3 times and report per-clip event counts before vs after, with a signature-verified verdict. Turns the store-page claim into a button you press on your own asset: unprotected events really are lost (the dialog warns and offers adopt-first), adopted events come back through the import pipeline every single time.

Visual clip timeline

Draggable markers across the clip length. Cyan for events in your edit session, gray for events already saved on the clip, amber for drift, red for missing. A thin connector line draws between a managed marker and its saved twin the moment you drag, so drift is an at-a-glance read instead of something you discover later in validation.

Animation preview with scrub

See the pose at any event without leaving the editor window. Scrub the playhead to scrub the preview live. Play / pause at 0.25x to 2x speed, step a single frame at a time, orbit the camera, scroll-zoom. Auto-detects the source FBX rig, falls back to Unity's default mannequin for Humanoid bone-only clips like Mixamo "Without Skin" downloads.

Function picker

Drop your receiver Prefab into the Pick From field, and every Animation-Event-compatible method on its components shows up in a one-click dropdown grouped by component. Picking one fills both the function name AND the parameter type, so signature mismatches die at authoring time instead of at runtime in someone else's Console.

Footstep auto-detection

Point at a Humanoid walk or run clip, click "Suggest Footsteps", and Keeper samples the foot bones, detects each contact phase via edge detection, and proposes one event per step at the most-planted moment. Results land as suggestions in the edit session for you to review, not on disk. Skips idle clips so you do not get noise.

Batch apply

Apply the same recipe to dozens of clips in one click. Drop an FBX with 20 sub-clips, drop a folder of .anim files, or select clips in the Project window. The Batch tab shows a Create / Update preview per clip before you commit, with per-row remove buttons so you can trim the list down to exactly the targets you want.

Built-in templates and custom Recipes

Ships with six gameplay templates (Hitbox Window, Combo Window, I-Frames, Footsteps L/R, SFX Cue, VFX Cue) so common patterns are one click. Save your own edit session as a portable Recipe ScriptableObject and reuse it across clips. Recipes are clip-agnostic (normalized time, so the same recipe works on a 0.4s attack and a 1.2s heavy attack).

Validation dashboard

Scans the entire database in one pass. Surfaces drifted events, missing events, lost clips, and broken receiver methods. Repair All re-applies every recipe to every target clip with one click. Per-row repair on the Database tab for surgical fixes.

Receiver stub generation

The Receiver tab shows every function name in your recipe with a green / amber / red status against your receiver components. Copy Stub on any row gives you a method signature ready to paste. Save Receiver Script generates a whole MonoBehaviour with every method scaffolded, parameter types and all.

GUID-backed move resilience

Rename or relocate an FBX and the recipe follows it. Keeper looks up entries by path first, then falls back to the asset GUID. The postprocessor uses the same fallback on import, so moves survive the auto-restoration path, not just manual repair. The recipe catches the new path up automatically the first time the GUID lookup wins.

Survive method renames too

Rename Guard.

Unity Animation Events call methods by string name, so renaming Footstep() to OnFootstep() silently breaks every event calling it. Unity says it is by design. Keeper makes it loud and the fix one click.

Certain · auto-applied

The attribute path

Tag a renamed receiver method with [AnimationEventFormerlyKnownAs("OldName")], the same mental model as Unity's [FormerlySerializedAs]. After the next compile, Rename Guard heals every event calling the old name. The attribute lives in a tiny XeSoft.AnimationEventKeeper.Runtime assembly, marked [Conditional("UNITY_EDITOR")], so every usage is stripped from player builds.

Likely · Possible · review

The review window

For renames without the attribute, Rename Guard infers candidates from a method-set snapshot diff persisted under Library/ and from name similarity. The review window groups suggestions by confidence with a per-row Rebind / Dismiss, and a one-click Rebind All Certain & Likely. Broken links (no compatible method anywhere) get a Copy Stub. The window opens automatically after a compile that produced new findings, deduplicated per editor session.

Scan the whole project, in one click

Project X-Ray.

Read-only scan of every AnimationClip under Assets/. Names every doomed event with per-finding evidence on your own assets, then makes the whole project reimport-proof in one click.

Doomed

Events that live only in the FBX clip's runtime override. The next reimport deletes them. This is objectively detectable; exactly the failure mode naive event tools produce.

Broken

Events whose function name has no compatible receiver method anywhere in your scanned code (including the empty-name case).

Whitespace

Events with whitespace in the name. Unity's confirmed silent-dispatch bug; reported as the root cause instead of double-counted as broken.

Duplicate

Identical name + time + payload firing twice on the same clip.

Adopt All

One click creates a Keeper recipe for every unprotected clip in the project. Strictly additive (never overwrites). Events with exactly one compatible host type in your code get auto-bound; ambiguous ones stay unbound for the function picker. Revert Last Adoption deletes precisely what adoption created, GUID-tracked so asset moves do not strand it.

Torture Test

Per asset, force-reimport 3 times and report per-clip event counts before vs after, with a signature-verified verdict. Unprotected events really are lost (the dialog warns and offers adopt-first), adopted events come back through the import pipeline every single time.

Receiver stub generation

Skip writing receiver MonoBehaviours by hand.

The Receiver tab knows every function name in your recipe and every parameter type. Click Save Receiver Script and Keeper writes a complete MonoBehaviour with every method scaffolded, ready to drop on your character. No typos, no signature drift, no chasing missing handlers in the Console at runtime.

// Generated by Animation Event Keeper. Paste onto your character.
using UnityEngine;

public sealed class AttackEventReceiver : MonoBehaviour {
    public void EnableHitbox() {
        // TODO: Handle Animation Event 'EnableHitbox'.
    }

    public void DisableHitbox() {
        // TODO: Handle Animation Event 'DisableHitbox'.
    }

    public void PlaySFX(AudioClip value) {
        // TODO: Handle Animation Event 'PlaySFX'.
    }
}
Specs

No surprises in the box.

Editor-only. No runtime DLL, no third-party dependency, no required render pipeline. If your project runs on Unity 2022.3 LTS or newer, Keeper runs. The database is a single ScriptableObject that lives outside the package folder, so updates can never overwrite your recipes.

Get it on the Asset Store
Unity version 2022.3 LTS or newer (verified on 6000.x)
Render pipeline Pipeline-agnostic (Built-in / URP / HDRP)
Dependencies None. Standard Unity APIs only.
Runtime footprint Editor-only authoring + one [Conditional("UNITY_EDITOR")] attribute. Zero bytes in player builds.
Source code Full C# source, no DLLs
Tests 56 EditMode tests, including end-to-end reimport regression and a real .anim Torture Test
Removal Safe. Writes standard Unity events; uninstalling leaves applied events on disk.
Honest scope

Animation Event Keeper is an editor authoring and persistence tool for standard Unity Animation Events. It does not replace Mecanim, Animator Controllers, Animancer, Timeline, or Final IK; it writes the events those systems already read. It does not run at runtime. It does not modify your FBX source files (only Unity's import metadata). Suggest Footsteps is Humanoid-only because Generic rigs would need fragile bone-name heuristics I would rather not ship. You bring the receiver MonoBehaviour (or let Keeper generate it for you), and your gameplay code stays yours.

FAQ

Questions, answered.

How does Animation Event Keeper actually persist events through FBX reimport?

A ScriptableObject database stores the recipe (your events, their normalized times, and their parameters), and an AssetPostprocessor hook re-applies that recipe on every FBX import through Unity's official AnimationUtility API. The database is declared as an import dependency via context.DependsOnSourceAsset, so Unity knows to rerun the postprocessor when the recipe changes. No proprietary runtime, no DLL voodoo.

What does Rename Guard actually catch?

Receiver method renames. Unity Animation Events call methods by string name, so renaming Footstep() to OnFootstep() silently breaks every event calling it. Rename Guard re-checks every event-to-method link after each compile and proposes a fix with a confidence level: Certain (a method tagged [AnimationEventFormerlyKnownAs("OldName")] exists, auto-applied by default), Likely (the bound type lost the method and gained exactly one compatible one this compile), Possible (closest name-similarity, always requires review). One click rebinds everything Certain + Likely; Possible matches always wait for your approval.

Can I make my whole project reimport-proof at once?

Yes, that is what Project X-Ray + Adopt All does. X-Ray scans every AnimationClip under Assets/ and lists every clip whose events live ONLY in the FBX runtime override (the next reimport will delete them). Adopt All creates a Keeper recipe for every unprotected clip in one click, strictly additive (never overwrites existing recipes). Run the Torture Test on any asset to confirm: it force-reimports 3 times and verifies event survival.

Will my events break if I uninstall the package?

No. Keeper writes standard UnityEngine.AnimationEvent objects through Unity's public APIs. Uninstalling the asset leaves every applied event on disk, exactly where Unity expects to read it at runtime. Your project keeps working. The thing you lose is the ability to author new events visually and re-apply them through the postprocessor on future reimports.

Does it work for .anim clips, or just FBX clips?

Both. The reimport-proof postprocessor pipeline is the headline because that is the case Unity does not solve natively. .anim files write through cleanly without it; Keeper still tracks them in the database so validation, drift detection, batch apply, Rename Guard, and receiver stub generation all work the same way.

What happens if I move or rename an FBX?

The recipe follows it. Keeper stores both the asset path and the asset GUID for every entry. On lookup it tries the path first, then falls back to the GUID, so moves and renames survive both manual repair AND the auto-restoration that fires on import. Rename Guard's database edits and Adopt All's revert record are also GUID-tracked, so asset moves never strand them.

Does it interfere with Mecanim, Animator Controllers, Timeline, Animancer, or Final IK?

No. Keeper writes Animation Events directly onto AnimationClip assets, the same place the Inspector writes them. Everything that reads Animation Events at runtime (Mecanim state machines, Animancer, Playables, Timeline tracks driven by AnimationClip) sees them the same way. Keeper is an editor-only authoring tool; it never runs at runtime and never touches your animation system.

Humanoid only, or Generic too?

Both for authoring, validation, batch, recipes, Rename Guard, X-Ray, and persistence. The Suggest Footsteps auto-detection is Humanoid-only because it relies on standard bone slots (LeftFoot, RightFoot). Generic rigs would need fragile bone-name heuristics, which I deferred rather than ship something flaky.

Is the database safe to commit to source control?

Yes. It is a single ScriptableObject asset that lives at Assets/AnimationEventKeeperData/ (outside the package folder, so package updates can never overwrite it). Standard Unity YAML serialization, plays nicely with Unity's Smart Merge. Multiple authors editing different clip entries should merge cleanly.

Stop losing Animation Events to FBX reimport.

Full source, an editor-only footprint, and a developer who actually answers.