From claude-unreal
Test Unreal Engine gameplay logic end-to-end. Run automation tests, boot maps headlessly with -game and DRIVE THE PLAYER (Enhanced Input injection, held buttons, sequenced inputs, log-reactive flows), and inspect what was logged. Use when the user wants to "test this", "run the tests", "verify this works in-game", "play this map and check what happens", "drive the player", "simulate a button hold", "test the fishing minigame", "see what was logged", "find errors in the log", or any workflow that observes UE behaviour at runtime rather than reading static asset data.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-unreal:gameplay-testerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Verify UE gameplay end-to-end. Combines build, test, scenario-driving, and
Verify UE gameplay end-to-end. Combines build, test, scenario-driving, and log tools.
| Tool | When to use it |
|---|---|
build-cpp | Before anything else if C++ source has changed. The editor can't open with a stale module. |
compile-blueprints | Before tests/scenarios. Catches BP-level errors that would otherwise show up later. |
run-tests | UE Automation tests (C++ IMPLEMENT_SIMPLE_AUTOMATION_TEST and Functional Tests in maps). The closest thing UE has to xUnit. |
run-scenario | Boot a map headlessly. Either send a single execCmds set at boot, OR (preferred for gameplay) pass a scripted steps list that drives the actual player input pipeline. |
read-logs | Read <Project>/Saved/Logs/<Project>.log. Always available after any run. |
execCmdsSingle-shot cvar set, summon, or Quit. Fast, but UE drops anything after
the first command in the ;-separated string, so multi-step sequences are
unreliable. Use this for one-off cvars, not for driving gameplay.
stepsA list of typed steps the in-game Python runner executes in order. This is how you actually test player logic.
[
{"type": "wait", "seconds": 2},
{"type": "exec", "cmd": "Cheat.SpawnRod"},
{"type": "injectAction", "action": "IA_Move", "value": [1.0, 0.0]},
{"type": "wait", "seconds": 0.5},
{"type": "injectAction", "action": "IA_UseItemPrimary", "holdSec": 1.5},
{"type": "waitForLog", "pattern": "LogFish.*cast complete", "timeoutSec": 5},
{"type": "injectAction", "action": "IA_UseItemPrimary"},
{"type": "waitForLog", "pattern": "LogFish.*OnHooked", "timeoutSec": 10},
{"type": "quit"}
]
exec — fire a console command. Best for cvars, cheats, showdebug,
KE * EventName. Single-shot.wait — pause for N seconds of game time. Scales with slomo,
pauses with engine pause.waitForLog — block until a regex matches a line in the live log
(case-insensitive), or timeoutSec elapses. Resumable — sequential
waitForLogs scan forward from where the previous one stopped.injectAction — fire an UInputAction through
UEnhancedInputLocalPlayerSubsystem::InjectInputForAction. The actual
player input code path runs — same handlers, same triggers, same
modifiers as a real keypress. Not a cheat bypass.
action: asset path (/Game/.../IA_Move) or short name (IA_Move)value: number → Axis1D; [x,y] → Axis2D (movement); [x,y,z] → Axis3DholdSec: if set, re-inject every tick for this many game-time seconds
(held buttons, charge-up casts, button-hold triggers)possess — force the local player controller to possess a specific
actor. Useful when the default game mode hasn't spawned the pawn you
want to drive.quit — clean shutdown. Automatically appended when the step list
completes; usually only needed for mid-script aborts.injectAction and possess need the ClaudeUnrealBridge editor-side
plugin installed and the ClaudeUnrealBridgeRuntime submodule loaded.
UE 5.7's Python in -game mode has no built-in way to reach the live
UWorld (GameplayStatics.get_player_controller(None, 0) returns null
because it needs a valid WorldContextObject), so the runner relies on
UClaudeRuntimeLibrary::GetGameWorld() from the plugin.
Without the plugin, exec, wait, and waitForLog still work via
wall-clock fallback — useful for log-driven verification — but
injectAction/possess will return error: no EnhancedInputLocalPlayerSubsystem.
build-cpp then compile-blueprints (or /ue-build).
Stop and report errors here; nothing downstream works if either fails.run-tests with a focused filter
(Project.Foo.), not the whole world. Engine-wide test runs take 10+
minutes.run-scenario with steps. Discover
the project's IA_* assets (search Content/.../Input/ or its
equivalent), construct a step list that exercises the feature, set
logCategories to the project's relevant category (LogFish,
LogQuest, etc.).run-scenario with execCmds for a
single cvar or cheat at boot. Cheaper than the full steps runner.read-logs after any run for context not surfaced
in the immediate output.exec / execCmdske * <FunctionName> — call any custom event named <FunctionName> on
every actor in the world.summon /Script/<Module>.<ClassName> — spawn a C++ class instance at
the player camera location. BP classes don't auto-load this way.showdebug game, stat game, stat unit — debug overlays / counters.t.MaxFPS 60 — pin frame rate so timing-sensitive logic is reproducible.slomo 0.1 — slow time. Combine with wait/waitForLog to capture
detailed state changes.minSeverity: warning keeps responses readable. Drop to
display only when you specifically need normal UE_LOG output (e.g.
per-tick diagnostics).categories to what's relevant. Common gameplay categories:
LogBlueprint, LogTemp, LogScript, LogPython, LogAnimation,
LogPhysics. Projects often add custom ones (LogFish, LogCombat).pattern (regex) to narrow further when chasing a specific bug.blueprint-reader for that.blueprint-architect) writes them.injectAction drives the
Enhanced Input pipeline, which fires gameplay handlers. UI tests need
either Functional Tests with widget-driving helpers, or the user
performing the click manually.npx claudepluginhub august-batista/claude-unreal-bridge --plugin claude-unrealProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.