Unreal Animation Bone Editor
kevinpbuckley/VibeUE
Previews, validates and bakes bone-rotation edits on Unreal Engine AnimSequences, enforcing a coordinate space and a constraint-checked preview-validate-bake loop.
Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge.
$ npx skills add TornLux/UnrealBridge --skill unreal-bridge -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TornLux/UnrealBridge unreal-bridge --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/TornLux/UnrealBridge.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/unreal-bridge .claude/skills/unreal-bridge && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "unreal-bridge" agent skill from https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridge into .claude/skills/unreal-bridge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unreal-bridge", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridgeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add TornLux/UnrealBridge --skill unreal-bridge -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TornLux/UnrealBridge unreal-bridge --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TornLux/UnrealBridge.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/unreal-bridge .agents/skills/unreal-bridge && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "unreal-bridge" agent skill from https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridge into .agents/skills/unreal-bridge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unreal-bridge", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TornLux/UnrealBridge --skill unreal-bridge -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TornLux/UnrealBridge unreal-bridge --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TornLux/UnrealBridge.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/unreal-bridge .cursor/skills/unreal-bridge && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "unreal-bridge" agent skill from https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridge into .cursor/skills/unreal-bridge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unreal-bridge", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/TornLux/UnrealBridge.git --path .claude/skills/unreal-bridge--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add TornLux/UnrealBridge --skill unreal-bridge -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TornLux/UnrealBridge unreal-bridge --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TornLux/UnrealBridge.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/unreal-bridge .gemini/skills/unreal-bridge && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "unreal-bridge" agent skill from https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridge into .gemini/skills/unreal-bridge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unreal-bridge", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install TornLux/UnrealBridge unreal-bridgeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add TornLux/UnrealBridge --skill unreal-bridge -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TornLux/UnrealBridge.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/unreal-bridge .github/skills/unreal-bridge && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "unreal-bridge" agent skill from https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridge into .github/skills/unreal-bridge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unreal-bridge", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TornLux/UnrealBridge --skill unreal-bridge -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TornLux/UnrealBridge unreal-bridge --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TornLux/UnrealBridge.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/unreal-bridge .opencode/skills/unreal-bridge && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "unreal-bridge" agent skill from https://github.com/TornLux/UnrealBridge/tree/main/.claude/skills/unreal-bridge into .opencode/skills/unreal-bridge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unreal-bridge", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
unreal-bridgeExecute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge.
Unreal Bridge is an agent skill from TornLux/UnrealBridge. Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge. Use when the user asks to interact with UE, manipulate assets, query scenes, automate workflows, or run Python in Unreal.
Its SKILL.md is about 8.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 43 other files, including scripts and reference files (for example `references/bridge-anim-api.md`, `references/bridge-asset-api.md` and `references/bridge-blueprint-api.md`).
It sits in Game Development, covering Game development and Workflow automation. It works with Python and Unreal Engine. The repository describes itself as: Typed control surface for Unreal Engine that lets AI agents introspect assets, author Blueprints/AnimBPs, and edit levels — with reactive events and undoable writes. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2db23b5. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteEditGlobGrepMonitorFrom allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Unreal Bridge loads about 8.4k tokens when it runs, and up to ~229k if it reads all its reference files. Until then it costs about 54 tokens; SKILL.md has 3,675 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, MonitorAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from TornLux/UnrealBridge at commit 2db23b5, republished under its MIT licence (© TornLux). 3,675 words, ~8,394 tokens.
.claude/skills/unreal-bridge/SKILL.md (or your agent's skills folder). This skill also uses 42 other files; get the full folder from GitHub.Execute Python directly inside a running UE 5.3+ editor. Protocol-v2 auto-discovery defaults to paired host-local UDP probes: multicast 239.255.42.99:9876 with TTL 0 plus loopback 127.0.0.1:9876. Use --discovery-scope=lan only when another host must be discovered; it raises multicast TTL to 1 while retaining loopback. Malformed replies and Windows UDP reset notifications are skipped independently, valid responses are de-duplicated by Server-start UUID, and wildcard binds use the UDP response source IP. The six pre-existing exact commands remain the minimum capability set; exact_editor_status is advertised and negotiated separately, so an older protocol-v2 endpoint remains usable for its supported base commands. Unique future capabilities remain forward-compatible. Every bounded TCP response is rechecked against the frozen identity. The TCP data port is OS-assigned per editor.
If bridge.py returns discovery: no UnrealBridge editors found, walk these in order — don't troubleshoot Python or firewalls first:
sync_project.bat <UEProjectRoot>. Check: <UEProject>/Plugins/UnrealBridge/UnrealBridge.uplugin exists. The legacy sync_plugin.bat command name accepts the same project-root argument.<UEProject>/<Project>.uproject "Plugins" block for {"Name":"UnrealBridge", "Enabled":false} and flip if present.bridge.py ping returns "ready": true. false means MainFrame still loading; wait 10–60s.The loopback probe keeps local discovery working when multicast is blocked by a VPN, virtual NIC, or Windows firewall policy. The discovery group must be an IPv4 multicast address; direct unicast mode is intentionally fail-closed: --endpoint, --instance-id, --expected-pid, and --expected-project-path (or matching UNREAL_BRIDGE_* variables) are one inseparable tuple. Copy the identity values verbatim from one discovery response or Server startup line; project_path is case- and representation-sensitive on every OS. A host/port alone can be stale and is never used as a legacy fallback. Python 3.7+ stdlib only.
After launching/relaunching the editor, poll readiness with Monitor
(streams progress events, recommended) or Bash with run_in_background: true (one completion event). Don't write a foreground for/sleep
countdown — the harness blocks long leading sleeps and you'll miss readiness.
Paste this verbatim as the command for either tool:
end=$(( $(date +%s) + 300 ))
i=0
until python .claude/skills/unreal-bridge/scripts/bridge.py --json --timeout 3 ping 2>/dev/null | grep -q '"ready": *true'; do
now=$(date +%s)
[ "$now" -ge "$end" ] && { echo "[wait] TIMEOUT after 300s"; exit 1; }
i=$((i + 1))
[ $((i % 3)) -eq 0 ] && echo "[wait] still booting ($((end - now))s left)"
sleep 10
done
echo "[wait] READY"Then call one of:
Monitor(description="UE editor ready-poll", command=<block above>,
timeout_ms=360000, persistent=false)
Bash(description="Wait for UE editor ready", command=<block above>,
run_in_background=true, timeout=360000)Locks (don't change without reading):
"ready": *true — TCP-up ≠ MainFrame-ready. success:true, ready:false
means exec calls will be rejected; ping success alone is not enough.i % 3 echo gate — caps notifications at ~10 over 5 min so Monitor doesn't
trip its event-flood auto-stop.end deadline must stay below the tool timeout_ms/timeout so you
get [wait] TIMEOUT rather than a silent harness kill.${CLAUDE_SKILL_DIR} is not reliably set
in Monitor/Bash subshells — don't substitute it here.bridge.py ping before real
work — bg success is past tense.--project=<name> to the ping inside the loop.rebuild_relaunch.py — it polls
internally and prints [rebuild] bridge is ready. on success.python "${CLAUDE_SKILL_DIR}/scripts/bridge.py" [options] <command> [args]| Command | Purpose |
|---|---|
ping | Check UE connection (TCP-only, doesn't touch GameThread) |
exec "<code>" | Execute single inline statement |
exec --stdin <<'EOF' ... EOF | Multi-line script from stdin (default for >1 line; - is shorthand for --stdin) |
exec-file <path> | Execute a .py file (use when iterating, debugging, or keeping the script) |
preflight <path> | Lint a script for bridge-call errors WITHOUT sending to UE |
suggest [pattern] | Look up the bridge equivalent for a raw unreal.* fallback |
status | Read cached Engine/Slate tick ages, readiness and modal attention without fresh GameThread dispatch |
gamethread-ping | Probe GameThread liveness (bypasses exec queue; use when exec hangs) |
resume | Unstick a paused BP breakpoint |
modal-status | Inspect a blocking Slate dialog: title, body, buttons, inputs and checkboxes |
modal-click <snapshot> <button> | Click one reviewed button; stale snapshots are rejected |
modal-set-text <snapshot> <input> <value> | Fill a reviewed text input (password values are never returned) |
modal-set-checkbox <snapshot> <checkbox> <checked|unchecked> | Change a reviewed checkbox |
list-editors | Print every editor that responded in the selected discovery scope (host-local by default) |
wait-compile <material> / wait-pose-index <psd> | Client-side polling helpers |
Discovery-mode optional flags: --project=<name|path> (disambiguate when >1 editors run; or env UNREAL_BRIDGE_PROJECT), --discovery-scope=local|lan (local default; or env UNREAL_BRIDGE_DISCOVERY_SCOPE), --token=<secret>, --timeout=<s>, --json, --no-preflight. Global flags precede the subcommand, for example bridge.py --discovery-scope=lan list-editors. Direct mode requires the complete --endpoint=host:port --instance-id=<uuid> --expected-pid=<pid> --expected-project-path=<uproject> tuple; none of its four fields is optional.
exec --stdin heredoc, NOT exec-file. A heredoc is the right mode for ~95% of one-shot work — no temp file to name, no cleanup, prompt stays self-contained, no risk of dangling scripts in $TEMP / .tmp / project root. Only reach for exec-file when you genuinely intend to re-run the same script multiple times (iterating on a fix, comparing runs). One-shots like "find X, list Y, build a report" → heredoc. If you find yourself writing with open("/tmp/foo.py", "w") followed by bridge.py exec-file /tmp/foo.py, stop and rewrite as a heredoc.--json for parseable output.0 success · 1 runtime/transport · 2 bad CLI args · 3 AST preflight rejected.exec hangs: read the timeout response first. blocked_by_modal:true
includes the active window and its controls. Otherwise use status
first: it reads cached Engine/Slate ages without dispatching fresh GameThread
work. Follow with gamethread-ping only when a fresh liveness probe is useful,
or resume for a BP breakpoint.Slate dialogs run a nested event loop that blocks the normal Python exec queue. UnrealBridge's modal commands use a separate GameThread task path, so they keep working while the original call is suspended.
modal-status (an exec* timeout does this automatically).snapshot_id and control id returned by that inspection.modal-set-text or modal-set-checkbox, use the new snapshot returned
by that command for the next action. A stale id is deliberately rejected.Example:
python "${CLAUDE_SKILL_DIR}/scripts/bridge.py" --json modal-status
python "${CLAUDE_SKILL_DIR}/scripts/bridge.py" modal-click 8f1a2b3c4d5e6f70 0Password input contents are reported only as <redacted>. These commands cover
UE Slate modals. A platform-native file picker or crash reporter may stop the
GameThread before it can pump this bypass; treat a modal-status GameThread
timeout as a distinct native-window/deadlock diagnosis rather than blind retry.
Multi-line example:
python "${CLAUDE_SKILL_DIR}/scripts/bridge.py" exec --stdin <<'EOF'
from unreal_bridge import Asset
paths, _ = Asset.search_assets_in_all_content(query="Hero", max_results=5)
for p in paths:
print(p.export_text())
EOFWindows path gotcha (Bash tool only): unquoted backslashes get eaten by bash word-splitting — python G:\Claude\UnrealBridge\.claude\skills\unreal-bridge\scripts\bridge.py exec ... arrives as G:ClaudeUnrealBridge.claudeskillsunreal-bridgescriptsbridge.py and fails with "No such file or directory". Use forward slashes (G:/Claude/...) or single-quote the path ('G:\Claude\...'). The body inside <<'EOF' ... EOF is literal and unaffected — only the arg before the heredoc matters. PowerShell tool is unaffected.
from unreal_bridge import Asset, Level, Blueprint, Editor, Anim, Rig, Niagara, Material, PoseSearch, Chooser, StateTree, SmartObject, ...
paths, _ = Asset.search_assets_in_all_content(query="Hero", max_results=20)The wrapper has 26 classes (one per UnrealBridge*Library) with kwargs-only signatures — positional args raise TypeError immediately, no UE round-trip. This is the structural fix for positional-arg-order hallucinations. Regenerate after C++ header changes via python tools/gen_manifest.py.
Fallback: raw unreal.UnrealBridge*Library.foo(...) works (preflight catches errors), but prefer the wrapper.
Every exec* call runs an AST preflight in the bridge client BEFORE sending. Reads scripts/bridge_manifest.json and rejects locally (exit 3, no UE round-trip) when:
unreal.BridgeXxx.YYY enum member doesn't existType validation is NOT done by preflight. Wrong asset paths / wrong scope still surface at runtime — references prose still matters for those.
Treat preflight as a backstop, not a planning tool. If you write code expecting preflight to autocorrect your guesses, you'll produce noisy output and still hit runtime tracebacks for the half it can't catch (USTRUCT field names, Python attribute access, EditDefaultsOnly violations). See "Verify before you call" below.
Bypass with --no-preflight (rare). Preview with bridge.py preflight <path>.
| Symptom | Fix |
|---|---|
Bridge call returns [] for an asset you know exists | Wrong scope: PROJECT covers /Game only; plugin assets need ALL_ASSETS. Use Asset.search_assets_in_all_content(...). |
get_derived_classes hangs / huge results | Don't pass UObject / AActor — narrow to most specific base. |
| Multi-step BP edit feels chatty | Batch with exec --stdin heredoc or exec-file, not 3 inline exec calls. |
| Pawn movement script freezes the editor | time.sleep inside exec blocks GameThread — see bridge-gameplay-api.md "chase a target" pattern (use register_runtime_timer). |
print('中文' / '한글' / '日本語') shows ��� or 涓枃 mojibake | Almost always display-only — the wire is byte-perfect UTF-8. See "Non-ASCII output (CJK / Greek / emoji)" below. |
| Need "where is this GameplayTag used?" / Find References on a tag | unreal.UnrealBridgeGameplayTagLibrary.find_assets_referencing_tag(tag, include_children, ...). Mutations: add_gameplay_tag / rename_gameplay_tag (auto-redirect) / remove_gameplay_tag; pick the target ini via list_tag_source_inis(...). For PrimaryAssetId / other named-value structs use the generic UnrealBridgeAssetLibrary.find_assets_referencing_searchable_name(struct_type, value, ...). See bridge-gameplaytag-api.md. |
| Need to change default materials on a StaticMesh / SkeletalMesh asset | Use Asset.get_mesh_material_slots(...) then set_mesh_material, set_mesh_material_by_slot_name, or atomic set_mesh_materials. Pass save=False for an undoable in-memory comparison. Do not mutate the raw Materials UPROPERTY. |
Preflight is a safety net, not a planning tool. Writing code from imagined API / field / attribute names and waiting for preflight to tell you the right one produces noisy output (4-8 [WARN] per script, often still ending in a runtime traceback) and wastes round-trips. Verify FIRST, then write the script. Four axes:
grep scripts/bridge_manifest.json or read the relevant references/bridge-*-api.md. Don't translate the C++ name into snake_case in your head and assume.BridgeGameplayEffectInfo keep a minimum set of fields (not exhaustive); UE 5.x evolves struct shape between versions. Look up the fields in bridge_manifest.json structs section, OR run a one-off probe print([a for a in dir(obj) if not a.startswith('_')]) BEFORE writing the consumer code.<obj>.<attr>. Always get_editor_property (and respect protected: / EditDefaultsOnly rejection). Use Level.list_actor_properties(actor_name=...) or Level.list_class_properties(class_path=...) to list first.unreal.UnrealBridgeXxx.fn.__doc__ first line is the signature. Cheaper than a guess + correction round-trip.Symptom you're in the bad loop: your last few exec attempts produced [WARN] lines from preflight followed by AttributeError tracebacks. Stop, run one heredoc with dir() / manifest grep, then write the real script.
unreal.*If a bridge call returns empty / errors, suspect your parameters (wrong scope / path / filter), not the wrapper. Falling back to unreal.AssetRegistryHelpers etc. bypasses preflight, audit logging, and often walks 100k–2M registry entries.
Preflight emits [WARN] on known raw-fallback patterns and shows the bridge equivalent inline. To look up before writing: bridge.py suggest [pattern]. Patterns currently mapped:
| Raw pattern | Bridge equivalent |
|---|---|
ar.get_assets_by_path(...) | Asset.list_assets_under_path(folder_path, include_subfolders) |
ar.get_referencers(...) | Asset.get_package_referencers(package_name, hard_only) |
ar.get_dependencies(...) | Asset.get_package_dependencies(package_name, hard_only) |
unreal.GameplayStatics.get_all_actors_of_class(...) | Level.find_actors_by_class(class_path, max_results) |
unreal.GameplayStatics.get_all_actors_with_tag(...) | Level.find_actors_by_tag(tag) |
If you genuinely believe no bridge function covers your case, ask the user before reaching for raw unreal.*.
Signatures are now mechanically enforced (preflight). References carry semantic traps, scope warnings, and workflow patterns preflight can't catch.
| Topic | File | When to read |
|---|---|---|
| Blueprint queries + authoring | references/bridge-blueprint-api.md | Class hierarchy, variables/functions/components, node search, write ops, auto-layout flow, lint loop |
| Asset queries | references/bridge-asset-api.md | Asset lookup, search, references/dependencies, SoftObjectPath stringification (top-of-file block) |
| UMG / Widget | references/bridge-umg-api.md | Read before any Widget Blueprint write. Asset/tree/layout/style authoring, UI-material brushes, batched widget animations, UE 5.7+ MVVM, compile validation, and PIE functional verification. |
| Animation | references/bridge-anim-api.md | ABP state machines, slots, sequences, montages, blend spaces. Authoring an ABP? Read the "Authoring an Animation Blueprint (agent workflow)" section first. |
| Control Rig / IK Rig / IK Retargeter | references/bridge-rig-api.md | Read before any rig or retarget asset write. Type discovery, hierarchy and RigVM authoring, solver/goal/chain setup, retarget ops/mapping/poses/profiles, batch retargeting, compile/processor validation, transient evaluation, animation-quality review, and cleanup. Functional on UE 5.7+. |
| Niagara / VFX | references/bridge-niagara-api.md | Read before any Niagara asset write. Template/script discovery, System/Emitter recipes, module inputs, User parameters, renderers/materials/bindings, compile/audit gates, Trail/Sparks/Explosion/Dissolve presets, moving transient previews, and cleanup. Functional on UE 5.7+. |
| DataTable | references/bridge-datatable-api.md | Schema, rows, fields, search, CSV |
| Material | references/bridge-material-api.md | Material/master/function inspection and delivery: dependency-complete local graph reads, fail-closed/preflighted graph mutation, compile diagnostics, instances, layers, textures, templates, and previews |
| Level / Actor | references/bridge-level-api.md | Level queries, spawn/destroy/move, property get/set, selection |
| Editor session | references/bridge-editor-api.md | Asset open/save, viewport camera, PIE start/stop, console/CVars, BP compile |
| GameplayAbility | references/bridge-gameplayability-api.md | GA Blueprint metadata |
| Generic UPROPERTY read/write (privileged) | references/bridge-property-api.md | When get_editor_property rejects with "protected" / set_editor_property rejects EditDefaultsOnly sub-fields / you need to read private: / bare UPROPERTY() / write nested struct values via export-text. list_u_properties / get_u_property_as_export_text(path, "Modifiers[0].Foo.Bar") / set_u_property_from_export_text (with fire_change_notify for editor refresh) / array_append_u_property (auto-handles FGameplayTagContainer ParentTags) / array_remove_u_property / array_clear_u_property / get_asset_cdo_path. Privileged — bypasses UE editor safety net. Use dedicated APIs (add_gameplay_tag, add_ge_modifier_scalable) when they exist. |
| GameplayTag references / sources / mutations | references/bridge-gameplaytag-api.md | Read: find_assets_referencing_tag (with child-tag expansion), list_all_registered_tags, get_tag_source_info. Write: add_gameplay_tag(tag, source_ini='', comment=''), rename_gameplay_tag(old, new, rename_children=True) (auto-inserts redirect, redirect lifetime hardened — survives subsequent mutations + cold restart), remove_gameplay_tag(tag). Source enum: list_tag_source_inis(filter_type=''). Redirect ops: list_gameplay_tag_redirects(source='', old_prefix='') + remove_gameplay_tag_redirect(old, new) for enumerate-then-sweep. Built on the AssetRegistry SearchableName index + IGameplayTagsEditorModule. bridge-asset-api.md "SearchableName Index" has the generic read version (PrimaryAssetId, custom named-value structs). |
| Motion Matching — PoseSearch | references/bridge-pose-search-api.md | Read before any PSS / PSD read or write — DatabaseAnimationAssets / Channels are private: and unreachable via get_editor_property; this lib is the only path. Includes wait-pose-index CLI. |
| Motion Matching — Chooser | references/bridge-chooser-api.md | Read before any CHT read or write — ResultsStructs / DisabledRows etc. are private:; this lib is the only path. Covers NestedChooser :Name paths, matched_row=-1 caveat, and the auto Compile+PostEditChange contract. |
| StateTree authoring + runtime | references/bridge-statetree-api.md | Read before any StateTree write. GUID-first hierarchy/node/transition workflows, schema-filtered type discovery, reflected node-property discovery, bindings, parameters, compile diagnostics, transient breakpoints, and PIE component control. Functional on UE 5.7+. |
| Smart Object authoring + runtime | references/bridge-smartobject-api.md | Read before any Smart Object write or claim. Definition/slot/behavior/data/annotation editing, World Conditions, parameters/bindings, world components and persistent collections, runtime query/claim/occupy/release, tags/events, and entrance validation. Functional on UE 5.7+; claim tokens are session-local and must be released. |
| Reactive handlers | references/bridge-reactive.md | Register Python on UE events (GameplayEvent / AnimNotify / MovementMode / Attribute / ActorLifecycle / InputAction). |
| Navigation | references/bridge-navigation-api.md | NavMesh OBJ export |
| Perf snapshots | references/bridge-perf-api.md | Structured FPS / GT / RT / GPU / draw calls / mem / UObject histogram |
| Agent / Gameplay | references/bridge-gameplay-api.md | Mandatory before driving the player pawn — sticky inputs, camera steering, navmesh path planning. |
| UE Asset / Actor / Material | references/ue-python-*.md | Stdlib UE Python helpers (load, list, duplicate, spawn) |
Creating a WidgetTree is not completion. For every agent-authored screen:
FSlateBrush properties with the UMG library.compile_and_validate_widget_blueprint(..., save=True) to succeed with no errors.remove_widget_instance / remove_all_widget_instances before stopping PIE. Delete validation-only assets from their exact dedicated folder and verify both Asset Registry and backing files are empty.The exact API sequence, MVVM modes, animation key structs, runtime semantics, and cleanup checklist are in references/bridge-umg-api.md.
Creating assets or obtaining a clean compile is not completion. For every agent-authored Control Rig or retarget setup:
validate_control_rig(..., save=True) to succeed, then call
evaluate_control_rig on a transient instance and verify expected control
and bone transforms for at least one non-default input.analyze_animation_quality on representative output and review root
spikes, planted-foot sliding/penetration, and joint angular discontinuities;
visual playback remains required for final artistic acceptance.The exact type-discovery calls, export-text property rules, RigVM addressing,
retarget workflow, validation gates, and cleanup checklist are in
references/bridge-rig-api.md.
Creating or cleanly compiling a Niagara System is not completion. For every agent-authored effect:
User.* parameter
by input readback, then require compile_niagara_system(..., save=True) to
report valid, ready, zero-error output.validate_niagara_system to pass; resolve null materials, missing
GPU bounds, disabled/empty content, and budget findings.set_niagara_preview_transform(..., teleport=False) with short simulation
advances so the component samples a real path.The exact recipe structs, stack/input modes, renderer/material rules, preset
semantics, cold-load compile behavior, moving-preview pattern, and cleanup
checklist are in references/bridge-niagara-api.md.
Pawn control is non-obvious — read
bridge-gameplay-api.mdfirst. Driving the player (stickyIA_Move,apply_look_input, navigating to a moving target, holding an input over time) has hard constraints a fresh API read won't reveal:bridge.execruns on GameThread sotime.sleepinside oneexecfreezes the engine and stops the sticky ticker; continuous steering must run from a reactiveregister_runtime_timercallback, not a Pythonwhileloop;IA_Moveis camera-relative and the forward-axis convention varies per project. The "Pattern: chase a (possibly moving) target and stop on arrival" section has the working template.
Asset lookup by name defaults to
search_assets_in_all_content(name, max_results). When the user names an asset without a path, do not callunreal.AssetRegistryHelpers.get_assets_by_path('/Game', recursive=True)and filter — that walks 100k–2M+ entries and times out. The fullsearch_assetsform needsBridgeAssetSearchScope.ALL_ASSETS(notPROJECT) when the asset might live in a plugin mount (/PluginName/...).PROJECTcovers/Gameonly; using it for a plugin asset returns[]silently. Valid scope members:ALL_ASSETS,PROJECT,CUSTOM_PACKAGE_PATH— there is noGAME_FOLDER.
非必要不写蓝图 Node 和 Graph. Agent-authored BPs are visibly weaker than C++ on readability/maintainability/perf. Default response to "用蓝图实现 X":
UFUNCTION(BlueprintCallable) with thin BP wrapper, or another bridge surface (Material / Anim / UMG / DataTable / Level).Exceptions (skip the dance):
set_blueprint_variable_default etc.) without new nodesAGENTS.md, CLAUDE.md, or current conversationHard line: any op spawning/connecting/removing nodes, adding events, or creating functions needs the confirmation dance.
After authoring/modifying a BP graph (and the user confirmed they want it):
1. plan — list events / functions / local vars in text first
2. build — add_*_node / connect_graph_pins / add_blueprint_variable …
3. auto_layout — MANDATORY after ANY graph mutation; use 'pin_aligned' (3-exec flow) or 'exec_flow' (bulk).
See bridge-blueprint-api.md for the exact open→sleep→layout sequence.
4. lint — lint_blueprint(...) and resolve every warning/error
5. collapse — collapse_nodes_to_function on any LongExecChain finding
6. straighten — straighten_exec_chain on main rails (after 'exec_flow' only)
7. comment — add_comment_box + set_comment_box_color per section (>10 nodes = mandatory)
8. compile — compile_blueprints cleanUnnamedCustomEvent / CustomEvent_0 to intent (OnHealthChanged)."1. Validate inputs", "2. Apply damage") and an appropriate preset color (Section, Validation, Danger, Network, UI, Debug, Setup).auto_layout_graph(... 'pin_aligned' ...) uses DFS-ordered leaves + downstream-driven Y alignment + live Slate geometry — matches hand-laid BP shape (.then rails horizontal, siblings stacked in one column). Requires the three-exec flow (open graph → sleep → layout) to read live widgets. Use 'exec_flow' (Sugiyama-lite, layer-center Y) for bulk tidy on large graphs where pixel-accuracy matters less, then follow with straighten_exec_chain on the main rail.pin_aligned treats h_spacing as a loose upper bound and internally uses DataHSpace = max(15, h/3) and ExecGap = max(30, h/2) — so h_spacing=100 renders tighter than the raw number suggests. Pass smaller values (40, 32) for max density.predict_node_size for each kind first so X offsets don't overlap.auto_layout_graph runs, Slate widgets don't refresh NodePosX/Y until they tick — so get_rendered_node_info returns pre-layout pin coords in the same exec. For crossing-detection / wire-length audits right after layout, read get_node_layout(bp, fn, guid).pos_* (authoritative from node model) and estimate pin Y as pos_y + 40 + 22 × dir_index. Only pay the open-graph + sleep cost when you specifically need Slate-accurate coords.auto_insert_reroutes is intentionally NOT in the loop — empirically it produces many-knot routing that reads worse than the original. Opt in per-graph if a specific case needs it.Bridge is UTF-8 byte-perfect end-to-end since 2026-05-04. Mojibake = display, not data. Confirm with hex:
print(got.encode('utf-8').hex(), '==', '测试'.encode('utf-8').hex())If hex matches, it's a Windows cp936/cp1252 console issue — fix the display, not the bridge:
| Situation | Fix |
|---|---|
Piping bridge.py ... > out.txt writes cp936 | prefix PYTHONIOENCODING=utf-8 (bash) / $env:PYTHONIOENCODING='utf-8' + | Out-File -Encoding utf8 (PS) |
| Reading saved file back | open(p, encoding='utf-8') (or utf-8-sig for PS BOM) |
| Calling bridge.py from another Python process | set PYTHONIOENCODING=utf-8 in subprocess env |
Verified: identifiers + literals in script source, exception messages/tracebacks, DataTable FName keys, asset paths with Chinese folders, save→restart→read persistence. Korean/Japanese use the same UTF-8 path — verify with hex if anything looks off.
**Never write temp files to C:\ root** — use $env:TEMP\… or /tmp/….
unreal.ScopedEditorTransaction.exec calls.print() returns to bridge; unreal.log() only to UE Output Log.import json; print(json.dumps(...)) with --json.ping fails: editor not running, plugin not enabled, or wrong project (preconditions above).--timeout 120.© TornLux, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 42 other files (scripts, references) in .claude/skills/unreal-bridge of TornLux/UnrealBridge.
Open the folder on GitHubat commit 2db23b5
Unreal Bridge next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Unreal Bridge this skillTornLux/UnrealBridge | 306 | — | ~8.4k | Automated safety check: Notes | MIT | |
| Unreal Animation Bone Editorkevinpbuckley/VibeUE | 730 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Unreal Enhanced Input Setupkevinpbuckley/VibeUE | 730 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Unreal Gameplay Tagskevinpbuckley/VibeUE | 730 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Vibeuekevinpbuckley/VibeUE | 730 | — | ~5.2k | Automated safety check: Pass | MIT | |
| Scenario Unreal Cinematicsscenario-labs/skills | 946 | — | ~5.1k | Automated safety check: Pass | MIT |
kevinpbuckley/VibeUE
Previews, validates and bakes bone-rotation edits on Unreal Engine AnimSequences, enforcing a coordinate space and a constraint-checked preview-validate-bake loop.
kevinpbuckley/VibeUE
Creates and wires Unreal Engine Enhanced Input assets through VibeUE's InputService: Input Actions, Mapping Contexts, key bindings, triggers and modifiers.
kevinpbuckley/VibeUE
Registers and queries Unreal Engine Gameplay Tags from the editor through VibeUE, including bulk registration and hierarchy lookups, with no restart needed.
kevinpbuckley/VibeUE
Unreal Engine 5 development using the VibeUE Python API. An agent skill from kevinpbuckley/VibeUE.
scenario-labs/skills
A skill your agent uses when making a trailer, cutscene, cinematic or short film in Unreal Engine 5.8 with Sequencer: shot lists, master and shot sequences, cameras, lenses, depth of field, camera…
scenario-labs/skills
A skill your agent uses when importing FBX, USD, OBJ or glTF from Maya, ZBrush or Blender into Unreal Engine 5.8 in bulk or reimporting changed files, writing Editor Python tools, Interchange…
Works with
Categories
Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge. Unreal Bridge is an agent skill from TornLux/UnrealBridge.3+ editor via TCP bridge.
Unreal Bridge fits situations like: the user asks to interact with UE; manipulate assets; automate workflows; run Python in Unreal.
Run `npx skills add TornLux/UnrealBridge --skill unreal-bridge -a claude-code`. Or copy the skill folder (.claude/skills/unreal-bridge in TornLux/UnrealBridge) into .claude/skills/unreal-bridge in your project. Claude Code loads it when a task matches its description.
Run `npx skills add TornLux/UnrealBridge --skill unreal-bridge -a codex`. Or copy the skill folder (.claude/skills/unreal-bridge in TornLux/UnrealBridge) into .agents/skills/unreal-bridge in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TornLux/UnrealBridge --skill unreal-bridge -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unreal-bridge, .gemini/skills/unreal-bridge, .github/skills/unreal-bridge and .opencode/skills/unreal-bridge in your project.
Going by SKILL.md and its folder, Unreal Bridge needs the command-line tools its instructions call (python). Our summary lists: Python 3. Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, Glob, Grep, Monitor.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Unreal Bridge is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.4k tokens (SKILL.md is roughly 34k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 221k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Unreal Bridge: Unreal Animation Bone Editor (kevinpbuckley/VibeUE, 730 stars), Unreal Enhanced Input Setup (kevinpbuckley/VibeUE, 730 stars), Unreal Gameplay Tags (kevinpbuckley/VibeUE, 730 stars) and Vibeue (kevinpbuckley/VibeUE, 730 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
TornLux (a GitHub user) maintains it in TornLux/UnrealBridge, which has 306 GitHub stars. The repository was last updated on October 1, 2026.
Source: TornLux/UnrealBridge on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.