Level Actors
Every Level Actors command in CodeFizz Editor Agent, with parameters and examples.
Every Level Actors command in CodeFizz Editor Agent, with parameters and examples.
54 commands. Each shows its parameters and an example, and has a copyable deep link, so you (or an AI agent) can jump straight to one.
get_actors_in_levelList all actors in the current level
Returns every actor currently placed in the active level, including their names, types, and transforms. Use this to get an overview of level contents before performing targeted operations.
cfa get_actors_in_levelfind_actors_by_nameFind actors by name pattern
Searches the current level for actors whose label matches the given pattern. Supports partial matching, so you can find groups of related actors without listing every actor in the level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| pattern | string | Yes | Name pattern to search |
cfa find_actors_by_name --pattern "Light"
cfa find_actors_by_name --pattern "BP_Conveyor"spawn_actorSpawn an actor in the level
Creates a new actor instance in the current level at the specified transform. The actor-type defaults to StaticMeshActor but can be any built-in actor class. Use spawn_blueprint_actor for Blueprint-based actors instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Actor name |
| actor_type | string | No | Actor type |
| location | json | No | JSON array [x,y,z] |
| rotation | json | No | JSON array [pitch,yaw,roll] |
| scale | json | No | JSON array [x,y,z] |
| static_mesh | string | No | Static mesh path |
cfa spawn_actor --name "MyCube" --actor-type "StaticMeshActor" --location "[0,0,100]" --rotation "[0,45,0]" --scale "[2,2,2]"
cfa spawn_actor --name "FloorPlane" --static-mesh "/Engine/BasicShapes/Plane.Plane" --location "[0,0,0]"search_classesSearch available UClasses by name, optionally filtered by a base class
Enumerates loaded UClasses whose name contains the query (case-insensitive), optionally restricted to subclasses of base_class (e.g. 'ActorComponent', 'Actor', or a full path). Excludes abstract (unless include_abstract), deprecated, and transient/generated classes. Returns name, full path, parent, and is_abstract. Use it to discover the exact class name or path to pass to add_component_to_blueprint, spawn_actor_by_class, etc.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | No | Case-insensitive substring to match in the class name |
| base_class | string | No | Only return subclasses of this class (short name or full path) |
| max_results | int | No | Maximum number of results |
| include_abstract | bool | No | Include abstract classes (default false) |
cfa search_classes --query "StaticMesh" --base-class ActorComponent
cfa search_classes --query Light --base-class Actor --max-results 20delete_actorDelete an actor from the level
Removes a placed actor from the current level by its label name. The deletion is immediate and cannot be undone from the CLI, so verify the target with find_actors_by_name first if unsure.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Actor name |
cfa delete_actor --name "MyCube"set_actor_transformSet actor location/rotation/scale
Updates the world transform of an existing actor in the level. You can set any combination of location, rotation, and scale -- omitted fields are left unchanged.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Actor name |
| location | json | No | JSON array [x,y,z] |
| rotation | json | No | JSON array [pitch,yaw,roll] |
| scale | json | No | JSON array [x,y,z] |
cfa set_actor_transform --name "MyCube" --location "[100,200,50]"
cfa set_actor_transform --name "MyCube" --rotation "[0,90,0]" --scale "[1,1,2]"spawn_blueprint_actorSpawn a Blueprint actor instance
Spawns an instance of a Blueprint asset into the current level. Use this instead of spawn_actor when you need to place a Blueprint-based actor with its full component hierarchy and default properties.
| Parameter | Type | Required | Description |
|---|---|---|---|
| blueprint_path | string | Yes | Blueprint asset path |
| location | json | No | JSON array [x,y,z] |
| rotation | json | No | JSON array [pitch,yaw,roll] |
| scale | json | No | JSON array [x,y,z] |
| name | string | No | Actor name |
cfa spawn_blueprint_actor --blueprint-path "/Game/Blueprints/BP_Miner" --location "[500,0,0]"
cfa spawn_blueprint_actor --blueprint-path "/Game/Blueprints/BP_ConveyorBelt" --location "[0,0,0]" --rotation "[0,90,0]" --name "Belt_01"spawn_actor_from_classSpawn an actor from a class name
Spawns an actor using a C++ or Blueprint class name with individual float parameters for location and rotation instead of JSON arrays. Useful when you know the exact class name and want to specify coordinates directly.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_name | string | Yes | Actor class name |
| location_x | float | No | X location |
| location_y | float | No | Y location |
| location_z | float | No | Z location |
| rotation_yaw | float | No | Yaw rotation |
| rotation_pitch | float | No | Pitch rotation |
| rotation_roll | float | No | Roll rotation |
cfa spawn_actor_from_class --class-name "PointLight" --location-x 100 --location-y 200 --location-z 300
cfa spawn_actor_from_class --class-name "AMyCustomActor" --location-z 50 --rotation-yaw 45get_selected_actorsGet currently selected viewport actors
Returns the list of actors currently selected in the Unreal Editor viewport. Useful for inspecting or modifying whatever the user has selected in the editor.
cfa get_selected_actorsget_world_infoGet current level info (world name, actor count)
Returns metadata about the currently loaded world, including the level name, total actor count, and other summary information. Use this to confirm which level is active before performing operations.
cfa get_world_infotake_screenshotCapture viewport, a named window, or an asset editor to PNG
Captures a screenshot as PNG. Three targets. Default mode=viewport grabs the level viewport. mode=window grabs the window the user is currently looking at. Pass --asset-path to grab a specific asset's editor, or --window to grab a window by title substring: both capture that window directly through Slate, so it does NOT need operating system focus and works while the editor sits behind other applications. --asset-path is the reliable one, because an asset editor can be a floating window or a tab docked in the main frame and this resolves either; it also activates that tab first (--focus=false to skip), since a window only renders its active tab. Call list_editor_windows to see what is open. The resulting file can be viewed with the Read tool.
| Parameter | Type | Required | Description |
|---|---|---|---|
| file_path | string | No | Output file path (default: auto) |
| mode | string | No | viewport or window (implied by --asset-path/--window) |
| asset_path | string | No | Capture this asset's editor, floating or docked. No OS focus needed |
| window | string | No | Capture the window whose title contains this substring |
| focus | bool | No | With --asset-path, activate its tab first so the window renders it |
cfa take_screenshot
cfa take_screenshot --file-path "C:/Screenshots/level_overview.png" --mode "viewport"
cfa take_screenshot --asset-path "/Game/Anims/BS_Locomotion" --file-path "C:/Shots/bs.png"
cfa take_screenshot --window "BS_Locomotion"wait_for_compilationBlock until asset and shader compilation finishes
Waits until the editor has no assets and no shader jobs left to compile, then returns. Read any metric only after this returns idle. Material instruction counts, widget layout, lighting budgets and FX cost are all measured against whatever is compiled at that instant, so asking while a compile is still running returns a real number for the wrong thing, with nothing to indicate it. Polls rather than blocking outright, so a timeout is honoured; if it times out it says so and reports what is still outstanding rather than pretending it finished.
| Parameter | Type | Required | Description |
|---|---|---|---|
| timeout_seconds | float | No | Give up after this long and report what is left |
cfa wait_for_compilation
cfa wait_for_compilation --timeout-seconds 300read_message_logRead an editor Message Log listing
Returns the messages the editor put in one of its Message Log listings, with counts by severity. These are the same entries the Message Log window shows, and they carry detail that a command's own result does not: which asset failed to load, which actor failed a map check, why a Blueprint compile complained. Filter with --severity error or warning, and cap with --max-results. A log only exists once something has written to it this session, so an unknown name is refused by name rather than returned empty, which would read as no problems.
| Parameter | Type | Required | Description |
|---|---|---|---|
| log_name | string | Yes | Listing name, e.g. PIE, BlueprintLog, AssetCheck, MapCheck, LoadErrors |
| severity | string | No | Only error, warning or info |
| max_results | int | No | Cap returned messages (1-500); reports how many were dropped |
cfa read_message_log --log-name PIE
cfa read_message_log --log-name AssetCheck --severity error
cfa read_message_log --log-name MapCheck --max-results 20validate_project_assetsRun the project's own data validators over its assets
Runs every validator the project itself defines (each UEditorValidatorBase subclass, plus every IsDataValid override) over the assets you point it at, and reports a verdict with the assets that failed and why. This is the project's own definition of correct, not ours, so it catches the rules a studio actually cares about. Scope it with --path, --filter or an explicit --assets list, and cap the work with --max-assets. Assets are loaded to validate them, so a whole-project run is slow; narrow the path while iterating. Verdict is fail if anything is invalid, pass_with_warnings if only warnings were raised, pass otherwise.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | string | No | Content path to validate recursively |
| assets | stringlist | No | Explicit asset object paths; overrides --path |
| filter | string | No | Only assets whose object path contains this |
| usecase | string | No | manual, save, commandlet, presubmit or script; validators can behave differently per usecase |
| max_assets | int | No | Cap how many assets are validated; reports asset_limit_reached when hit |
| max_results | int | No | Cap returned failing assets (1-200); reports how many were dropped |
| load_assets | bool | No | Load unloaded assets so they can be validated; false skips them |
| skip_excluded_directories | bool | No | Honour the project's excluded validation directories |
cfa validate_project_assets
cfa validate_project_assets --path /Game/Characters
cfa validate_project_assets --filter ABP_ --max-results 50
cfa validate_project_assets --assets /Game/Hero.Hero --usecase presubmitvalidate_blueprint_compileCompile a Blueprint and report which nodes failed
Compiles a Blueprint with our own results log attached, then reports the errors and warnings mapped to the nodes that caused them, rather than as a flat wall of text. Each entry names the node and the graph it lives in, so you can go straight to it. Also reports orphaned pins (left behind when a function signature changed) and dangling_exec_chains, the number of exec chains nothing drives, which is the usual sign of a graph that silently never runs (a dead chain counts once, at its head). Compiler notes are reported as note and do not count as warnings. Compiling never saves the asset, even in a project set to save on compile. status distinguishes up_to_date_with_warnings from up_to_date, so a Blueprint that compiles but is dirty does not read as clean.
| Parameter | Type | Required | Description |
|---|---|---|---|
| blueprint_path | string | Yes | Blueprint asset path or name |
| max_results | int | No | Cap reported nodes (1-200); reports how many were dropped |
cfa validate_blueprint_compile --blueprint-path /Game/BP_Player
cfa validate_blueprint_compile --blueprint-path /Game/BP_Player --max-results 50validate_collisionFind static meshes with missing or unusable collision
Checks every static mesh under a path for collision that will not work. A mesh with no simple collision primitives is reported as an error: default traces and sweeps miss it and it cannot block or simulate, though explicit complex traces still hit it. A mesh set to use complex collision as simple is a warning, because it cannot be simulated. Meshes that pass are counted but not listed, so the output stays small on a large project. The check reads the collision counts the engine already publishes to the asset registry, so a whole project sweep loads nothing; loaded_for_inspection reports how many meshes had to be loaded because those tags were missing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | string | No | Content path to check recursively |
| filter | string | No | Only meshes whose object path contains this |
| max_results | int | No | Cap reported meshes (1-200); reports how many were dropped |
cfa validate_collision
cfa validate_collision --path /Game/Environment
cfa validate_collision --filter SM_Rock --max-results 50validate_replicationCheck a class for silent multiplayer bugs
Statically checks one class for the replication mistakes that cost hours to find at runtime, with no PIE session needed. Reports properties marked Replicated that were never registered in GetLifetimeReplicatedProps, RepNotify properties whose OnRep function does not exist, server RPCs with no validation (a client can call those with any arguments), and reliable multicasts, whose cost scales with connection count. The missing-registration case is a warning rather than an error because a project that auto-registers replicated properties replicates them anyway.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_path | string | Yes | Class path, Blueprint asset path, or native class name |
| max_results | int | No | Cap reported issues (1-200); reports how many were dropped |
cfa validate_replication --class-path /Game/BP_Player.BP_Player
cfa validate_replication --class-path Characterlist_editor_windowsList open editor windows and asset editors
Lists every top-level Slate window the editor has open (title, size, visible, minimized) plus every asset currently being edited and which window holds it. Use this to find the right target for take_screenshot --window or --asset-path, and to tell whether an asset editor opened as its own window or as a tab docked in the main frame.
cfa list_editor_windowsfocus_asset_editorBring an asset's editor tab to the front
Activates the tab for an already-open asset editor and raises its window, so the user is looking at that asset. Works whether the editor is a floating window or a tab docked in the main frame. Open the asset first with open_asset. Use this when you want the person watching to see the thing you are about to change.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Asset whose editor tab should come to the front |
cfa focus_asset_editor --asset-path "/Game/Anims/ABP_Hero"focus_viewportFrame the level viewport on an actor or move the camera
Aims the active level editor perspective viewport. Pass an actor label/name to frame it (like pressing F). Add direction (top/bottom/front/back/left/right/iso) or explicit pitch+yaw to frame it FROM a chosen angle, and fill (0-1) or distance to control how tight the framing is. Or pass an explicit location (and optional rotation) to place the camera directly.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Actor label or name to frame in the viewport |
| direction | string | No | View angle preset: top/bottom/front/back/left/right/iso (with actor) |
| pitch | float | No | Custom camera pitch in degrees (overrides direction; use with actor) |
| yaw | float | No | Custom camera yaw in degrees (overrides direction; use with actor) |
| fill | float | No | Fraction of the frame the actor fills, 0-1 (default 1 = tight) |
| distance | float | No | Explicit camera distance from the actor (overrides fill) |
| location | string | No | Camera world position: "(X=..,Y=..,Z=..)" or X,Y,Z |
| rotation | string | No | Camera rotation: "(P=..,Y=..,R=..)" (used with location) |
| realtime | bool | No | Enable viewport Realtime so placed effects simulate (default true) |
cfa focus_viewport --actor "ElectricBeamTest"
cfa focus_viewport --actor "Reactor" --direction "top" --fill 0.8
cfa focus_viewport --actor "Reactor" --pitch -30 --yaw 120 --distance 1500
cfa focus_viewport --location "(X=600,Y=-600,Z=400)" --rotation "(P=-25,Y=45,R=0)"get_scene_mapContext-friendly clustered understanding of the level
Summarizes the level so an agent understands it WITHOUT reading a giant per-actor list (scales 10 -> 100k actors). Default returns: content bounds, per-category counts, and one line per detected CLUSTER (actors grouped by mesh, split spatially via grid+union-find connected components), each tagged with an arrangement (grid/ring/line/scattered via PCA + circle-fit + spacing) plus count, instance count, center, size, folder. Also an ASCII density heatmap of the whole level. Drill into a cluster's raw actors with --drill <id> (paginated). Use --export true to write the full flat per-actor JSON to Exports/ (interchange only). label_filter/class_filter scope by label or class-name substring.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_filter | string | No | Only include actors whose class NAME contains this substring |
| label_filter | string | No | Only include actors whose outliner LABEL contains this substring |
| region_grid | bool | No | Include the ASCII density heatmap (default true) |
| grid_size | int | No | Density heatmap resolution NxN (4-64) |
| cell_size | float | No | Clustering merge distance in world units (default: auto ~2x median actor size) |
| drill | int | No | Return the raw actors of cluster <id> instead of the summary |
| page | int | No | Drill page index |
| page_size | int | No | Drill actors per page |
| export | bool | No | Write the full flat per-actor JSON to Exports/ (interchange) |
cfa get_scene_map
cfa get_scene_map --drill 0 --page 0
cfa get_scene_map --label-filter "Brick_"
cfa get_scene_map --export trueget_mesh_infoNative shape/bounds/pivot of a static mesh asset (before placing)
Inspects a UStaticMesh asset (not a placed actor) so you can plan placement precisely: native bounds (size + half-extent), pivot_offset (bounds center relative to the mesh pivot), bounding sphere radius, the REAL collision shape (convex hulls with vertex counts, boxes, spheres, capsules) which conveys weird shapes far better than an AABB, named sockets with local transforms, and vertex/triangle/LOD/material counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mesh_path | string | Yes | Static mesh content path (object or package path) |
| include_collision | bool | No | Include collision primitives (the real shape) (default true) |
| include_sockets | bool | No | Include named sockets with local transforms (default true) |
cfa get_mesh_info --mesh-path "/Engine/BasicShapes/Cube.Cube"
cfa get_mesh_info --mesh-path "/Game/Meshes/SM_Rock" --include-collision truespawn_actors_batchSpawn many actors from one computed array in a single call
Spawns a whole layout (city, pyramid, grid...) at once from a JSON array of specs, in a single undo transaction. Each entry: {mesh, location [x,y,z], rotation [p,y,r], scale [x,y,z], name, type}. Top-level 'mesh'/'type'/'name_prefix' act as defaults so a shared-mesh batch stays compact. Far faster than one spawn per actor (one bridge call, one mesh load per unique path). Pass the params via --json - (stdin) for large batches. Manage/revert afterwards with delete_actors_batch --name-prefix.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actors | json | Yes | JSON array of {mesh,location,rotation,scale,name,type} |
| mesh | string | No | Default static mesh path for entries that omit it |
| type | string | No | Default actor type (StaticMeshActor/PointLight/SpotLight/DirectionalLight/CameraActor) |
| name_prefix | string | No | Auto-name entries as <prefix><index> when they omit 'name' |
| folder | string | No | Put all spawned actors into this outliner folder (organized on creation) |
| return_names | bool | No | Return the created labels (default false = counts only) |
# build the whole layout in one call (params piped as JSON on stdin)
echo '{"mesh":"/Engine/BasicShapes/Cube.Cube","name_prefix":"City_","actors":[{"location":[0,0,0],"scale":[10,10,1]},{"location":[500,0,250],"scale":[3,3,5]}]}' | cfa spawn_actors_batch --json -delete_actors_batchBulk-delete actors by name/label prefix or an explicit list
Deletes every actor whose label/name starts with name_prefix, and/or is in the names list, in a single undo transaction. Reverts a spawn_actors_batch in one call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Delete actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to delete |
cfa delete_actors_batch --name-prefix "City_"
echo '{"names":["Ramp_A","Ramp_B"]}' | cfa delete_actors_batch --json -move_actors_to_folderPut actors into an outliner folder (organization only)
Moves selected actors into a named outliner folder (auto-created; '/' nests). Folders are pure organization, no transform effect. Select actors via name_prefix and/or names.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Outliner folder path ('/' nests) |
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to select |
cfa move_actors_to_folder --folder "Structures/Pyramid" --name-prefix "Brick_"create_folderCreate an empty outliner folder
Creates an empty outliner folder (World-Partition aware). Use move_actors_to_folder or spawn_actors_batch --folder to populate it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Outliner folder path ('/' nests) |
cfa create_folder --folder "Structures"delete_folderDelete an outliner folder (and subfolders)
Deletes an outliner folder by enumerating the world's real folders and removing the exact match (World-Partition safe). Recursive by default (also removes subfolders). Actors inside move up to the parent (not deleted). Returns the count actually removed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Outliner folder path |
| recursive | bool | No | Also delete subfolders (default true) |
cfa delete_folder --folder "Structures"list_foldersList all outliner folders in the level
Enumerates every outliner folder (World-Partition aware). Use to verify folder create/delete. Optional filter matches a substring.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Only list folders whose path contains this |
cfa list_folders
cfa list_folders --filter "Structures"rename_folderRename/move an outliner folder
Renames an outliner folder (and moves its actors + subfolders).
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | string | Yes | Existing folder path |
| new_folder | string | Yes | New folder path |
cfa rename_folder --folder "Structures" --new-folder "Buildings"group_actorsGroup actors into an editor Group (AGroupActor)
Creates an editor Group from the selected actors (select one -> selects all, like Ctrl+G). Different from folders (organization) and attachment (transform). Select via name_prefix and/or names (>=2 actors).
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to select |
cfa group_actors --name-prefix "Brick_"ungroup_actorsDissolve the editor Group(s) containing the given actors
Ungroups the AGroupActor(s) that contain the selected actors. Select via name_prefix and/or names.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names to select |
cfa ungroup_actors --name-prefix "Brick_"attach_actorsAttach actors as children of a parent (transform hierarchy)
Attaches child actors to a parent so moving/rotating the parent moves the children (keeps world transform, so they stay put visually). Undo-able, outliner-reflected, cycle-validated. Select children via name_prefix and/or names.
| Parameter | Type | Required | Description |
|---|---|---|---|
| parent | string | Yes | The actor to attach children to (label or name) |
| name_prefix | string | No | Select child actors whose label/name starts with this |
| names | json | No | JSON array of exact child labels/names |
cfa attach_actors --parent "Reactor" --name-prefix "Pipe_"detach_actorsDetach actors from their parent (become independent)
Detaches actors from their attachment parent (keeps world transform). Select via name_prefix and/or names.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_prefix | string | No | Select actors whose label/name starts with this |
| names | json | No | JSON array of exact labels/names |
cfa detach_actors --name-prefix "Pipe_"capture_top_downOff-screen orthographic top-down (floor-plan) render to PNG
Renders an orthographic top-down floor-plan of the whole level to a PNG off-screen (does not disturb the user's viewport). Auto-fits OrthoWidth to the level footprint. Far more legible than a perspective screenshot for understanding layout.
| Parameter | Type | Required | Description |
|---|---|---|---|
| file_path | string | No | Output PNG path (default: Saved/Screenshots/MCP_TopDown.png) |
| resolution | int | No | Square render resolution in pixels (64-8192) |
| padding | float | No | Extra margin around the level footprint (>=1.0) |
| area_width | float | No | How much ground to cover in world units. Defaults to the whole landscape; give a smaller width with --center to study one area |
| ortho_width | float | No | Older name for area_width, still accepted |
| pitch | float | No | Camera pitch. -90 is straight down (default); around -25 shows relief, which a straight-down frame flattens |
| yaw | float | No | Compass direction to view from, used when pitch is angled |
| center | string | No | Override view center "X,Y,Z" (e.g. a get_scene_map region center) |
cfa capture_top_down
cfa capture_top_down --file-path "C:/Shots/floorplan.png" --resolution 2048 --padding 1.2set_actor_propertySet a property at any nested path on a placed actor
Writes any property on the actual placed level actor (not the CDO/Blueprint defaults). Walks dotted paths through structs, FArrayProperty, FSetProperty and static C arrays via Field[N] syntax. Fires PostEditChangeProperty on the top-level FProperty so the renderer/component refresh, and marks the level dirty for save.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor outliner label or UObject name |
| property_path | string | Yes | Dotted property path (e.g. Settings.BloomIntensity) |
| property_value | json | Yes | JSON-encoded value (number, bool, string, object, array) |
| component_name | string | No | Optional: anchor path to a named component |
cfa set_actor_property --actor-label "PostProcessVolume_1" --property-path "Settings.BloomIntensity" --property-value 2.0
cfa set_actor_property --actor-label "PostProcessVolume_1" --property-path "Settings.bOverride_BloomIntensity" --property-value true
cfa set_actor_property --actor-label "PostProcessVolume_1" --property-path "Settings.LensFlareTints[2]" --property-value '{"R":0,"G":1,"B":0,"A":1}'
cfa set_actor_property --actor-label "MyMeshActor" --component-name "StaticMeshComponent" --property-path "Mobility" --property-value "Movable"get_actor_property_metadataInspect property type/clamp/enum metadata on a placed actor
Returns per-property metadata (cpp_type, ue_type, category, current_value, clamp_min/max, ui_min/max, valid_values for enums, inner/element/key/value types for containers, object_class/meta_class for refs, is_struct/is_array/is_enum/is_object/is_bool flags) PLUS a _summary header (total_available, total_returned, truncated, next_cursor, own_count, inherited_count, class_chain, categories breakdown). Object refs DO NOT auto-descend by default, use component_name to switch context, or pass descend_into_objects=true. max_entries=0 returns only the _summary so you can plan first.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor outliner label or UObject name |
| property_path | string | No | Optional dotted path; empty = top-level |
| filter | string | No | Case-insensitive substring on full path |
| category | string | No | UPROPERTY(Category=X) exact match (case-insensitive) |
| depth | int | No | Struct nesting levels to expand |
| expand_enums | bool | No | Include valid_values for enum-typed fields |
| include_inherited | bool | No | Walk super class properties |
| descend_into_objects | bool | No | If path lands on object ref, enumerate its class |
| max_entries | int | No | Cap on emitted entries (0 = summary only) |
| cursor | int | No | Pagination offset (use _summary.next_cursor) |
| component_name | string | No | Optional: anchor to a named component |
cfa get_actor_property_metadata --actor-label "PostProcessVolume_1" --property-path "Settings.AutoExposureMethod"
cfa get_actor_property_metadata --actor-label "PostProcessVolume_1" --property-path "Settings" --filter "bloom" --depth 1
cfa get_actor_property_metadata --actor-label "MCP_TestPointLight" --component-name "LightComponent0" --category "Light" --max-entries 20
cfa get_actor_property_metadata --actor-label "MCP_TestPointLight" --max-entries 0
cfa get_actor_property_metadata --actor-label "MCP_TestPointLight" --include-inherited false --component-name "LightComponent0"get_material_slotsList material element slots (index, slot name, current material, override state) for any target's mesh components, placed actor, Blueprint component template, or a StaticMesh asset
Reads material slots via Epic's own mesh-component API (GetMaterialSlotNames / GetNumMaterials / GetMaterial), for any UMeshComponent (StaticMesh, SkeletalMesh, InstancedStaticMesh). Targets through the universal object resolver, the SAME addressing as set_object_property: 'actor' (+optional 'component') for a placed actor, or 'blueprint_path'/'asset_path' (+optional 'component') for a Blueprint's component template / class defaults. With no 'component' it reports EVERY mesh component on the target. Each slot: index, slot_name, current material, and whether it's an override vs the mesh default; each component is tagged source=instance|blueprint_template. 'mesh_path' reads a StaticMesh asset's slots directly. (actor_label / component_name are still accepted as aliases.)
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Placed actor's label/name (reports all its mesh components, or just 'component') |
| actor_label | string | No | Alias for 'actor' |
| blueprint_path | string | No | Blueprint asset: reports its mesh component templates (class defaults). Add 'component' for one. |
| asset_path | string | No | Any asset path (a Blueprint resolves like blueprint_path) |
| component | string | No | Optional: restrict to one mesh component (object or class name) |
| component_name | string | No | Alias for 'component' |
| mesh_path | string | No | A StaticMesh asset path to read slots from directly |
cfa get_material_slots --actor "SM_Chair_2"
cfa get_material_slots --blueprint-path "/Game/BP/BP_Chair.BP_Chair"
cfa get_material_slots --blueprint-path "/Game/BP/BP_Chair.BP_Chair" --component "Mesh"
cfa get_material_slots --mesh-path "/Game/Meshes/SM_Chair.SM_Chair"set_materials_batchAssign materials per element slot to any target's mesh components, placed actors, Blueprint component templates, one or many, in a single call
Overrides materials via Epic's own UMeshComponent::SetMaterial and finalizes through the universal resolver's ApplyPropertyEdit, so a live edit reregisters the component (shows immediately) and a Blueprint-template edit persists + propagates to instances, exactly like the Details panel. Universal targeting (same addressing as set_object_property): each assignment targets by 'actor' (a placed actor), 'blueprint_path'/'asset_path' (a Blueprint's component template / class defaults), or 'name_prefix' (all matching placed actors, pairs with spawn_actors_batch). 'component' is optional (default = ALL mesh components on the target). Slot is 'slot' (index, default 0), 'slot_name' (resolved via GetMaterialIndex), or 'all_slots'. 'material' is an asset path, or empty string to clear the override back to the mesh default. Pass 'assignments' (an array) to do many at once. Returns applied_count + per-result {component, source, slots, material} + errors (a bad slot lists the valid indices AND slot names).
| Parameter | Type | Required | Description |
|---|---|---|---|
| assignments | json | No | JSON array of {actor|blueprint_path|asset_path|name_prefix, component?, slot?|slot_name?|all_slots?, material}, omit to use the top-level fields as one assignment |
| actor | string | No | Single-assignment: target a placed actor by label/name |
| blueprint_path | string | No | Single-assignment: target a Blueprint's component template(s) / class defaults |
| asset_path | string | No | Single-assignment: any asset path (a Blueprint resolves like blueprint_path) |
| name_prefix | string | No | Single-assignment: every placed actor whose label/name starts with this |
| component | string | No | Optional: restrict to one mesh component (default = all mesh components on the target) |
| slot | int | No | Element slot index to set (default 0) |
| slot_name | string | No | Element slot by name (alternative to slot; resolved via GetMaterialIndex) |
| all_slots | bool | No | Set every element slot on the component |
| material | string | No | Material/MaterialInstance asset path, or empty string to clear the override to the mesh default |
cfa set_materials_batch --actor "TC_Orange" --material "/Game/CFATest/Materials/M_Orange.M_Orange"
cfa set_materials_batch --name-prefix "TC_" --slot 0 --material "/Game/CFATest/Materials/M_Concrete.M_Concrete"
cfa set_materials_batch --blueprint-path "/Game/BP/BP_Chair.BP_Chair" --component "Mesh" --slot-name "Seat" --material "/Game/M/M_Wood.M_Wood"
cfa set_materials_batch --json '{"assignments":[{"blueprint_path":"/Game/BP/BP_Car.BP_Car","all_slots":true,"material":"/Game/M/M_Red.M_Red"},{"actor":"Wheel","slot":1,"material":""}]}'spawn_actor_by_classSpawn ANY AActor subclass, engine, plugin, or Blueprint
Resolves class_path as full UClass path ("/Script/Engine.PostProcessVolume"), Blueprint asset path ("/Game/BP_Miner"), or short name ("PostProcessVolume"). Validates child of AActor + not abstract + not deprecated. Uses UEditorActorSubsystem::SpawnActorFromClass when available so Ctrl+Z restores. Replaces the legacy whitelist of spawn_actor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| class_path | string | Yes | Full path, BP path, or short name |
| name | string | No | Optional outliner label |
| location | json | No | JSON [x,y,z] |
| rotation | json | No | JSON [pitch,yaw,roll] |
| scale | json | No | JSON [x,y,z] |
cfa spawn_actor_by_class --class-path "/Script/Engine.PostProcessVolume" --name "GlobalPP" --location "[0,0,0]"
cfa spawn_actor_by_class --class-path "/Script/Engine.SkyAtmosphere"
cfa spawn_actor_by_class --class-path "/Game/Blueprints/BP_Miner.BP_Miner_C" --location "[500,0,100]" --rotation "[0,90,0]"find_actorsFlexible actor search by name, label, class, or tag
Combine any number of filters (all AND'd together) to query the level. Useful to confirm an actor exists, list all of a class, or filter by tag. Returns total_scanned/total_matched even when truncated, so you know if you need to widen max_results.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name_pattern | string | No | Case-insensitive substring on UObject name |
| label_pattern | string | No | Case-insensitive substring on outliner label |
| class_filter | string | No | Class name (short or full path) |
| tag | string | No | Match actors with this Tag |
| exact_class | bool | No | Require exact class match (else IsA) |
| max_results | int | No | Result cap (0 = unlimited) |
| include_transform | bool | No | Include location/rotation/scale |
cfa find_actors --label-pattern "Light" --max-results 10
cfa find_actors --class-filter "PointLight" --include-transform true
cfa find_actors --class-filter "/Script/Engine.PostProcessVolume" --exact-class true
cfa find_actors --tag "MCPModified"
cfa find_actors --name-pattern "Conveyor" --class-filter "ConveyorBeltActor" --max-results 5get_actor_propertiesGet property values from a live placed actor instance
Reads the placed instance (not CDO). flat=false returns nested JSON with top-level filter; flat=true returns dotted-path dict with path-aware filter, depth limit, and optional per-property metadata, use this for searching deep into structs like FPostProcessSettings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor_label | string | Yes | Actor label or UObject name |
| filter | string | No | Substring filter (top-level for nested, full path for flat) |
| include_components | bool | No | Also return component properties |
| flat | bool | No | Flat dotted-path dict mode |
| max_depth | int | No | (flat) max struct nesting |
| include_metadata | bool | No | (flat) emit metadata blob per leaf |
| expand_arrays | bool | No | (flat) emit Field[N] entries |
| array_element_limit | int | No | (flat) max array elements |
| category | string | No | (flat) UPROPERTY(Category=X) exact match |
| include_inherited | bool | No | (flat) walk super classes |
| max_entries | int | No | (flat) cap on emitted entries |
| cursor | int | No | (flat) pagination offset |
cfa get_actor_properties --actor-label "PostProcessVolume_1" --filter "bloom"
cfa get_actor_properties --actor-label "PostProcessVolume_1" --flat true --filter "bloom" --max-depth 4
cfa get_actor_properties --actor-label "MyActor" --include-components true --flat true --include-metadata truequit_editorClose the connected Unreal Editor the safe way (no process kill)
Shuts down the editor this command is routed to through Unreal's own graceful shutdown, exactly like File > Exit, instead of killing it by PID. By default it discards unsaved changes (like clicking Don't Save). Pass --save to write every unsaved map and asset first. Either way the save and confirm popups are skipped, so it works whether or not the editor was launched unattended. The editor exits a moment after this command returns its result.
| Parameter | Type | Required | Description |
|---|---|---|---|
| save | bool | No | Save all unsaved changes before closing (default false = discard unsaved changes) |
cfa quit_editor
cfa quit_editor --saveplay_in_editorStart Play-In-Editor (PIE), in the active viewport, or a new window
Starts a Play-In-Editor session the same way the toolbar Play button does. If a level viewport is currently active/visible, the game plays inside that viewport; if no level viewport is showing (e.g. a Blueprint editor tab is focused), it opens a separate PIE window. Pass --new-window to always open a separate window, or --simulate for Simulate-In-Editor (SIE) instead of play. The session starts a moment after this returns (RequestPlaySession is deferred). Stop it with stop_play_in_editor.
| Parameter | Type | Required | Description |
|---|---|---|---|
| new_window | bool | No | Always open a separate PIE window instead of using the active viewport |
| simulate | bool | No | Simulate-In-Editor (SIE) instead of Play-In-Editor |
cfa play_in_editor
cfa play_in_editor --new-window
cfa play_in_editor --simulatestop_play_in_editorStop the running Play/Simulate-In-Editor session
Ends the active PIE or SIE session via Unreal's RequestEndPlayMap (the safe, deferred path). No-op if nothing is playing. The session ends a moment after this returns.
cfa stop_play_in_editorlist_level_templatesList the New-Level templates the editor offers (Basic, Open World, blanks, project templates)
Reads GUnrealEd->GetTemplateMapInfos(), the exact source the editor's New Level picker uses, plus the two blank options (Empty Level, Empty Open World). Each entry returns display_name, category, template_map (the asset path to pass to create_level's --template), and a partitioned flag for the blank options.
cfa list_level_templatescreate_levelCreate and open a new level (blank, partitioned, or from a template)
Creates a new map at --asset-path and opens it. With no --template it makes a blank level (add --partitioned for an Empty Open World / World Partition level). With --template (a template_map path or a display name from list_level_templates, e.g. "Basic" or "Open World") it clones that template map. Mirrors ULevelEditorSubsystem::NewLevel / NewLevelFromTemplate. Save the result with save_level (already has a path), a template/blank level is opened but not yet written to disk.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path for the new level, e.g. /Game/Maps/MyLevel |
| template | string | No | Template map path or display name (from list_level_templates). Omit for a blank level. |
| partitioned | bool | No | Make a World Partition (Open World) blank level. Ignored when --template is set. |
cfa create_level --asset-path /Game/Maps/MyLevel
cfa create_level --asset-path /Game/Maps/MyWorld --partitioned
cfa create_level --asset-path /Game/Maps/MyLevel --template "Basic"open_levelOpen an existing level in the editor
Loads the map at --asset-path into the editor (ULevelEditorSubsystem::LoadLevel).
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path of the level to open, e.g. /Game/Maps/MyLevel |
cfa open_level --asset-path /Game/Maps/MyLevelsave_levelSave the current level in place
Saves the currently open level (ULevelEditorSubsystem::SaveCurrentLevel). A brand-new unsaved level needs save_level_as with a path instead.
cfa save_levelsave_level_asSave the current level to a new asset path
Writes the current editor world to --asset-path (UEditorLoadingAndSavingUtils::SaveMap). Use this to persist a freshly created template/blank level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_path | string | Yes | Package path to save the level to, e.g. /Game/Maps/MyLevel |
cfa save_level_as --asset-path /Game/Maps/MyLevelsetup_default_sceneDrop a ready-to-light environment (sun, sky, fog, floor) into the current level, with optional lighting presets
Spawns a default lighting/sky rig into the current level in one call so a freshly created empty map is instantly viewable: DirectionalLight (sun), SkyAtmosphere, SkyLight, ExponentialHeightFog, and a floor plane, all filed under an Environment outliner folder. Pass --preset (clear|noon|sunset|overcast|snowy|night) to also apply a physically-grounded grade (sun angle/intensity, fog, atmosphere, exposure, saturation) following Unreal's outdoor-lighting rules, a preset forces the sky rig + a PostProcessVolume on. Without a preset, toggle parts with --sky/--floor/--clouds/--post-process/--player-start and tune the sun with --sun-pitch/--sun-yaw and the floor with --floor-size (metres).
| Parameter | Type | Required | Description |
|---|---|---|---|
| preset | string | No | Physically-grounded lighting preset: clear, noon, sunset, overcast, snowy, night. Forces the sky rig + PostProcessVolume on and grades sun/fog/atmosphere/exposure. Empty = plain rig, no grade. |
| sky | bool | No | Spawn the sky rig: sun (atmosphere light) + SkyAtmosphere + SkyLight (real-time capture) + HeightFog |
| floor | bool | No | Spawn a floor plane |
| clouds | bool | No | Spawn a VolumetricCloud |
| post_process | bool | No | Spawn an unbound PostProcessVolume (exposure/tonemapping) |
| player_start | bool | No | Spawn a PlayerStart |
| sun_pitch | float | No | Sun (DirectionalLight) pitch in degrees (Environment Light Mixer default) |
| sun_yaw | float | No | Sun (DirectionalLight) yaw in degrees |
| sun_roll | float | No | Sun (DirectionalLight) roll in degrees |
| floor_size | float | No | Floor plane size in metres |
| folder | string | No | Outliner folder for the spawned actors |
cfa setup_default_scene --preset clear
cfa setup_default_scene --preset sunset --floor-size 200
cfa setup_default_scene --preset overcast
cfa setup_default_scene --clouds --player-startget_undo_historyRead the editor's undo stack, newest first
Lists the editor's undo history the way the Undo History window does. Every CFA mutation is one entry titled 'CFA: <command>' with source=cfa, while the user's own edits show source=editor, so an agent can tell its work apart from theirs. Pass --details to also report what each transaction changed: the objects touched, their classes, and the property names that differ. Use --scope mine or --scope others to filter, and --filter to match on title.
| Parameter | Type | Required | Description |
|---|---|---|---|
| max_results | int | No | How many entries to return, newest first |
| filter | string | No | Only return entries whose title contains this text |
| scope | string | No | all (default), mine (authored by CFA), or others (authored by the user or the editor) |
| details | bool | No | Include the objects and property names each transaction changed |
cfa get_undo_history
cfa get_undo_history --scope mine --details
cfa get_undo_history --filter spawn_actor --max-results 5undoRoll back the last N transactions, as Ctrl+Z does
Undoes the top of the editor's undo stack. By default (--scope mine) it stops at the first entry CFA did not author, so an agent can back its own work out without reverting the user's edits, and reports stopped_because when it stops early. The undo stack is strictly last-in-first-out, so a CFA transaction sitting below a user edit cannot be reverted on its own; check get_undo_history first. Pass --scope any to undo whatever is on top regardless of who made it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| count | int | No | How many transactions to undo |
| scope | string | No | mine (default) stops at the first entry CFA did not author; any undoes whatever is on top |
cfa undo
cfa undo --count 5
cfa undo --count 3 --scope anybatchRun many commands in one round trip and one undo step
Executes an ordered list of commands against the editor in a single bridge call. Consecutive undoable steps share one transaction, so fifty edits collapse to a single Ctrl+Z. A step can reference an earlier step's output with "$2.asset_path", substitution only, it is a data format, not a scripting language. By default the batch is atomic: if any step fails the whole thing is rolled back with undo. Use --continue-on-error to run everything and get a per-step report instead, or --dry-run to validate command names and parameters without touching the project. Asset creation and deletion sit outside Unreal's undo system, so those steps are never rolled back and are listed under not_rolled_back.
| Parameter | Type | Required | Description |
|---|---|---|---|
| steps | json | Yes | JSON array of {command, params} objects, run in order |
| atomic | bool | No | Roll the whole batch back if any step fails |
| continue_on_error | bool | No | Run every step even when some fail, then report which failed |
| dry_run | bool | No | Validate every step without mutating anything |
| include_results | bool | No | Include each step's full result payload |
cfa batch --json '{"steps":[{"command":"spawn_actor","params":{"name":"A","location":[0,0,100]}},{"command":"spawn_actor","params":{"name":"B","location":[200,0,100]}}]}'
cfa batch --dry-run --json '{"steps":[{"command":"spawn_actor","params":{"name":"A"}}]}'
cfa batch --continue-on-error --json '{"steps":[...]}'redoRe-apply the last N undone transactions
Redoes transactions previously undone. By default (--scope mine) it stops at the first entry CFA did not author; pass --scope any to redo whatever is next.
| Parameter | Type | Required | Description |
|---|---|---|---|
| count | int | No | How many transactions to redo |
| scope | string | No | mine (default) stops at the first entry CFA did not author; any redoes whatever is next |
cfa redo
cfa redo --count 3