skills/ue-editor-tools/SKILL.md
Create QoL editor tools for Game Designers, QA Combat Testers, and Enemy/AI Content Makers
npx skillsauth add sipherxyz/universal-ue-skills ue-editor-toolsInstall 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: Editor Tools Engineer Target Users: Game Designers, QA Combat Testers, Enemy AI Content Makers Scope: Editor-only plugins and tools Engine Version: UE 5.7.1 Quality Standard: Production-ready, user-friendly UI
Design and implement Quality of Life (QoL) editor tools that streamline workflows for:
Purpose: Real-time combat data visualization for QA testers
Features:
Implementation Approach:
// UCombatDebugHUDComponent - Add to player/AI
UCLASS()
class SIPHERDEBUGTOOLS_API UCombatDebugHUDComponent : public UActorComponent
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, Category = "Debug")
bool bShowDamageNumbers = true;
UPROPERTY(EditAnywhere, Category = "Debug")
bool bShowHitboxes = false;
UPROPERTY(EditAnywhere, Category = "Debug")
bool bShowComboState = true;
UPROPERTY(EditAnywhere, Category = "Debug")
bool bShowFrameData = false;
// Methods
void DrawDebugHUD(UCanvas* Canvas, APlayerController* PC);
void OnDamageReceived(float Damage, AActor* Source);
void OnComboStateChanged(int32 ComboIndex, FName ComboName);
};
Purpose: Calculate and compare damage values with different configurations
Features:
Purpose: See all active hitboxes in real-time
Features:
Purpose: Visualize and debug AI decision-making
Features:
Implementation Approach:
// SAIBehaviorDebugWidget - Slate window
class SIPHERDEBUGTOOLS_API SAIBehaviorDebugWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SAIBehaviorDebugWidget) {}
SLATE_ARGUMENT(TWeakObjectPtr<AAIController>, TargetAI)
SLATE_END_ARGS()
void Construct(const FArguments& InArgs);
void Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime) override;
private:
TSharedRef<SWidget> BuildStateTreeView();
TSharedRef<SWidget> BuildBehaviorTreeView();
TSharedRef<SWidget> BuildBlackboardView();
void RefreshAIState();
FText GetCurrentStateName() const;
FText GetActiveTaskName() const;
};
Purpose: Rapid encounter setup and testing
Features:
Purpose: Quick enemy spawning for testing
Features:
Purpose: Live-edit gameplay parameters without code changes
Features:
Implementation Approach:
// FParameterTuningModule - Editor module
class SIPHERDESIGNERTOOLS_API FParameterTuningModule : public IModuleInterface
{
public:
void StartupModule() override;
void ShutdownModule() override;
private:
void OpenParameterWindow();
TSharedPtr<SDockTab> ParameterTab;
};
// SParameterTuningWidget - Main widget
class SParameterTuningWidget : public SCompoundWidget
{
// Asset browser for Data Assets
TSharedPtr<SAssetSearchBox> AssetSearch;
TSharedPtr<IDetailsView> DetailsView;
void OnAssetSelected(const FAssetData& AssetData);
void OnPropertyChanged(const FPropertyChangedEvent& Event);
void ApplyChangesToRunningGame();
};
Purpose: Test combo sequences without playing the game
Features:
Purpose: Test GAS abilities in isolation
Features:
Purpose: Validate enemy Blueprints have required components
Features:
Implementation Approach:
UCLASS()
class SIPHERCONTENTTOOLS_API UEnemyBlueprintValidator : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Validation")
static FValidationResult ValidateEnemyBlueprint(UBlueprint* Blueprint);
// Validation rules
static bool HasRequiredComponent(UBlueprint* BP, TSubclassOf<UActorComponent> ComponentClass);
static bool HasValidBehaviorTree(UBlueprint* BP);
static bool HasValidAnimMontages(UBlueprint* BP);
static bool HasValidDataAsset(UBlueprint* BP);
};
Purpose: Browse and preview montages for specific characters
Features:
Purpose: Guided creation of common Data Assets
Features:
Plugins/Frameworks/SipherEditorTools/
├── SipherEditorTools.uplugin
├── Source/
│ ├── SipherEditorTools/
│ │ ├── Public/
│ │ │ ├── SipherEditorToolsModule.h
│ │ │ ├── Combat/
│ │ │ │ ├── SCombatDebugHUD.h
│ │ │ │ ├── SDamageCalculator.h
│ │ │ │ └── SHitboxVisualizer.h
│ │ │ ├── AI/
│ │ │ │ ├── SAIBehaviorDebugger.h
│ │ │ │ ├── SEncounterDesigner.h
│ │ │ │ └── SAISpawnTool.h
│ │ │ ├── Designer/
│ │ │ │ ├── SParameterTuning.h
│ │ │ │ ├── SComboGraphTester.h
│ │ │ │ └── SAbilityTester.h
│ │ │ └── Content/
│ │ │ ├── SEnemyValidator.h
│ │ │ ├── SMontagesBrowser.h
│ │ │ └── SDataAssetWizard.h
│ │ └── Private/
│ │ ├── SipherEditorToolsModule.cpp
│ │ ├── Combat/
│ │ ├── AI/
│ │ ├── Designer/
│ │ └── Content/
│ └── SipherEditorTools.Build.cs
└── Resources/
└── Icon128.png
using UnrealBuildTool;
public class SipherEditorTools : ModuleRules
{
public SipherEditorTools(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine"
});
PrivateDependencyModuleNames.AddRange(new string[]
{
"UnrealEd",
"Slate",
"SlateCore",
"EditorStyle",
"InputCore",
"ToolMenus",
"PropertyEditor",
"AssetRegistry",
"ContentBrowser",
"BlueprintGraph",
"Kismet",
// Game modules
"S2",
"SipherComboGraphRuntime",
"SipherAIScalableFramework",
"GameplayAbilities",
"GameplayTags",
"AIModule"
});
// Editor-only module
if (Target.Type == TargetType.Editor)
{
PrivateDependencyModuleNames.Add("EditorFramework");
PrivateDependencyModuleNames.Add("WorkspaceMenuStructure");
}
}
}
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "Sipher Editor Tools",
"Description": "QoL tools for designers, QA, and content creators",
"Category": "Editor",
"CreatedBy": "Sipher Team",
"CreatedByURL": "",
"DocsURL": "",
"MarketplaceURL": "",
"SupportURL": "",
"EnabledByDefault": true,
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false,
"Modules": [
{
"Name": "SipherEditorTools",
"Type": "Editor",
"LoadingPhase": "Default"
}
]
}
// Use consistent spacing
const float StandardPadding = 4.0f;
const float SectionPadding = 8.0f;
// Use FSlateIcon for tool buttons
FSlateIcon(FAppStyle::GetAppStyleSetName(), "Icons.Edit")
// Consistent button styling
SNew(SButton)
.ButtonStyle(FAppStyle::Get(), "FlatButton.Success")
.ContentPadding(FMargin(4.0f, 2.0f))
// Use expandable sections for organization
SNew(SExpandableArea)
.AreaTitle(LOCTEXT("SectionTitle", "Section Name"))
.InitiallyCollapsed(false)
.BodyContent(...)
// Add to Tools menu
UToolMenu* ToolsMenu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu.Tools");
FToolMenuSection& Section = ToolsMenu->FindOrAddSection("SipherTools");
Section.Label = LOCTEXT("SipherToolsSection", "Sipher Tools");
Section.AddSubMenu(
"CombatTools",
LOCTEXT("CombatToolsMenu", "Combat Tools"),
LOCTEXT("CombatToolsTooltip", "Tools for combat testing"),
FNewToolMenuDelegate::CreateLambda([](UToolMenu* SubMenu)
{
FToolMenuSection& SubSection = SubMenu->AddSection("CombatSection");
SubSection.AddMenuEntry(...);
})
);
// Add toolbar button
UToolMenu* Toolbar = UToolMenus::Get()->ExtendMenu("LevelEditor.LevelEditorToolBar.PlayToolBar");
FToolMenuSection& Section = Toolbar->FindOrAddSection("SipherQuickTools");
Section.AddEntry(FToolMenuEntry::InitToolBarButton(
"SpawnEnemy",
FUIAction(FExecuteAction::CreateLambda([]() { /* spawn logic */ })),
LOCTEXT("SpawnEnemy", "Spawn Enemy"),
LOCTEXT("SpawnEnemyTooltip", "Quick spawn enemy at cursor"),
FSlateIcon(FAppStyle::GetAppStyleSetName(), "Icons.Plus")
));
1. Identify target user and their pain points
2. Define core features (MVP)
3. Sketch UI layout
4. Identify integration points with existing systems
5. Get user approval on design
1. Create plugin structure (if new plugin)
2. Implement data layer (reading game data)
3. Build Slate UI framework
4. Add core functionality
5. Integrate with game systems
1. Add error handling
2. Implement undo/redo where applicable
3. Add tooltips and documentation
4. Performance optimization
5. User testing and feedback
1. Register menu entries
2. Add keyboard shortcuts
3. Create documentation
4. Update plugin changelog
// Custom details for specific class
FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyModule.RegisterCustomClassLayout(
UMyDataAsset::StaticClass()->GetFName(),
FOnGetDetailCustomizationInstance::CreateStatic(&FMyDataAssetDetails::MakeInstance)
);
// Asset picker for selecting Data Assets
SNew(SObjectPropertyEntryBox)
.ObjectPath(this, &SMyWidget::GetAssetPath)
.OnObjectChanged(this, &SMyWidget::OnAssetChanged)
.AllowedClass(UMyDataAsset::StaticClass())
.DisplayBrowse(true)
.DisplayThumbnail(true)
// Get selected actors
TArray<AActor*> SelectedActors;
GEditor->GetSelectedActors()->GetSelectedObjects<AActor>(SelectedActors);
// Debug draw in editor viewport
void FMyEditorMode::Render(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI)
{
DrawDebugSphere(GetWorld(), Location, Radius, 32, FColor::Green, false, -1.0f, SDPG_World);
}
| Tool | Purpose | Priority | |------|---------|----------| | Damage Curve Editor | Visual editing of damage falloff curves | High | | Ability Cost Calculator | Preview resource costs for ability chains | High | | Combat Feel Tuner | Adjust hitstop, screen shake, camera values | Medium | | Difficulty Scaler | Preview enemy stats at different difficulties | Medium |
| Tool | Purpose | Priority | |------|---------|----------| | Combat Log Viewer | Detailed combat event history | High | | Hitbox Recorder | Record and replay hitbox states | High | | Damage Verification | Compare actual vs expected damage | Medium | | Frame Data Overlay | Show startup/active/recovery frames | Medium |
| Tool | Purpose | Priority | |------|---------|----------| | AI Template Creator | Create enemy from template | High | | Behavior Tree Visualizer | See BT execution in real-time | High | | Attack Pattern Editor | Define attack sequences visually | Medium | | Spawn Volume Helper | Quick encounter area setup | Medium |
User: I need a tool for QA to quickly spawn enemies for combat testing
## Legacy Metadata
```yaml
skill: ue-editor-tools
invoke: /editor-tools:ue-editor-tools
type: implementation
category: editor-tools
scope: Plugins/Frameworks/
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".