skills/ue-anim-notify-wizard/SKILL.md
Interactive wizard for creating Animation Notify States (ANS) with proper GAS integration, Sipher patterns, and boilerplate generation. Use when creating new animation notifies, implementing montage-driven gameplay, or scaffolding ANS classes. Triggers on "create notify", "animation notify", "ANS", "anim notify state", "notify wizard", "montage notify".
npx skillsauth add sipherxyz/universal-ue-skills ue-anim-notify-wizardInstall 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.
Interactive wizard for creating Animation Notify States following Sipher project patterns.
| Type | Base Class | Use Case |
|------|------------|----------|
| Combat Action | USipherANS_CombatAction | Hitboxes, damage windows |
| Gameplay Cue | USipherANS_GameplayCue | VFX/Audio via GAS |
| Warp/Position | USipherANS_Warp | Root motion warping |
| State Tag | USipherANS_GrantTag | Temporary tag grant |
| Ability Trigger | USipherANS_TriggerAbility | Ability activation |
| Custom | UAnimNotifyState | General purpose |
Questions:
// USipherANS_{NotifyName}.h
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimNotifies/AnimNotifyState.h"
#include "GameplayTagContainer.h"
#include "USipherANS_{NotifyName}.generated.h"
/**
* {Description of what this notify does}
*
* @note Duration: {Begin to End}
* @note Usage: {When to use this notify}
*/
UCLASS(meta = (DisplayName = "{Display Name}"))
class S2_API USipherANS_{NotifyName} : public UAnimNotifyState
{
GENERATED_BODY()
public:
USipherANS_{NotifyName}();
//~ Begin UAnimNotifyState Interface
virtual void NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float TotalDuration, const FAnimNotifyEventReference& EventReference) override;
virtual void NotifyTick(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float FrameDeltaTime, const FAnimNotifyEventReference& EventReference) override;
virtual void NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
virtual FString GetNotifyName_Implementation() const override;
//~ End UAnimNotifyState Interface
protected:
/** {Parameter description} */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "{Category}")
{ParameterType} {ParameterName};
/** Gameplay tag granted during notify */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tags")
FGameplayTag GrantedTag;
private:
/** Cached owner reference */
TWeakObjectPtr<AActor> CachedOwner;
};
// USipherANS_{NotifyName}.cpp
#include "AnimNotify/USipherANS_{NotifyName}.h"
#include "Components/SkeletalMeshComponent.h"
#include "AbilitySystemComponent.h"
#include "AbilitySystemBlueprintLibrary.h"
USipherANS_{NotifyName}::USipherANS_{NotifyName}()
{
// Default values
GrantedTag = FGameplayTag::RequestGameplayTag(FName("{DefaultTag}"));
}
void USipherANS_{NotifyName}::NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float TotalDuration, const FAnimNotifyEventReference& EventReference)
{
Super::NotifyBegin(MeshComp, Animation, TotalDuration, EventReference);
if (!MeshComp)
{
return;
}
AActor* Owner = MeshComp->GetOwner();
if (!Owner)
{
return;
}
CachedOwner = Owner;
// Grant tag via ASC if configured
if (GrantedTag.IsValid())
{
if (UAbilitySystemComponent* ASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(Owner))
{
ASC->AddLooseGameplayTag(GrantedTag);
}
}
// TODO: Custom begin logic
}
void USipherANS_{NotifyName}::NotifyTick(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float FrameDeltaTime, const FAnimNotifyEventReference& EventReference)
{
Super::NotifyTick(MeshComp, Animation, FrameDeltaTime, EventReference);
// TODO: Per-frame logic (if needed)
}
void USipherANS_{NotifyName}::NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
{
// Remove granted tag
if (GrantedTag.IsValid() && CachedOwner.IsValid())
{
if (UAbilitySystemComponent* ASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(CachedOwner.Get()))
{
ASC->RemoveLooseGameplayTag(GrantedTag);
}
}
CachedOwner.Reset();
Super::NotifyEnd(MeshComp, Animation, EventReference);
}
FString USipherANS_{NotifyName}::GetNotifyName_Implementation() const
{
return TEXT("{DisplayName}");
}
// Parameters
UPROPERTY(EditAnywhere, Category = "Combat")
TSubclassOf<USipherHitboxComponent> HitboxClass;
UPROPERTY(EditAnywhere, Category = "Combat")
FName AttachSocket;
// NotifyBegin - Spawn hitbox
// NotifyEnd - Destroy hitbox
// Parameters
UPROPERTY(EditAnywhere, Category = "GameplayCue")
FGameplayTag GameplayCueTag;
UPROPERTY(EditAnywhere, Category = "GameplayCue")
FGameplayCueParameters CueParameters;
// NotifyBegin - Execute cue
// NotifyEnd - Remove cue (if looping)
// Parameters
UPROPERTY(EditAnywhere, Category = "Warp")
FName WarpTargetName;
UPROPERTY(EditAnywhere, Category = "Warp")
UCurveFloat* WarpCurve;
// NotifyTick - Update warp progress
Source/S2/
├── Public/AnimNotify/
│ └── USipherANS_{NotifyName}.h
└── Private/AnimNotify/
└── USipherANS_{NotifyName}.cpp
| Type | Prefix | Example |
|------|--------|---------|
| Combat | USipherANS_Combat_ | USipherANS_Combat_HeavySlash |
| VFX | USipherANS_VFX_ | USipherANS_VFX_TrailStart |
| Audio | USipherANS_Audio_ | USipherANS_Audio_Footstep |
| State | USipherANS_State_ | USipherANS_State_Invulnerable |
| Warp | USipherANS_Warp_ | USipherANS_Warp_ToTarget |
Public/AnimNotify/Private/AnimNotify/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".