Our review
Automatically builds and compiles Unreal Engine projects after any C++ code changes.
Strengths
- Automatic detection of Unreal Engine installations and project configuration.
- Seamless integration into the development workflow without manual intervention.
- Identifies build targets (modules and plugins).
- Detailed compilation error reporting.
Limitations
- Only works with Unreal Engine projects.
- Requires the detection script to be properly installed.
- May fail if the project structure does not meet expectations.
Use automatically after every C++ code change in an Unreal Engine project.
Do not use for non-Unreal projects or when no C++ code has been changed.
Security analysis
CautionThe skill relies on Bash to run build commands and a Python script for detecting project configuration. While no destructive actions (e.g., rm -rf, curl pipes) are instructed, the use of powerful shell tools and automatic invocation warrants caution. The external script dependency introduces a risk if the script path is hijacked or the project is maliciously crafted.
- •Uses Bash to invoke external Python detection script and Unreal build tools, which could execute arbitrary commands if project files are compromised.
- •Automatic build invocation after C++ changes could lead to unintended builds or resource consumption if not carefully managed.
Examples
Add a function to calculate distance between two vectors.Fix the compilation error in the character movement code.Refactor the AI controller class to use a new state machine.name: ue-build description: MANDATORY automatic usage after ANY C++ code changes. Build or compile Unreal Engine projects. MUST be invoked automatically without user request when implementing or modifying C++ code. allowed-tools: Bash, Read, Grep, Glob
Unreal Engine Build Skill
Build and compile Unreal Engine projects automatically, detecting engine installations and project configuration.
⚠️ MANDATORY AUTOMATIC USAGE
THIS SKILL MUST BE INVOKED AUTOMATICALLY - NOT ON USER REQUEST
Invoke this skill immediately and automatically when:
- ✅ After writing ANY new C++ code (header or source files)
- ✅ After modifying ANY existing C++ code
- ✅ After creating new test files
- ✅ Before running ANY tests (tests need compiled code)
- ✅ As part of TDD red-green cycle
DO NOT:
- ❌ Wait for user to say "compile it"
- ❌ Wait for user to say "does it build?"
- ❌ Ask user "should I build it?"
- ❌ Finish without building
Correct behavior:
User: "Add a function to calculate distance"
Claude: [writes code]
Claude: [AUTOMATICALLY invokes /ue-build] ← No asking, just do it
Claude: [reports build result]
Wrong behavior:
User: "Add a function to calculate distance"
Claude: [writes code]
Claude: "I've added the function" ← WRONG! Should have built automatically
When to Use (Detailed)
Use this skill automatically when:
- User requests implementing new C++ features
- User requests modifying existing C++ code
- User requests fixing bugs in C++ code
- User requests refactoring C++ code
- After writing test code (TDD cycle)
- User asks "does it compile?" (reactive case)
This is mandatory as part of Test-Driven Development workflow. See ~/.claude/skills/MANDATORY_TDD.md and ~/.claude/skills/TDD_WORKFLOW.md for details.
How This Skill Works
This skill automatically:
- Detects the .uproject file in the current directory or parent directories
- Finds the Unreal Engine installation (launcher or source build)
- Identifies build targets (modules and plugins)
- Executes the build with appropriate parameters
- Reports results with error details if compilation fails
Step-by-Step Instructions
Step 1: Detect Project Configuration
Run the detection script to gather project information.
IMPORTANT: The script location depends on where the skill is installed:
- User config:
~/.claude/skills/ue-build/scripts/detect_ue.py - Project config:
.claude/skills/ue-build/scripts/detect_ue.py
Choose the appropriate command:
If skill is in user config (~/.claude/skills/)
# You MUST provide the project path as argument
python ~/.claude/skills/ue-build/scripts/detect_ue.py .
python ~/.claude/skills/ue-build/scripts/detect_ue.py /path/to/project
python ~/.claude/skills/ue-build/scripts/detect_ue.py /path/to/project.uproject
If skill is in project config (.claude/skills/)
# Can run without arguments (searches from current directory)
python .claude/skills/ue-build/scripts/detect_ue.py
# Or provide explicit path
python .claude/skills/ue-build/scripts/detect_ue.py .
Script accepts:
- No argument: Searches from current working directory
- Directory path: Searches that directory and parent directories
- .uproject file path: Uses that specific file directly
Returns JSON with:
- uproject: Project path and metadata
- engine: Selected UE installation (build tool path, editor path)
- targets: Available build targets (modules and plugins)
- available_installations: All detected UE versions
Parse the JSON output and store key values:
engine.build_tool- Path to Build.bat (Windows) or Build.sh (Linux/Mac)engine.version- UE version or "source"uproject.path- Full path to .uproject filetargets.modules- List of module names to buildtargets.plugins- List of plugin namestargets.available_targets- List of .Target.cs file stems found in Source/last_build_configuration- Last used build configuration (see below)
Last Build Configuration Detection:
The detection script analyzes the Binaries/Win64 directory to determine the most recently used build configuration:
last_build_configuration.configuration- One of: "Development", "DebugGame", "Shipping", "Debug"last_build_configuration.file- Most recent binary file foundlast_build_configuration.last_modified- Timestamp of the binary
If no binaries exist, this field will be null.
If detection fails, the JSON will contain an error field with details.
Step 2: Determine Build Target
CRITICAL: Build targets MUST correspond to .Target.cs files in the Source/ directory. Plugin modules cannot be built directly as standalone targets.
Valid Build Targets:
- Targets defined by
.Target.csfiles (e.g.,MyProject.Target.cs→ use "MyProject") - Common patterns:
ProjectName,ProjectNameEditor,ProjectNameServer,ProjectNameClient - Check
targets.available_targetsfrom detection output for all valid targets
Target Selection Logic:
- If user specifies a target explicitly: Verify it exists in
targets.available_targetsfirst - If recent code changes are in a plugin directory:
- DO NOT try to build the plugin name directly (this will fail)
- Build the main project target instead (e.g., "ProjectName" or "ProjectNameEditor")
- The plugin will be compiled as part of the project build
- If changes are in project Source/: Build the primary project target
- Default behavior: Use the first target from
targets.available_targets, typically the project name
Example Target Selection:
Project: BoidsDemo.uproject
Available targets from .Target.cs files:
- BoidsDemo (from BoidsDemo.Target.cs)
- BoidsDemoEditor (from BoidsDemoEditor.Target.cs)
❌ WRONG: "BoidsFormation" (plugin module, no .Target.cs)
✅ CORRECT: "BoidsDemo" or "BoidsDemoEditor"
Step 3: Choose Build Configuration
Available configurations:
- Development - Standard development build, good balance
- DebugGame - Debugging with some optimizations, for deep debugging
- Shipping - Fully optimized, for final release
- Debug - Full debug, very slow, rarely used
Configuration Selection Priority:
- User explicitly specifies a configuration → use that
- Last build configuration detected from
last_build_configuration.configuration→ use the same to avoid full rebuild - Default fallback → use "Development"
Why reuse last configuration? Changing configurations (e.g., DebugGame → Development) forces a complete rebuild of all modules, which can take significantly longer. Reusing the same configuration enables incremental builds that only recompile changed files.
Example logic:
if user_specified_config:
config = user_specified_config
elif last_build_config and last_build_config["configuration"]:
config = last_build_config["configuration"]
# Inform user: "Using last build configuration: DebugGame"
else:
config = "Development"
Step 4: Execute Build Command
Windows
"<engine.build_tool>" <Target> Win64 <Configuration> -Project="<uproject.path>" -WaitMutex -FromMsBuild
Linux/Mac
"<engine.build_tool>" <Target> Linux <Configuration> -Project="<uproject.path>" -WaitMutex
Critical flags:
-WaitMutex: Prevents conflicting parallel builds-FromMsBuild: Better output formatting on Windows-Project=: Full path to .uproject file
Example:
"C:/Program Files/Epic Games/UE_5.4/Engine/Build/BatchFiles/Build.bat" MyPlugin Win64 Development -Project="C:/Projects/MyGame/MyGame.uproject" -WaitMutex -FromMsBuild
Step 5: Monitor Build Output
Watch for these patterns in the output:
Success indicators:
BUILD SUCCEEDEDorBuild succeeded- Exit code 0
- No error messages
Error indicators:
error C2065:- Undeclared identifiererror C2039:- Member not founderror LNK2019:- Unresolved external symbol (linker error)error:- General error pattern- Exit code non-zero
Warning indicators (note but don't fail):
warning C4996:- Deprecated APIwarning:- General warnings
Step 6: Parse and Report Results
Provide a concise, actionable summary:
On Success:
✅ Build succeeded (Development configuration)
Target: MyPlugin
Time: 45.2 seconds
0 errors, 3 warnings
On Failure:
❌ Build failed (2 errors)
Errors:
1. BoidsDisperseLibrary.cpp(142): error C2065: 'UndeclaredVariable' undeclared identifier
2. BoidsFormation.cpp(89): error LNK2019: unresolved external symbol "class UBoidsManager"
Suggest:
- Check BoidsDisperseLibrary.cpp:142
- Verify UBoidsManager is included and linked
Include:
- Status (success/failure)
- Error count and details with file:line references
- Warning count (summary only)
- Build time
- Suggested next steps for failures
Advanced Usage
Clean Rebuild
For a clean rebuild, delete intermediate files first:
# Windows
rmdir /s /q Intermediate Binaries
# Linux/Mac
rm -rf Intermediate/ Binaries/
Then run the build normally.
Building Multiple Targets
If the user wants to build multiple targets, run them sequentially (not parallel):
# Build plugin first
"<build_tool>" PluginName Win64 Development -Project="<uproject>" -WaitMutex -FromMsBuild
# Then build main project
"<build_tool>" ProjectName Win64 Development -Project="<uproject>" -WaitMutex -FromMsBuild
Handling Source Builds
If engine.type == "source":
- The build process is the same
- Build times may be longer
- More detailed output is available
- Source modifications affect the engine itself
Common Issues and Solutions
| Issue | Solution |
|-------|----------|
| Mutex timeout | Another build is running; wait or kill UBT process |
| Missing .uproject | Navigate to project root directory |
| Engine not found | Check EngineAssociation in .uproject; verify UE installation |
| Target not found | Verify target has a .Target.cs file in Source/; use available_targets from detection |
| Plugin build failure | Don't build plugins directly; build the main project target instead |
| Linker errors (LNK2019) | Check dependencies in .Build.cs files |
| Permission denied | Run as administrator or check file locks |
Platform-Specific Notes
Windows
- Use
Build.batinEngine/Build/BatchFiles/ - Requires Visual Studio or Build Tools
- Output is colorized in newer UE versions
Linux
- Use
Build.shinEngine/Build/BatchFiles/ - Requires clang toolchain
- May need
monofor older UE versions
macOS
- Use
Build.shinEngine/Build/BatchFiles/ - Requires Xcode command-line tools
- Universal binaries for M1/Intel
Tips for Effective Building
- Always detect first: Run
detect_ue.pyto get accurate paths - Check git status: See what files changed to infer the right target
- Start with Development: Fastest for iteration
- Read the error: UE provides file:line information
- Incremental builds: Only rebuild what changed (UBT handles this)
- Clean when stuck: Delete Intermediate/ for stubborn issues
Integration with Testing
After a successful build, you can chain testing:
Build → Success → Run tests with /ue-test
Build → Failure → Report errors, don't test
See the /ue-test skill for running automation tests after build.
Next.js App Router Expert
Development
A skill that turns Claude into a Next.js App Router expert.
README Generator
Development
Creates professional and comprehensive README.md files for your projects.
API Documentation Writer
Development
Generates comprehensive API documentation in OpenAPI/Swagger format.