skills/ue-anim-notify-patterns/SKILL.md
Animation notify and montage tool patterns for UE5
npx skillsauth add sipherxyz/universal-ue-skills ue-anim-notify-patternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Role: Animation Tool Engineer Scope: Creating/modifying FAnimNotifyEvent in editor tools Engine: UE 5.5+
When programmatically creating FAnimNotifyEvent entries for montages, you MUST follow the engine's expected initialization pattern. Missing any step causes editor bugs (selection issues, visual glitches, notify state backgrounds not rendering).
#include "Animation/AnimTypes.h" // For GetTriggerTimeOffsetForType()
FAnimNotifyEvent NewEvent;
// 1. CRITICAL: Unique GUID for selection handling
NewEvent.Guid = FGuid::NewGuid();
// 2. Set the notify object (choose ONE)
// For instant notifies:
NewEvent.Notify = NewObject<UAnimNotify>(Montage, NotifyClass, NAME_None, RF_Transactional);
// OR for notify states:
NewEvent.NotifyStateClass = NewObject<UAnimNotifyState>(Montage, NotifyStateClass, NAME_None, RF_Transactional);
NewEvent.SetDuration(Duration);
// 3. Link to montage timeline
NewEvent.Link(Montage, StartTime);
NewEvent.TriggerTimeOffset = GetTriggerTimeOffsetForType(Montage->CalculateOffsetForNotify(StartTime));
NewEvent.TrackIndex = TrackIndex;
// 4. FOR NOTIFY STATES ONLY: Link the end time
if (NewEvent.NotifyStateClass)
{
float EndTime = StartTime + Duration;
NewEvent.EndLink.Link(Montage, EndTime);
NewEvent.EndTriggerTimeOffset = GetTriggerTimeOffsetForType(Montage->CalculateOffsetForNotify(EndTime));
}
// 5. Add to montage
Montage->Notifies.Add(NewEvent);
// 6. Refresh after all notifies added
Montage->RefreshCacheData();
| Missing Step | Bug |
|--------------|-----|
| Guid = FGuid::NewGuid() | All notifies select together, positions jump when moving one |
| EndLink.Link() | NotifyState duration handle doesn't work, can't resize |
| EndTriggerTimeOffset | End time snapping broken |
| NotifyStateClass with base UAnimNotifyState | No background color renders (need concrete subclass) |
Base UAnimNotifyState has no visual representation. For editor-visible notify states, create a concrete subclass:
UCLASS()
class UAnimNotifyState_MyCustom : public UAnimNotifyState
{
GENERATED_BODY()
public:
UAnimNotifyState_MyCustom()
{
#if WITH_EDITORONLY_DATA
NotifyColor = FColor(255, 216, 0, 255); // Yellow
#endif
}
virtual FLinearColor GetEditorColor() override
{
return FLinearColor(1.0f, 0.85f, 0.0f, 1.0f);
}
};
See Engine/Source/Editor/Persona/Private/SAnimNotifyPanel.cpp lines 2510-2579 for the canonical implementation.
Montage as outer for notify objectsskill: ue-anim-notify-patterns
invoke: /editor-tools:ue-anim-notify-patterns
development
This skill should be used when implementing features in isolation using git worktrees. Triggers on "create worktree", "isolated workspace", "parallel development", or when starting implementation that should not affect main workspace.
testing
Manage VFX team issues on GitHub Projects - timeline scheduling, status updates, member commit checks, bulk assign. Use when managing VFX team project board, adding issues to timeline, checking member progress, or bulk-updating issue fields.
tools
Generate C++ validation rules from JSON definitions. Use when team updates ValidationRules.json or asks to add/modify validation rules.
development
Check codebase for Microsoft Xbox XR (Xbox Requirements) compliance issues. Scans for account picker, cloud saves, achievements, Quick Resume, and Xbox certification requirements. Use before console submission or when preparing for Microsoft certification. Triggers on "XR", "Xbox certification", "Microsoft compliance", "Xbox cert", "Xbox requirements", "GDK compliance".