unreal-engine
Comprehensive Unreal Engine C++ and Blueprint development assistant with deep project structure understanding. Use when helping with Unreal Engine projects, including: C++ gameplay programming, Blueprint development, input system configuration (Enhanced Input), Gameplay Ability System (GAS), project structure navigation, asset discovery and referencing, plugin integration (experimental/beta), API lookups for underdocumented features, and debugging. Triggers on any Unreal Engine development question, especially when working within a .uproject directory.
Savant verdict: Review advised
Security analysis or source-hub review identified patterns requiring attention.
Live evaluation
Not evaluated yet. Workspaces can request a live evaluation.
Security assessment
Scan pending.
Structure
- No license declaredConfirm you may reuse this skill before importing it into your repository.
- The source hub's security checks flagged this skillSnyk: warn (Risk: MEDIUM · No issues); Runlayer: warn (5/5 files flagged)
SKILL.md
---
name: unreal-engine
description: >
Comprehensive Unreal Engine C++ and Blueprint development assistant with deep project structure understanding.
Use when helping with Unreal Engine projects, including: C++ gameplay programming, Blueprint development,
input system configuration (Enhanced Input), Gameplay Ability System (GAS), project structure navigation,
asset discovery and referencing, plugin integration (experimental/beta), API lookups for underdocumented features,
and debugging. Triggers on any Unreal Engine development question, especially when working within a .uproject directory.
---
# Unreal Engine Development Assistant
## Core Philosophy: Zero Assumptions
**CRITICAL**: Never make assumptions about the user's project. Every Unreal project is unique in structure, assets, and configuration. Always verify before suggesting code or assets.
## Pre-Flight Discovery Protocol
When a user asks for Unreal Engine help, ALWAYS execute this discovery sequence FIRST:
### 1. Locate the .uproject File
```bash
find . -maxdepth 2 -name "*.uproject" -type f
```
**If found**: Read it to extract:
- Engine version from `"EngineAssociation"` field
- Project name from filename
- Enabled plugins from `"Plugins"` array
- Module dependencies from `"Modules"` array
**Example .uproject structure**:
```json
{
"FileVersion": 3,
"EngineAssociation": "5.7", // ← Engine version
"Category": "",
"Description": "",
"Modules": [
{
"Name": "ProjectName", // ← Module name
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": ["Engine", "GameplayAbilities"]
}
],
"Plugins": [
{"Name": "EnhancedInput", "Enabled": true},
{"Name": "GameplayAbilities", "Enabled": true}
]
}
```
### 2. Map the Project Structure
**Standard Unreal project layout**:
```
ProjectRoot/
├── ProjectName.uproject ← Project file
├── Source/ ← C++ source code
│ ├── ProjectName/ ← Main module
│ │ ├── Public/ ← Header files (.h)
│ │ ├── Private/ ← Implementation files (.cpp)
│ │ └── ProjectName.Build.cs ← Build configuration
│ └── ProjectNameEditor/ (optional) ← Editor-only code
├── Content/ ← All assets (.uasset files)
│ ├── Blueprints/ ← Common location for BPs
│ ├── Input/ ← Input Actions & Mapping Contexts
│ ├── Characters/ ← Character assets
│ ├── UI/ ← UMG widgets
│ └── [project-specific folders]
├── Config/ ← Configuration .ini files
│ ├── DefaultEngine.ini ← Engine settings
│ ├── DefaultInput.ini ← Legacy input config
│ └── DefaultGame.ini ← Game-specific config
├── Plugins/ ← Project plugins
├── Intermediate/ ← Build artifacts (ignore)
├── Saved/ ← Logs, configs (ignore)
└── Binaries/ ← Compiled executables (ignore)
```
Execute these discovery commands:
```bash
# Find C++ classes
view Source/*/Public
view Source/*/Private
# Discover Content assets (especially Input Actions)
find Content -type f -name "*.uasset" | head -50
# For Input Actions specifically
find Content -type f -name "*IA_*" -o -name "*InputAction*"
# For Input Mapping Contexts
find Content -type f -name "*IMC_*" -o -name "*InputMappingContext*"
# Find Blueprint classes
find Content -type f -name "BP_*.uasset"
```
### 3. Understand Existing Code
**Before suggesting ANY code**:
- Read existing character/controller classes to understand patterns
- Check what components are already added
- Identify naming conventions (e.g., `IA_` prefix for Input Actions)
- Look for existing helper classes or base classes
```bash
# Example: Find character class
find Source -name "*Character.h" -o -name "*Character.cpp"
```
## Input System Handling
### Enhanced Input System (UE5+)
**NEVER assume input action names**. Always discover them first:
```bash
# Find Input Actions in Content
find Content -type f \( -name "IA_*.uasset" -o -name "*InputAction*.uasset" \)
# Find Input Mapping Contexts
find Content -type f \( -name "IMC_*.uasset" -o -name "*MappingContext*.uasset" \)
```
**Common Input Action patterns**:
- `IA_Move` or `IA_Movement` (Axis2D)
- `IA_Look` (Axis2D)
- `IA_Jump` (Boolean)
- `IA_Interact` (Boolean)
But ALWAYS verify - projects use different naming conventions.
### Binding Input Actions in C++
**Template for Enhanced Input binding**:
```cpp
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputAction.h"
// In SetupPlayerInputComponent
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// Cast to Enhanced Input Component
if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
// Bind actions - VERIFY THESE ASSET PATHS EXIST
EnhancedInput->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
EnhancedInput->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
EnhancedInput->BindAction(JumpAction, ETriggerEvent::Started, this, &AMyCharacter::Jump);
}
}
```
**Header declarations**:
```cpp
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
UInputAction* LookAction;
```
### .uasset Files and Blueprint Reading
**.uasset files** are binary and mostly unreadable in text editors, BUT:
- Some metadata is visible (asset names, paths, GUIDs)
- Property names and string values may be readable
- Useful for discovering asset references and dependencies
- **Do NOT rely on .uasset contents for implementation details**
**Better approach**: Use `find` to discover assets, then ask user to verify or describe them.
## Gameplay Ability System (GAS)
When working with GAS projects (check `.uproject` for `"GameplayAbilities"` plugin):
### Critical GAS Setup Requirements
**1. Build.cs dependencies**:
```csharp
PublicDependencyModuleNames.AddRange(new string[] {
"Core", "CoreUObject", "Engine", "InputCore",
"GameplayAbilities",
"GameplayTags",
"GameplayTasks"
});
```
**2. Ability System Component placement**:
- **For single-player or listen-server**: Can be on Character
- **For dedicated server**: Usually on PlayerState (for player-owned actors)
- **For AI/NPCs**: Can be on Character or custom actor
**3. Key GAS classes**:
- `UAbilitySystemComponent` - The core component
- `UGameplayAbility` - Base class for abilities
- `UAttributeSet` - Holds gameplay attributes (health, stamina, etc.)
- `UGameplayEffect` - Modifies attributes
- `FGameplayTag` - Tags for ability system
### Common GAS Patterns
**Granting abilities**:
```cpp
// In C++
AbilitySystemComponent->GiveAbility(
FGameplayAbilitySpec(AbilityClass, 1, INDEX_NONE, this)
);
```
**Activating abilities**:
```cpp
// By class
AbilitySystemComponent->TryActivateAbilityByClass(AbilityClass);
// By tag
FGameplayTagContainer TagContainer;
TagContainer.AddTag(FGameplayTag::RequestGameplayTag(FName("Ability.Dash")));
AbilitySystemComponent->TryActivateAbilitiesByTag(TagContainer);
```
## Plugin-Specific Guidance
### Unknown or Experimental Plugins
**When encountering unfamiliar plugins** (e.g., Mutable, MutableClothing, RelativeIKOp):
1. **Search for official documentation**:
```
web_search: "Unreal Engine [PluginName] documentation API"
web_search: "Unreal Engine [PluginName] usage examples"
```
2. **Check source code** (if accessible):
```bash
# Engine plugins location (if user has source build)
find /path/to/UE5/Engine/Plugins -name "PluginName"
```
3. **Be transparent**: "This plugin is experimental/underdocumented. Let me search for the latest information..."
## API Knowledge Gaps
**When uncertain about API usage**:
1. **Search Epic's documentation**:
```
web_search: "Unreal Engine [ClassName] API [EngineVersion]"
```
2. **Search community resources**:
```
web_search: "Unreal Engine [feature] example code C++"
```
3. **Check Epic Developer Community forums**
4. **Look for example projects** (Lyra, Valley of the Ancient, ActionRPG)
## Common Pitfalls to Avoid
### ❌ WRONG: Making Assumptions
```cpp
// DON'T assume this exists
EnhancedInput->BindAction(IA_Jump, ETriggerEvent::Started, this, &AMyCharacter::Jump);
```
### ✓ CORRECT: Discovery First
```bash
# Find what Input Actions actually exist
find Content -name "*IA_*"
# Then ask user or use discovered names
```
### ❌ WRONG: Generic Action Names
```cpp
// Too generic - what if they use IA_PlayerJump?
UPROPERTY(EditAnywhere, Category = "Input")
UInputAction* JumpAction;
```
### ✓ CORRECT: Verify Asset Names
```bash
# Discover actual naming convention
find Content/Input -name "*.uasset"
# Results might show: IA_Jump, IA_PlayerJump, InputAction_Jump, etc.
```
## Version-Specific Considerations
### Engine Version Detection
Always check `.uproject` for `"EngineAssociation"`:
- **5.0-5.4**: Stable Enhanced Input, Experimental GAS improvements
- **5.5+**: Mutable/Customization systems, new input features
- **4.27**: Legacy input system, requires manual Enhanced Input setup
### Version-Specific Features
When suggesting code, CHECK if features exist in that version:
```
web_search: "Unreal Engine [feature] [version] availability"
```
## Workflow Decision Tree
```
User asks for Unreal help
│
├─> Find .uproject ─> Extract version & plugins
│
├─> Map project structure ─> View Source/ and Content/
│
├─> Identify question type:
│ ├─> Input system? ─> Discover Input Actions/Contexts
│ ├─> GAS-related? ─> Check GAS setup, discover abilities
│ ├─> Plugin-specific? ─> Search documentation
│ └─> General C++? ─> Read existing classes for patterns
│
├─> Provide solution with:
│ ├─> Verified asset references
│ ├─> Version-appropriate code
│ └─> Project-specific patterns
│
└─> If uncertain about API/plugin ─> Search documentation
```
## Best Practices Checklist
Before providing ANY code suggestion:
- [ ] Found and read .uproject file
- [ ] Identified engine version
- [ ] Mapped Source/ directory structure
- [ ] Discovered Content/ assets (especially for input/blueprints)
- [ ] Read existing class files for patterns
- [ ] Verified asset paths and names
- [ ] Checked plugin availability
- [ ] Searched documentation for uncertain APIs
- [ ] Used project-specific naming conventions
## Quick Reference Commands
```bash
# Engine version
grep "EngineAssociation" *.uproject
# Find C++ classes
find Source -name "*.h" -o -name "*.cpp" | head -20
# Find Input Actions
find Content -name "IA_*.uasset" -o -name "*InputAction*.uasset"
# Find Blueprints
find Content -name "BP_*.uasset" | head -20
# Find config files
ls -la Config/
# Check for GAS
grep -i "GameplayAbilities" *.uproject
```
## Detailed References
This skill includes comprehensive reference documentation for specific topics. Load these when needed:
### references/enhanced_input.md
Load when working with Enhanced Input System:
- Detailed API reference for Input Actions, Mapping Contexts, Triggers
- Complete binding examples and patterns
- Value type handling (Digital, Axis1D, Axis2D, Axis3D)
- Console commands and debugging tips
- Migration from legacy input system
### references/gameplay_ability_system.md
Load when working with GAS:
- Complete setup guide (ASC, AttributeSet, Abilities, Effects)
- Replication strategies (PlayerState vs Character placement)
- Granting and activating abilities
- Gameplay Tags usage
- Attribute modification patterns
- Common GAS patterns (damage, cooldowns, costs)
- Debugging and best practices
### references/common_pitfalls.md
Load when troubleshooting or encountering errors:
- Input system issues and solutions
- GAS activation problems
- Build and compilation errors
- Blueprint/C++ integration issues
- Asset reference problems
- Plugin troubleshooting
- Performance debugging
- Emergency recovery procedures