Download Download
Animation and Frame Events
Beginner-friendly timing for cutscenes, doors, and VFX

How animation import works

  • Every Action you key in Blender keeps its name when exported. FPE registers mesh animations and sprite animations in a global map when the GLB loads so commands can find them later.

Marking frame events in Blender (no code)

  1. In Blender, select the object that owns the action/animation and open the Action Editor.
  2. Open the properties panel in the Action Editor.
  3. Move the playhead to the frame where you want to trigger a Frame Event.
  4. In the Frame Events section, add a new row. Each row has a Frame Number and Event Name.
  5. Use clear event names like DOOR_OPENED or PLAY_CHIME. These names must be exactly the same as the names of the Scene Events you want to trigger.

What happens in Godot (Technical)

  • When the animation plays, a FrameEventRunner watches the timeline. When the playback head reaches your marked frame (with a small tolerance), the runner dispatches an FPEEvent named after your Event Name.
  • Events target the node that owns the animation, so you can catch them with triggers, commands, or your own script.
  • All events are reset when the level unloads, preventing cross-level leaks.

Connecting events to actions (Examples)

  • Play a sound mid-animation: Add a frame event named PLAY_CHIME. Place a Trigger or Speaker nearby that listens for the PLAY_CHIME event and fires a Speaker Trigger command.
  • Unlock a door on frame 12: Mark frame 12 as UNLOCK_DOOR. Add a Trigger on the door mesh that reacts to UNLOCK_DOOR by disabling the collider or running Animations to play the open clip.
  • Cutscene camera swap: Use two frame events, CAM_CUT and CAM_RETURN, and bind them to the Activate Camera and Reactivate Player Camera commands to manage controls and the current view.

Quick checklist if nothing fires

  • Double-check the Event Name spelling in Blender and in the listening trigger/command.
  • Make sure the GLB was re-exported after adding events and that Godot re-imported it.