[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-11245":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":15,"starSnapshotCount":15,"syncStatus":16,"lastSyncTime":28,"discoverSource":29},11245,"UnrealBridge","TornLux\u002FUnrealBridge","TornLux","Typed control surface for Unreal Engine that lets AI agents introspect assets, author Blueprints\u002FAnimBPs,   and edit levels — with reactive events and undoable writes.","",null,"C++",274,47,4,0,2,12,90,6,64.04,"MIT License",false,"main",[],"2026-06-12 04:00:54","\u003Cp align=\"center\">\n  \u003Ch1 align=\"center\">UnrealBridge\u003C\u002Fh1>\n  \u003Cp align=\"center\">\n    \u003Cstrong>Give your AI Agent the ability to control and edit Unreal Engine.\u003C\u002Fstrong>\n  \u003C\u002Fp>\n  \u003Cp align=\"center\">\n    \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg\" alt=\"License\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fwww.unrealengine.com\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FUnreal%20Engine-5.3%2B-313131?logo=unrealengine\" alt=\"UE5.3+\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fwww.python.org\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Python-3776AB?logo=python&logoColor=white\" alt=\"Python\">\u003C\u002Fa>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-C%2B%2B-00599C?logo=cplusplus&logoColor=white\" alt=\"C++\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-Windows-0078D6?logo=windows\" alt=\"Windows\">\n    \u003Ca href=\"https:\u002F\u002Fclaude.ai\u002Fcode\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FClaude%20Code-skill-D97757\" alt=\"Claude Code\">\u003C\u002Fa>\n    \u003Ca href=\"README.zh-CN.md\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flang-%E4%B8%AD%E6%96%87-red\" alt=\"中文\">\u003C\u002Fa>\n  \u003C\u002Fp>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fimages\u002Fen\u002F01-hook.png\" alt=\"UNREAL ENGINE 5.4+ — FULL CONTROL for your AI Agent\">\n\u003C\u002Fp>\n\n---\n\nUnrealBridge is an Unreal Engine editor bridging layer built for AI Agents. It provides a typed operation surface for core scenarios such as animation-asset introspection, reactive event subscription, asset search and reference analysis, and automatic layout of Blueprint graphs. The Agent issues queries and modifications against a locally running editor instance; every change takes effect in real time, is bounded by the transaction system, and is undoable.\n\n## Highlights\n\n- **AST-based hallucination defense.** Before any script reaches UE, `bridge_preflight.py` parses it as Python AST and validates every `unreal.UnrealBridge*Library.fn(...)` call against an auto-generated manifest (21 libraries × 1021 UFUNCTIONs) — catching unknown function\u002Flibrary names (with did-you-mean), wrong positional arg counts, unknown kwargs, and non-existent bridge-enum members **without ever round-tripping to the editor**. A second layer redirects raw `AssetRegistry` \u002F `GameplayStatics` usage patterns to their bridge equivalents and tracks each returned value's type so attribute access on a `str` or `SoftObjectPath` doesn't silently misbehave; on a real `AttributeError` from a UE object the bridge calls back into UE Python, lists that live class's reflected `UPROPERTY`s, and emits a paste-ready correction (auto-handles `snake_case` ↔ `PascalCase` mismatches). A third layer ships a kwargs-only Python wrapper module so positional-arg-order errors are structurally impossible. Together these dropped a fresh-context agent's bridge-call failure rate from **24% → 16%** across A\u002FB validation runs — protection that prompt-only \"look-up-before-call\" rules in `SKILL.md` had failed to deliver.\n\n  \u003Cp align=\"center\">\n    \u003Cimg src=\"docs\u002Fimages\u002Fen\u002F02-preflight.png\" alt=\"Local AST preflight — stop hallucinations before they reach UE\">\n  \u003C\u002Fp>\n\n- **Deep asset-structure introspection + author-level write ops.** `UnrealBridgeAnimLibrary` covers full queries over AnimBP state machines, AnimGraph nodes, linked layers, slots, curves, Sequence \u002F Montage \u002F BlendSpace, and the skeleton tree — paired with a full suite of write ops: building an ABP from scratch, adding \u002F removing states \u002F transitions \u002F condition rules, creating and wiring AnimGraph nodes, auto-layout of both the state machine and AnimGraph. `UnrealBridgeAssetLibrary` goes beyond keyword search with forward-dependency and reverse-reference analysis, surfacing a complete dependency view to the Agent. Compared with basic CRUD wrappers or schemes that require hand-assembled reflection calls, this level of structured capability is available out of the box.\n- **Reactive event subscription.** The Agent can subscribe to GAS events, attribute changes, actor lifecycle, AnimNotify, input, timers, and editor-side asset-change events. When the specified event fires, the bridge calls back proactively — no polling needed. This is a scenario that a pure request \u002F response protocol cannot cover.\n- **Agent control surface at PIE runtime.** `UnrealBridgeGameplayLibrary` provides aggregated world observation, navigation pathfinding, and input operations for movement \u002F look \u002F jump — suitable for AI-behavior validation, automated testing, and in-game NPC prototyping.\n- **Blueprint graph quality toolchain.** More than just auto-layout: `auto_layout_graph`'s `pin_aligned` strategy reads live Slate geometry to align exec rails, `straighten_exec_chain` snaps the main rail, `collapse_nodes_to_function` extracts subgraphs, `lint_blueprint` scans by fixed rules for orphans \u002F unnamed nodes \u002F oversized functions \u002F uncommented large graphs, and `add_comment_box` + preset palette (Section \u002F Validation \u002F Danger \u002F Network \u002F UI \u002F Debug \u002F Setup) partition graphs for readability. AnimGraph and state machines get dedicated `auto_layout_anim_graph` \u002F `auto_layout_state_machine` (the latter recurses into each state's inner graph + every transition rule graph).\n- **Native Python execution.** 21 `UnrealBridge*Library` surfaces expose ~1020 `UFUNCTION`s in total, covering common subsystems; un-wrapped capabilities are reachable directly through the native `unreal.*` API. Compared to fixed-tool-list MCP schemes or reflection protocols that expose only a single `call` command, this design strikes a balance between flexibility and structure. Every level write op is wrapped in `FScopedTransaction` and supports standard Undo \u002F Redo.\n\n## Architecture\n\n```mermaid\nflowchart LR\n    Agent[\"AI Agent\"]\n\n    subgraph Host[\"Agent host\"]\n      CLI[\"bridge.py\"]\n      Pre[\"AST preflight\u003Cbr\u002F>(local — rejects bad calls\u003Cbr\u002F>before TCP send)\"]\n      Mani[(\"bridge_manifest.json\u003Cbr\u002F>21 libs · 1021 UFUNCTIONs\")]\n    end\n\n    Gen[\"tools\u002Fgen_manifest.py\u003Cbr\u002F>scans C++ headers\"]\n\n    subgraph UE[\"Unreal Editor 5.3+\"]\n      Disc[\"FUnrealBridgeDiscovery\u003Cbr\u002F>UDP responder\"]\n      Server[\"FUnrealBridgeServer\u003Cbr\u002F>TCP · length-prefixed JSON\"]\n      Reactive[\"UnrealBridgeReactiveSubsystem\u003Cbr\u002F>+ 10 event adapters\"]\n      Exec[\"IPythonScriptPlugin::\u003Cbr\u002F>ExecPythonCommandEx\u003Cbr\u002F>(GameThread)\"]\n      Wrap[\"unreal_bridge\u003Cbr\u002F>kwargs-only wrapper\u003Cbr\u002F>(optional safer surface)\"]\n      Libs[\"21× UnrealBridge*Library\"]\n      Engine[\"UEditor · UWorld · Assets\"]\n    end\n\n    Agent --> CLI\n    CLI -- \"AST gate\" --> Pre\n    Pre -. \"lookup\" .-> Mani\n\n    Gen -- \"writes\" --> Mani\n    Gen -- \"writes\" --> Wrap\n\n    CLI -- \"UDP probe\u003Cbr\u002F>239.255.42.99:9876\" --> Disc\n    CLI -- \"TCP \u002F JSON\u003Cbr\u002F>(port from discovery)\" --> Server\n    Server -- \"RPC script\" --> Exec\n    Engine -. \"delegate fires\" .-> Reactive\n    Reactive -- \"handler script\" --> Exec\n\n    Exec -- \"user code calls\" --> Libs\n    Exec -. \"or via\" .-> Wrap\n    Wrap --> Libs\n    Libs --> Engine\n```\n\n## Quick Start\n\n### 1. Clone the repo\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002F\u003Cyour-fork>\u002FUnrealBridge.git\ncd UnrealBridge\n```\n\n### 2. 🚨 Run `link_agents_skills.bat` (one-time)\n\n**Required for Codex \u002F Gemini CLI \u002F OpenCode \u002F Cursor.** Skip if you only use Claude Code.\n\nThe skill source of truth lives at `.claude\u002Fskills\u002F`. This script creates an NTFS junction at `.agents\u002Fskills\u002F` so every Agent runtime following the [Agent Skills open standard](https:\u002F\u002Fwww.agensi.io\u002Flearn\u002Fagent-skills-open-standard) sees the same content. Junctions can't be committed (Windows git limitation), so each clone has to materialize it locally — **once**.\n\n```bat\nlink_agents_skills.bat\n```\n\nMac \u002F Linux equivalent: `ln -sfn .claude\u002Fskills .agents\u002Fskills` (run from repo root).\n\n### 3. Install the plugin\n\nEdit the `DST` line in `sync_plugin.bat` to point at your UE project's `Plugins\u002F` folder:\n\n```bat\nset \"DST=D:\\Path\\To\\YourProject\\Plugins\\UnrealBridge\"\n```\n\nRun `sync_plugin.bat`. It mirrors `Plugin\u002FUnrealBridge\u002F` into the project, skipping `Binaries\u002F` and `Intermediate\u002F`.\n\n### 4. Build & launch\n\nOpen the `.uproject` and let UE rebuild the plugin automatically, or run the project's `Build.bat` from the command line. Launch the editor — the plugin starts the server at `PostEngineInit`. You're good once `LogUnrealBridge: Listening on 127.0.0.1:\u003Cport>` shows up in the log (the port is OS-assigned; the client finds it via multicast — no manual config needed).\n\n### 5. Verify\n\n```bash\npython .claude\u002Fskills\u002Funreal-bridge\u002Fscripts\u002Fbridge.py ping\n# → pong\npython .claude\u002Fskills\u002Funreal-bridge\u002Fscripts\u002Fbridge.py exec \\\n  \"import unreal; print(unreal.UnrealBridgeLevelLibrary.get_level_summary())\"\n```\n\n### Claude Code integration (optional)\n\nCopy the skill somewhere Claude Code can discover it:\n\n```bash\ncp -r .claude\u002Fskills\u002Funreal-bridge ~\u002F.claude\u002Fskills\u002F            # user-wide\n# or into the target project's own .claude\u002Fskills\u002F\n```\n\nFor `rebuild_relaunch.py` to auto-relaunch the editor, set one of:\n\n```bash\nsetx UNREAL_EDITOR_EXE \"C:\\Program Files\\Epic Games\\UE_5.7\\Engine\\Binaries\\Win64\\UnrealEditor.exe\"\nsetx UE_ROOT            \"C:\\Program Files\\Epic Games\\UE_5.7\"\n```\n\n### Quick usage\n\nOnce the skill is installed, drop any of these into a Claude Code session:\n\n- *\"List every PointLight in the current level.\"*\n- *\"Move the PlayerStart up by 200 units.\"*\n- *\"Compile `\u002FGame\u002FBlueprints\u002FBP_Character` and tell me whether it has errors.\"*\n- *\"Show me the state machines inside `\u002FGame\u002FAnimations\u002FABP_Hero`.\"*\n- *\"Create an ABP on `SK_Mannequin` with an Idle \u002F Walk \u002F Run state machine driven by a `Speed` variable (>10 enters Walk, >200 enters Run), then layer a Slot + LayeredBoneBlend in the outer graph for an upper-body overlay.\"*\n\nThe Agent reads `SKILL.md`, picks the right `UnrealBridge*Library` function, calls it through `bridge.py`, and reports back.\n\n## Usage\n\n### CLI\n\n```bash\nbridge.py ping\nbridge.py exec \"print('hello from UE')\"\nbridge.py exec-file my_script.py\n```\n\nFlags (all optional — the common case works with no flags):\n\n- `--project=\u003Cname|path>` — disambiguate when >1 editors are running\n- `--endpoint=host:port` — skip discovery, connect directly (also env `UNREAL_BRIDGE_ENDPOINT`)\n- `--token=\u003Csecret>` — only when the server binds non-loopback (also env `UNREAL_BRIDGE_TOKEN`)\n- `--timeout` (default 30s), `--json`, `--discovery-timeout=\u003Cms>` (default 800)\n\n`bridge.py list-editors` sends a probe and lists every editor that answered — handy for multi-editor setups.\n\n### From Python inside UE\n\n```python\nimport unreal\n\nsummary = unreal.UnrealBridgeLevelLibrary.get_level_summary()\nprint(summary)\n\nlights = unreal.UnrealBridgeLevelLibrary.find_actors_by_class(\n    \"\u002FScript\u002FEngine.PointLight\", 50\n)\nprint(len(lights), \"point lights\")\n```\n\n### Two reload loops\n\n```bash\npython .claude\u002Fskills\u002Funreal-bridge\u002Fscripts\u002Fhot_reload.py        # body-only edits\npython .claude\u002Fskills\u002Funreal-bridge\u002Fscripts\u002Frebuild_relaunch.py  # reflection changes\n```\n\n## Bridge libraries\n\n| Library | Purpose |\n|---|---|\n| `UnrealBridgeServer` | TCP listener, length-prefixed JSON framing, GameThread dispatch |\n| `UnrealBridgeBlueprintLibrary` | Full-stack Blueprint read \u002F write: class hierarchy \u002F variables \u002F functions \u002F components \u002F interfaces \u002F event dispatchers; graph call relationships, exec flow, pin connections, node search; 20+ node-type insertion (Branch, Cast, loops, Delay, Timer, SpawnActor, MakeStruct, …), pin connect, node-coordinate read \u002F write, alignment, comment boxes, AutoLayoutGraph; runtime debug — set\u002Flist\u002Fclear breakpoints, `get_last_breakpoint_hit` captures function locals\u002Fparams\u002Freturn **plus** the executing object's BP-class instance variables (tagged with `OwnerClass`), PIE node coverage; compile-error query |\n| `UnrealBridgeAssetLibrary` | Asset keyword search (include \u002F exclude tokens); derived-class query; forward-dependency and reverse-reference analysis (recursive); DataAsset \u002F StaticMesh \u002F SkeletalMesh \u002F Texture \u002F Sound metadata; folder tree, redirector resolution, batch tag and disk-size query; **SearchableName index queries** (`find_assets_referencing_searchable_name` \u002F `get_searchable_names_used_by_asset` \u002F `list_searchable_name_values`) — the data backing the editor's right-click \"Find References\" on a `GameplayTag` \u002F `PrimaryAssetId` \u002F any USTRUCT-keyed named value |\n| `UnrealBridgeAnimLibrary` | AnimBP deep introspection: state machines, AnimGraph nodes, linked layers, slots, curves; Sequence \u002F Montage \u002F BlendSpace asset info; skeleton tree, Sockets, VirtualBone, BlendProfile. **Write ops**: ABP creation and variables, state machine \u002F state \u002F conduit \u002F transition add \u002F remove \u002F modify, transition properties (crossfade, priority, bidirectional), const-rule shortcut and real variable-driven rules (paired with the BP library to author `KismetMathLibrary` comparator nodes), 9 typed AnimGraph node factories + `add_anim_graph_node_by_class_name` fallback, pin connect \u002F disconnect \u002F reorder, auto-layout of AnimGraph and state-machine interiors; AnimNotify, sync marker, Montage Section, Socket CRUD |\n| `UnrealBridgePoseSearchLibrary` | Motion Matching — `UPoseSearchSchema` \u002F `UPoseSearchDatabase` introspection: schema channels and weights, database animation entries, sampling \u002F branch sampling, indexing status (`wait-pose-index` CLI helper); pose evaluation against a runtime pose vector. The `DatabaseAnimationAssets` \u002F `Channels` arrays are `private:` in C++ and unreachable via `get_editor_property` — this library is the only path |\n| `UnrealBridgeChooserLibrary` | Motion Matching — `UChooserTable` introspection and authoring: columns, rows (with disabled flag and resolved result), context objects, NestedChooser drill-down (`:Name` paths). Write ops: column add \u002F remove, row add \u002F remove, set context object class with auto-Compile + PostEditChange so the editor refreshes. The `ResultsStructs` \u002F `DisabledRows` arrays are `private:` in C++ — this library is the only path |\n| `UnrealBridgeDataTableLibrary` | DataTable row-level read \u002F write with conditional filters; CSV \u002F JSON import \u002F export — file-path variants plus in-memory text variants for LLM-generated content, and `create_data_table_from_csv` \u002F `create_data_table_from_json` to build a fresh DataTable with row-struct resolution by content path or short name; cross-table row copy, row-diff compare; reverse lookup by RowStruct to find every table referencing that struct |\n| `UnrealBridgeCurveLibrary` | Curve assets (`UCurveFloat` \u002F `UCurveVector` \u002F `UCurveLinearColor`) and `UCurveTable` rows: asset info, key CRUD (batch-safe + atomic tangent writes), pre \u002F post-infinity extrapolation, auto-tangent recompute, batch sampling (N time points in one round-trip), uniform sampling; curve-table row add \u002F remove \u002F rename \u002F replace. Write ops broadcast `OnCurveChanged` so open Curve Editor tabs refresh instantly |\n| `UnrealBridgeMaterialLibrary` | Material instance parameter queries |\n| `UnrealBridgeUMGLibrary` | UMG widget tree, properties, animations, bindings, events; widget search by name \u002F class; property writes |\n| `UnrealBridgeLevelLibrary` | Actor query (name \u002F Class \u002F Tag \u002F Folder \u002F radius \u002F Box \u002F ray) and edit (spawn \u002F destroy \u002F transform \u002F attach \u002F visibility \u002F Mobility, nested property read \u002F write, function invocation); terrain height profile and Trace probing; in-editor custom NavGraph (nodes, edges, shortest path, JSON persistence); orthographic top-down view plus animation Pose \u002F Montage timeline screenshots; every write op runs in a transaction |\n| `UnrealBridgeEditorLibrary` | Editor session control: asset open \u002F close \u002F save \u002F load; Content Browser and viewport; PIE start \u002F stop \u002F simulate \u002F pause; undo \u002F redo, console commands, CVars; batch Blueprint compile, redirector fixup; Live Coding trigger; screenshot, GBuffer channels (Depth \u002F DeviceDepth \u002F Normal \u002F BaseColor) and HitProxy ID pass; tabs, notifications, diagnostics. Bridge self-observation: call log (ring-buffered request id, latency, endpoint, output size), latency stats, signature-registry JSON dump (one shot returns metadata for all ~1020 `UFUNCTION`s) |\n| `UnrealBridgeGameplayAbilityLibrary` | GameplayAbility \u002F GameplayEffect \u002F AttributeSet Blueprint metadata; tag hierarchy and matching; list abilities and effects by tag; actor ASC state (attribute values, active abilities \u002F effects, cooldown checks); runtime `SendGameplayEvent` and attribute mutation; GA \u002F GE \u002F GC Blueprint authoring (CDO edit, GA graph nodes, GE magnitude \u002F component \u002F inherited tags, GC tag set) |\n| `UnrealBridgeGameplayTagLibrary` | GameplayTag refactoring: `find_assets_referencing_tag` (with child-tag expansion), `list_all_registered_tags`, `get_tag_source_info`. Mutations `add_gameplay_tag` \u002F `rename_gameplay_tag` (auto-redirect, redirect persistence hardened against UE 5.7's silent-drop quirk) \u002F `remove_gameplay_tag`. Source enumeration via `list_tag_source_inis`; redirect ledger via `list_gameplay_tag_redirects` + `remove_gameplay_tag_redirect` for enumerate-then-sweep cleanup |\n| `UnrealBridgePerfLibrary` | AAA-grade performance instrumentation across eight dimensions. **Point-in-time**: frame timing (FPS \u002F GT \u002F RT \u002F GPU \u002F RHI ms via `FStatUnitData` + RHI globals), render counters, process memory, `TObjectIterator` class histogram, ISO-8601-stamped aggregate snapshot. **Memory & asset breakdown**: texture \u002F mesh \u002F audio \u002F UObject grouped by folder \u002F LOD group \u002F compression format \u002F class — disk or runtime mode; top-N largest assets across any UClass; world-actor breakdown by class × level (World Partition partial). **Time series**: opt-in periodic sampling with ring buffer, always-on frame-time histogram, hitch log via `OnEndFrame` hook, CSV export, **`get_frame_time_percentiles([50,90,95,99])`** for AAA-grade tail-latency investigation. **Render breakdown**: per-actor render cost, LOD distribution, primitives-by-material, shadow casters, Lumen \u002F Nanite diagnostics; **`get_texture_streaming_residency`** (per-texture resident vs wanted mip + pool over-budget), **`get_render_target_memory`** (per-subclass RT byte totals), **`get_per_pass_gpu_timings`** (BasePass \u002F Lumen \u002F Translucency averages from `FRealtimeGPUProfiler`; falls back gracefully on UE 5.7's new RHI profiler), **`analyze_all_materials`** (cross-library complexity heuristic to surface heaviest masters). **Live trace control**: `start_trace_capture` \u002F `stop_trace_capture` \u002F `list_trace_channels` \u002F `get_trace_state` wrapping `FTraceAuxiliary`. **Trace summary parsers** (5.7+): `parse_trace_to_summary` returns CPU + GPU hot scopes + per-thread hot scopes + counters + load-time breakdown + frame stats from a `.utrace` file in one call; specialised `parse_alloc_trace_to_summary` (peak commit + tag inventory + alloc\u002Ffree delta), `parse_net_trace_to_summary` (per-game-instance + per-connection traffic totals), `parse_cook_trace_to_summary` (top-N packages by `BeginCacheCookedPlatformData` for 4-hour cook attribution). **Regression workflow**: `compare_perf_snapshots(before, after, threshold)` returns per-field deltas + flagged regressions list; `begin_auto_hitch_capture` \u002F `end_auto_hitch_capture` ring-buffer rich snapshots on every frame ≥ threshold; `begin_insights_for_trace` shells out UnrealInsights.exe for human handoff |\n| `UnrealBridgeGameplayLibrary` | PIE-runtime Agent control: aggregated world observation, navigation pathfinding; movement \u002F look \u002F jump \u002F teleport \u002F sticky input, Enhanced Input **runtime injection plus IA \u002F IMC enumeration and IMC mapping authoring** (`list_input_actions` \u002F `list_input_mapping_contexts` \u002F `get_input_mapping_context_mappings` \u002F `add_ia_mapping_to_imc` \u002F `remove_ia_mapping_from_imc` — the binding side that previously required raw `unreal.*`); pawn velocity, ability, jump-arc simulation; camera ray, screen ↔ world, NavMesh projection; damage, physics impulse, time dilation, sound, camera shake; debug draw; AI-controller probing |\n| `UnrealBridgeNavigationLibrary` | Export NavMesh as OBJ for external visualization and geometry analysis |\n| `UnrealBridgeProceduralLibrary` | Procedural content authoring primitives — point-list-in \u002F point-list-out sampling + filters + instancing on the editor world. Deterministic given `(params, seed)`: `FRandomStream(Seed)` + `ECC_Visibility` + `bTraceComplex=true` for surface trace; Poisson-2D \u002F grid \u002F radial \u002F spline \u002F mesh-surface samplers; slope \u002F min-distance \u002F mask filters; ISM \u002F HISM batch spawn; Landscape grid + project-to-surface (callable as plain Python arrays — intentionally NOT a PCG-graph wrapper) |\n| `UnrealBridgeGeometryLibrary` | Geometry Script wrapper — `UDynamicMesh` handle pool + cross-engine asset I\u002FO (`copy_mesh_from_static_mesh` \u002F `create_new_static_mesh_asset_from_mesh`) + 25+ ops covering primitives \u002F boolean \u002F smooth \u002F decimate \u002F displace \u002F voxel-merge \u002F uv-unwrap \u002F bake normals + occlusion \u002F extrude \u002F sweep-along-spline \u002F selection. Field names follow standard UE Python snake_case (`bHasNormals` → `.has_normals`) |\n| `UnrealBridgePCGLibrary` | PCG (Procedural Content Generation) read + trigger only — NO graph editing (PCG's territory; agents write code not visual graphs). Component override get \u002F set, generate \u002F cleanup, asset graph introspection. Whole library gated to UE 5.7+ with stub bodies on 5.3-5.6 |\n| `UnrealBridgeReactive*` | Event subscription framework with 10 adapters: runtime (GameplayEvent, AttributeChanged, ActorLifecycle, MovementMode, AnimNotify, InputAction, Timer) and editor (AssetEvent, PieState, BpCompiled); handler register \u002F list \u002F pause \u002F resume \u002F stats; cross-session JSON persistence. Replaces polling |\n| `UnrealBridgePropertyLibrary` | **Privileged generic UPROPERTY surface.** Read \u002F write any reflected property by dotted path with `[N]` array indexing — bypasses UE Python's binding-layer access checks (the \"is protected and cannot be read\" rejection, the EditDefaultsOnly-on-struct-copy rejection that blocks nested writes like `Modifiers[0].ModifierMagnitude.ScalableFloatMagnitude.Value`). `list_u_properties` returns full reflection (private\u002Fprotected\u002Fbare UPROPERTY + decoded EPropertyFlags + metadata map); `array_append_u_property` auto-detects FGameplayTagContainer to maintain ParentTags cache; `get_asset_cdo_path` resolves the CDO path correctly. Wraps writes in `FScopedTransaction` + optional `PostEditChangeChainProperty` for editor-window refresh. |\n\n## Protocol\n\nTwo channels:\n\n1. **UDP multicast discovery** on `239.255.42.99:9876`. Client broadcasts a `probe` with a request id and an optional project filter; every running editor replies with its bound TCP address + port + token fingerprint. Multiple editors coexist on the same host via `SO_REUSEADDR`.\n\n2. **TCP data** on the port the editor reports in its discovery response (OS-assigned; `127.0.0.1` by default). Length-prefixed JSON:\n\n```\nRequest :  [4-byte big-endian length][{\"id\",\"script\",\"timeout\",\"token?\"}]\nResponse:  [4-byte big-endian length][{\"id\",\"success\",\"output\",\"error\"}]\nPing    :  {\"id\",\"command\":\"ping\"}  →  pong\n```\n\nToken auth kicks in automatically when the server binds non-loopback; the client reads the token from `\u003CProject>\u002FSaved\u002FUnrealBridge\u002Ftoken.txt` and includes it in every request.\n\nScripts run on the GameThread; captured stdout and stderr are separated by the special `__UB_ERR__` sentinel.\n\n### Server config (CLI \u002F env \u002F `EditorPerProjectUserSettings.ini [UnrealBridge]`)\n\n| CLI | Env | Default |\n|---|---|---|\n| `-UnrealBridgeBind=` | `UNREAL_BRIDGE_BIND` | `127.0.0.1` |\n| `-UnrealBridgePort=` | `UNREAL_BRIDGE_PORT` | `0` (OS-assigned) |\n| `-UnrealBridgeToken=` | `UNREAL_BRIDGE_TOKEN` | empty (required when bind ≠ loopback) |\n| `-UnrealBridgeDiscoveryGroup=` | `UNREAL_BRIDGE_DISCOVERY_GROUP` | `239.255.42.99:9876` |\n| `-UnrealBridgeNoDiscovery` *(flag)* | `UNREAL_BRIDGE_DISCOVERY=0` | discovery on |\n\n## Repository layout\n\n```\nUnrealBridge\u002F\n├── Plugin\u002FUnrealBridge\u002F         # UE 5.3+ Editor plugin (C++)\n│   ├── Source\u002FUnrealBridge\u002F     #   TCP server + bridge libraries\n│   └── Content\u002FPython\u002F          #   Helpers auto-loaded into UE's Python env\n├── .claude\u002Fskills\u002Funreal-bridge\u002F\n│   ├── scripts\u002F                 # bridge.py, hot_reload.py, rebuild_relaunch.py\n│   └── references\u002F              # Per-library API docs\n├── docs\u002F                        # Design notes and plans\n├── tools\u002F                       # Standalone helpers\n└── sync_plugin.bat              # Mirror plugin into a UE project\n```\n\n## Requirements\n\n- **Unreal Engine 5.3+** with `PythonScriptPlugin` and `GameplayAbilities` (both ship with the engine). The matrix at `tools\u002Fbuild_matrix.py` verifies clean BuildPlugin against 5.3.2 \u002F 5.4.4 \u002F 5.5.4 \u002F 5.6.1 \u002F 5.7.1 \u002F 5.8.0; some libraries (Chooser \u002F PoseSearch \u002F Material \u002F Navigation + a few standalone UFUNCTIONs) require 5.7+, and a handful of inline shims cover 5.3 and 5.8 — see [docs\u002Fversion-compatibility.md](docs\u002Fversion-compatibility.md). UE 5.2 and earlier are not supported.\n- **Windows 10\u002F11** — the plugin itself is portable, but paths inside the helper scripts are hard-coded Windows-style\n- **Python 3.9+** on PATH\n- **Visual Studio 2022** with the UE workload — for plugin compilation. **Toolchain notes:**\n  - **5.5 \u002F 5.6 \u002F 5.7 \u002F 5.8** work with current MSVC (verified on **14.44.35207**, VS 17.14).\n  - **5.3 \u002F 5.4** require MSVC with `_MSC_VER ≤ 1939` (verified on **14.38.33130**, VS 17.8). Newer MSVCs hit an engine-side `C4668: '__has_feature' is not defined` in `ConcurrentLinearAllocator.h` that 5.3 \u002F 5.4's UBT promotes to a hard error via `\u002Fwe4668`; 5.5+ guarded the macro and dropped the promotion. To verify 5.3 \u002F 5.4 on a machine with both toolchains installed: pin via `\u003CCompilerVersion>14.38.33130\u003C\u002FCompilerVersion>` in `%APPDATA%\\Unreal Engine\\UnrealBuildTool\\BuildConfiguration.xml` for the duration of the build, then restore.\n  - **5.8 source build** (vs. Launcher install) may need the UBA executor disabled if the engine snapshot is missing the `UbaDetours.dll` content normally fetched by `Setup.bat`. Configure via `engines.local.json`'s per-engine `env` block: `\"env\": { \"UnrealBuildTool_BuildConfiguration__bAllowUBAExecutor\": \"false\" }`. UBT falls back to the local ParallelExecutor.\n- **Claude Code CLI** — optional, only if you use the bundled skill\n\n## Safety\n\n- Every level-edit op is wrapped in `FScopedTransaction` — Ctrl+Z in the editor reverts anything the bridge did.\n- The TCP server binds to `127.0.0.1` only; it is not reachable from the network.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n---\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fimages\u002Fen\u002F03-outro.png\" alt=\"UnrealBridge — Turn the Unreal Editor into a programmable surface for AI Agents\">\n\u003C\u002Fp>\n","UnrealBridge 是一个为AI代理设计的虚幻引擎编辑器桥接层，允许AI代理检查资源、创建和编辑蓝图\u002F动画蓝图以及修改关卡，并支持响应式事件和可撤销的写入操作。项目的核心功能包括基于抽象语法树（AST）的幻觉防御机制，通过预检脚本防止未知函数调用等错误，确保了与虚幻引擎交互的安全性和准确性。此外，它还提供了自动布局蓝图图谱等功能，提升了开发效率。适用于需要利用AI技术自动化或半自动化地进行游戏开发、内容创作及测试的场景。","2026-06-11 03:31:31","CREATED_QUERY"]