2.5 KiB
Blueprint Text Export
Blueprints are stored as binary .uasset files that Claude Code cannot read directly. To work around this, a text exporter automatically converts blueprint graphs to readable text files whenever a blueprint is saved in the Unreal editor.
How It Works
The game module (FlxIntegrationModuleImpl in Source/Integration/Integration.cpp) hooks into UPackage::PackageSavedWithContextEvent. When a blueprint is saved, it iterates each UEdGraph in the blueprint and runs FlxBlueprintExporter on it. The output is written to Saved/BlueprintExports/<BlueprintName>/<GraphName>.txt.
The exporter class (Source/Integration/BlueprintExporter.h/.cpp) processes one graph at a time. The constructor runs all passes and the result is available via GetOutput().
Output Format
The graph file is written to Saved/BlueprintExports/<BlueprintName>/<GraphName>.txt. A details file with node-name-to-GUID mappings is written to Saved/BlueprintExports/<BlueprintName>/DETAILS/<GraphName>.txt.
Every line in the graph file starts with a keyword, making it easy to parse. The format is:
node Event_Tick
return Output_Delegate, Delta_Seconds
goto Set_Tick_Delta_Seconds
node Set_Tick_Delta_Seconds
input Real Tick_Delta_Seconds = Event_Tick.Delta_Seconds
return Output_Get
goto CallFunctionByName
Line Keywords
node Name— starts a new node block.input Type Name = Source— an input data pin. Source is aNode.Pinreference, a literal value,<self>, or<default>.return Pin1, Pin2— output data pins.goto Target— exec flow (single output).goto-if PinName Target— exec flow (multiple outputs, e.g. branch true/false).// comment text— comment node.
Special Handling
- String defaults are shown in quotes.
- Variable get nodes are inlined (the variable name appears directly at the point of use rather than as a separate node).
- Knot (reroute) nodes are followed through transparently.
Node Ordering
Nodes are sorted by a traversal algorithm: find starter nodes (exec output but no exec input), sort them by Y position, then traverse each. The traversal visits a node's inputs first (so data sources appear before their consumers), then emits the node itself, then follows exec outputs. This produces a readable top-down flow. Any unvisited nodes are appended at the end.
Node Naming
Names are derived from ENodeTitleType::ListView titles, sanitized to alphanumeric plus underscores. Duplicates get _2, _3, etc.