Skip to content

Physics

52 tools. Back to the index.

add_field_node

Additive.

Author a field command node into a UFieldSystem and persist it. Builds a transient authoring field U-node (selected by node_type), resolves the physics target to an EFieldPhysicsType, constructs the runtime FFieldSystemCommand via FFieldObjectCommands::CreateFieldCommand, appends it to UFieldSystem.Commands, and saves the asset. node_type accepts "RadialFalloff", "PlaneFalloff", "BoxFalloff", "WaveScalar", "UniformScalar", "NoiseField", "UniformInteger", "RadialIntMask", "UniformVector", "RadialVector", "RotatedRadialVector", "RandomVector". Vector nodes pair with vector targets (LinearVelocity/LinearForce); scalar with strain/threshold; integer with state (DynamicState). target is a physics target attribute name like "LinearVelocity", "ExternalClusterStrain", "DynamicState". falloff_type accepts "Inverse", "Squared", "Logarithmic", or "None". Defaults to "Linear".

Parameter Type Required Description
field_system_path string yes Asset path of the UFieldSystem (e.g. "/Game/MyGame/FS_Example")
node_type string yes One of "RadialFalloff", "PlaneFalloff", "BoxFalloff", "WaveScalar", "UniformScalar", "NoiseField", "UniformInteger", "RadialIntMask", "UniformVector", "RadialVector", "RotatedRadialVector", "RandomVector"
target string yes Physics target attribute name, e.g. "LinearForce", "LinearVelocity", "ExternalClusterStrain", "DynamicState"
magnitude number no Optional scalar magnitude; defaults to 1.0
radius number no Optional falloff / mask radius; defaults to 100.0
position array no Optional [x, y, z] world / center position
direction array no Optional [x, y, z]; uniform-vector direction, plane normal (PlaneFalloff), or rotation axis (RotatedRadialVector)
falloff_type string no Optional EFieldFalloffType; defaults to "Linear"
min_range number no Optional remap lower bound for falloff/noise nodes; defaults to 0.0
max_range number no Optional remap upper bound for falloff/noise nodes; defaults to 1.0
default_value number no Optional out-of-range value for falloff nodes; defaults to 0.0
distance number no Optional plane distance limit for PlaneFalloff; defaults to 0.0
wavelength number no Optional WaveScalar wavelength; defaults to 10000.0
period number no Optional WaveScalar period; defaults to 1.0
wave_function string no Optional WaveScalar function "Cosine", "Gaussian", "Falloff", "Decay"; defaults to "Cosine"
interior_value number no Optional RadialIntMask interior integer; defaults to 1
exterior_value number no Optional RadialIntMask exterior integer; defaults to 0
mask_condition string no Optional RadialIntMask condition "Always", "MergeInterior", "MergeExterior"; defaults to "Always"
angle number no Optional RotatedRadialVector rotation angle in degrees; defaults to 0.0

Returns: { field_system_path: string, node_type: string, target: string, physics_type_name: string, command_count: int, success: bool, saved: bool, save_error?: string }

add_geometry_collection_source

Additive.

Append an additional StaticMesh source to an existing geometry collection, then save it. Succeeds only when the package reaches disk; a failed save leaves the change in memory only (saved false, save_error).

Parameter Type Required Description
geometry_collection_path string yes Full asset path to the UGeometryCollection
source_mesh_path string yes Asset path to the UStaticMesh to append
transform object no Optional {location, rotation, scale} for the source mesh placement

Returns: { geometry_collection_path: string, source_mesh_path: string, num_sources: int, num_materials: int, success: bool, saved: bool, save_error: string? }

add_impulse_to_actor

Additive.

Kick a physics body: apply an impulse (or, with vel_change, a mass-independent velocity change) to an actor's primitive component, optionally at a world location for torque via AddImpulseAtLocation, or on a named skeletal bone. Acts on the EDITOR world, where nothing is simulating unless the component has simulate_physics on -- so on a resting editor actor this is a no-op that still reports applied:true; verify with a transform re-read, and for gameplay-time forces drive it in PIE.

Parameter Type Required Description
actor_name string yes Display label or internal name of the target editor-world actor (required)
component_name string no Optional primitive component name (defaults to the actor's RootComponent)
impulse array no [x, y, z] impulse vector in world units (required)
location array no Optional [x, y, z] world location for AddImpulseAtLocation (omit to use AddImpulse)
bone_name string no Optional skeletal bone name to apply the impulse to
vel_change boolean no Optional; if true, impulse is treated as a velocity change (mass-independent)

Returns: { actor_name: string, component_name: string, applied: bool }

add_instanced_static_mesh_component

Additive, idempotent.

Attach an InstancedStaticMeshComponent (ISM) to a placed editor-world actor so you can then scatter many copies of one static mesh through it with add_ism_instance. Idempotent: if the actor already has an ISM it returns that one with already_existed=true instead of adding a second. This is the working alternative to the foliage scatter tools, which crash the editor in this build.

Parameter Type Required Description
actor_name string yes Display label or internal name of the target editor-world actor (required)
static_mesh_path string no Optional /Game/... path to a UStaticMesh asset (defaults to engine cube if absent)

Returns: { actor_name: string, component_name: string, component_class: string, num_instances: int, already_existed: bool }

add_ism_instance

Additive.

Place one more instance of an InstancedStaticMeshComponent's mesh at a world transform -- the cheap way to scatter many copies of a mesh (rocks, props, vegetation) without spawning an actor each. Pair it with add_instanced_static_mesh_component to create the component first. Prefer this route over the foliage tools: scatter_foliage_in_box and add_foliage_instances both CRASH the editor in this build, and an ISM is the same code path a foliage actor and PCG use anyway.

Parameter Type Required Description
actor_name string yes Display label or internal name of the actor carrying the ISM component (required)
component_name string no Optional ISM component name (defaults to the first one on the actor)
location array no [x, y, z] world-space translation (required)
rotation array no Optional [pitch, yaw, roll] world rotation (defaults to zero)
scale array no Optional [x, y, z] scale (defaults to [1,1,1])
world_space boolean no Optional; if true, transform is interpreted in world space (default true)

Returns: { instance_index: int, num_instances: int }

add_physics_asset_constraint

Additive, idempotent.

Author a ragdoll constraint (joint) inside a UPhysicsAsset between two bones. Creates a UPhysicsConstraintTemplate via FPhysicsAssetUtils::CreateNewConstraint (idempotent by name — re-using a name returns the existing joint), sets the child/parent bones and a Limited swing+twist cone, and snaps the joint frames to the bones' default relative transform when BOTH bones exist in the preview-mesh skeleton (skipped honestly otherwise, since the engine fatal-checks an unknown bone). Refine motions/limits afterwards with set_physics_asset_constraint_limits.

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset to add the constraint to.
child_bone string yes Name of the child bone/body (ConstraintBone1, the moving end).
parent_bone string yes Name of the parent bone/body (ConstraintBone2, the anchor end).
constraint_name string no Optional joint name (defaults to child_bone); re-using an existing name is idempotent (no duplicate).

Returns: { physics_asset_path: string, constraint_name: string, constraint_index: int, child_bone: string, parent_bone: string, already_existed: bool, child_in_skeleton: bool, parent_in_skeleton: bool, child_body_index: int, parent_body_index: int, frames_snapped: bool, collision_disabled: bool, constraint_count: int, saved: bool, save_error?: string, note?: string, constraint: object }

add_simple_collision_to_static_mesh

Additive.

Appends one simple collision primitive (Box, Sphere or Capsule) sized to the bounds of a UStaticMesh to its BodySetup and saves the mesh; a mesh outside /Game is first duplicated to dest_path. Not idempotent: each call adds one more (clear them with remove_static_mesh_collision).

Parameter Type Required Description
static_mesh_path string yes Path to the source UStaticMesh.
dest_path string yes Path under /Game to copy a mesh that is not under /Game into before editing (required then; an existing mesh there is reused and edited)
shape string no Box, Sphere or Capsule, case-insensitive, sized from the mesh bounds (default Box; any other value also adds a Box)

Returns: { static_mesh_path, shape, box_count, sphere_count, capsule_count, element_count, collision_added, duplicated_to_game, saved, save_error }

clear_ism_instances

Destructive, idempotent.

Wipe ALL instances from an InstancedStaticMeshComponent in one call (the component itself stays). Use it to reset a scatter before re-running it, rather than looping remove_ism_instance. Returns the post-clear num_instances, which should be 0.

Parameter Type Required Description
actor_name string yes Display label or internal name of the actor carrying the ISM component (required)
component_name string no Optional ISM component name

Returns: { cleared: bool, num_instances: int }

cluster_geometry_collection

Destructive.

Runs auto-clustering on all transforms of a UGeometryCollection asset, targeting site_count clusters ("Small" doubles it, "Large" halves it, any other method keeps it) with connectivity enforced, then saves it. Returns the cluster count used and the transform counts before and after; the call fails when no cluster was added (a collection that is not fractured into several pieces has nothing to group) or when the save fails.

Parameter Type Required Description
geometry_collection_path string yes Full asset path to the UGeometryCollection
cluster_size_method string no Small, Medium, or Large, default Medium
site_count number no Target cluster count before cluster_size_method scales it, minimum 1, default 10

Returns: { geometry_collection_path: string, cluster_size_method: string, site_count: int, num_transforms_before: int, num_transforms_after: int, success: bool, saved: bool, save_error: string? }

compute_gc_proximity

Destructive.

Rebuilds the proximity (adjacency) graph of a UGeometryCollection asset in place and saves it; undoable. Returns proximity_pairs (unordered pairs of neighboring pieces, from a precise proximity pass), transform_count, success and saved; fails when the save fails. Afterwards get_gc_hierarchy_info reports proximity_computed true.

Parameter Type Required Description
geometry_collection_path string yes Asset path of the UGeometryCollection

Returns: { geometry_collection_path: string, proximity_pairs: int, transform_count: int, success: bool, saved: bool }

create_field_system_asset

Additive, idempotent.

Create (or load) a saved UFieldSystem asset on /Game. Idempotent: if the asset already exists it is loaded and the same payload shape is returned. Otherwise a new UFieldSystem is created, registered with the asset registry, and saved to disk.

Parameter Type Required Description
field_system_name string yes Asset name (e.g. "FS_Example")
package_path string no Optional content folder; defaults to /Game/MCP

Returns: { field_system_path: string, field_system_name: string, command_count: int, success: bool, saved: bool, save_error?: string }

create_geometry_collection

Destructive.

Creates a UGeometryCollection asset at package_path/name, optionally filled from one StaticMesh, and saves it. An existing collection there is RESET first (all geometry and sources discarded; created false, rebuilt true). A source_mesh_path that does not load as a StaticMesh is an error, checked before anything is touched. Succeeds only when the package reaches disk; a failed save leaves the collection in memory only (saved false, save_error).

Parameter Type Required Description
package_path string yes Content folder for the asset, e.g. /Game/Chaos/Collections; a path without a leading slash is placed under /Game/
name string yes Name of the geometry collection asset, e.g. GC_Wall
source_mesh_path string no Optional StaticMesh to convert and append, e.g. /Engine/BasicShapes/Cube

Returns: { asset_path: string, geometry_collection_name: string, num_materials: int, num_transforms: int, created: bool, rebuilt: bool, saved: bool, save_error: string? }

create_physical_material

Additive, idempotent.

Create and save a UPhysicalMaterial asset, optionally setting surface/object properties. Idempotent: if the asset already exists it is loaded, any provided values are re-applied, and a stable payload is returned.

Parameter Type Required Description
name string yes Asset name (e.g. 'PM_Rubber').
package_path string no Target /Game package path (optional, default "/Game/Physics")
friction number no Optional Friction value to set on creation
restitution number no Optional Restitution value to set on creation
density number no Optional Density value (g/cm^3) to set on creation

Returns: { name: string, asset_path: string, package_path: string, friction: number, restitution: number, density: number, already_existed: bool, created: bool }

create_physics_asset

Additive.

Creates a UPhysicsAsset at package_path/name, generating bodies and constraints from a skeletal mesh, sets that mesh as its preview mesh and saves it; the mesh is not pointed at the new asset. An existing one there is returned unchanged. Returns bodies, constraints, skeleton_bones, bodies_generated, saved.

Parameter Type Required Description
name string yes Asset name (e.g. 'PA_Cube').
package_path string no Content folder for the new asset (default /Game/Physics; an empty string also uses it)
skeletal_mesh_path string no Skeletal mesh to generate the bodies from (default /Engine/EngineMeshes/SkeletalCube); the call fails when it does not load

Returns: { package_path, already_existed, created, saved, bodies_generated, generation_message, save_error }

fracture_geometry_collection

Destructive.

Applies Voronoi fracturing to all transforms of a UGeometryCollection asset, using num_sites random sites in its bounds, then saves it. num_fractures is the number of new pieces, measured as the transforms the fracture added; the call fails when it added none (an empty collection, or a chance_to_fracture that skipped every piece) or when the save fails. Re-fracturing grows a collection geometrically and can stall the editor; fracture a fresh one from create_geometry_collection.

Parameter Type Required Description
geometry_collection_path string yes Full asset path to the UGeometryCollection
num_sites number no Number of random Voronoi sites to generate, minimum 1, default 20
random_seed number no Seed for the random site positions and the per-transform fracture chance, default 0
chance_to_fracture number no Chance from 0 to 1 that each selected transform is fractured, default 1
grout number no Width of the gap left between cut pieces, in cm (default 0)
split_islands boolean no Optional, split resulting islands, default false

Returns: { geometry_collection_path: string, num_fractures: int, transform_count: int, num_sites: int, random_seed: int, success: bool, saved: bool, save_error: string? }

get_actor_bounds

Read-only.

Measure how BIG an actor really is: its aggregate world-space bounding box (origin, half-extent, min, max) in the EDITOR world. The size oracle for placement and footprint questions, and the honest test for "did that volume/brush actually get built" -- a spawned volume whose extent comes back (0,0,0) has no geometry no matter what the spawning tool reported. Its components filter is the reason to prefer it over reading a component property: "all" (default, AActor::GetActorBounds -- inflated by interaction/trigger shapes), "colliding" (only collision-enabled components) or "mesh"/"rendered" (UMeshComponent geometry ONLY, so trigger spheres/boxes are excluded and the box hugs what you actually see). Editor world only -- for a PIE-world footprint use overlap_scene/raycast_scene with a world selector.

Parameter Type Required Description
actor_name string yes Actor name or editor label
components string no Which components contribute: "all" (default; everything, trigger shapes included) | "colliding" (collision-enabled only) | "mesh" | "rendered" (UMeshComponent geometry only)
include_child_actors boolean no Include child-actor components' bounds. Defaults to false.

Returns: { actor_name: string, components: string, valid: bool, component_count: int, origin: {x,y,z}, extent: {x,y,z}, min: {x,y,z}, max: {x,y,z} } -- valid=false with a zero extent means no contributing geometry was found

get_collision_info

Read-only.

Read ONE placed primitive component's collision setup and physics state: collision enabled mode, per-channel responses (WorldStatic / WorldDynamic / Pawn / PhysicsBody), overlap and hit event flags, simulate-physics, mobility, and the physical material with its friction / restitution / density. The tool to answer "why does this not block / not overlap" without writing Python. Two limits from the code: it searches by component NAME across the world's actors but only inspects each actor's FIRST primitive component, so a secondary component (a second collider, a trigger next to a mesh) reports "not found" even though it exists; and it reads the component's live responses, NOT the profile definition -- for the profile itself use get_collision_profile (which is blind to +EditProfiles overrides), and prove a channel really blocks with raycast_scene.

Parameter Type Required Description
component_name string yes Name of the primitive component to query (must be its actor's first primitive component to be findable).

Returns: { component_name: string, collision_info_found: bool, collision_info_message: string, collision_enabled: string, collision_type: string, collision_response: string, collision_enabled_state: string, collision_generate_overlap_events: bool, collision_generate_hit_events: bool, collision_simulate_physics: bool, collision_mobility: string, collision_response_world_static: string, collision_response_world_dynamic: string, collision_response_pawn: string, collision_response_physics_body: string, physics_material_is_default: bool, physics_material_name: string, physics_material_path: string, physics_material_surface_type: string, physics_material_friction: float, physics_material_restitution: float, physics_material_density: float, physics_material_raise_mass_to_power: float, physics_material_linear_damping: float (body), physics_material_angular_damping: float (body), physics_material_mass_scale: float (body) }

get_field_system_info

Read-only.

Read the field commands authored in a UFieldSystem asset, in order: each with physics_type, target_attribute, command_name and max_magnitude (not its node graph), plus command_count. Read-only; the array index is what remove_field_node takes, and add_field_node authors new commands.

Parameter Type Required Description
field_system_path string yes Asset path of the UFieldSystem, e.g. "/Game/MyGame/FS_Example" or "/Game/MyGame/FS_Example.FS_Example".

Returns: { field_system_path: string, command_count: int, commands: [{ physics_type, target_attribute, command_name, max_magnitude }], success: bool }

get_gc_hierarchy_info

Read-only.

Reads the bone hierarchy of a UGeometryCollection asset: transform_count, root_indices, and per bone its level, name and simulation type ("Rigid", "Clustered" or "None"), plus proximity_computed. Generates the Level attribute in memory if needed, without saving. For parent indices use list_geometry_collection_bones.

Parameter Type Required Description
geometry_collection_path string yes Asset path of the UGeometryCollection

Returns: { geometry_collection_path: string, transform_count: int, root_indices: [int], levels: [int], bone_names: [string], simulation_types: [string], proximity_computed: bool, success: bool }

get_geometry_collection_info

Read-only.

Reads a UGeometryCollection asset without changing it: material, source and damage-threshold counts, damage model ("Threshold", "MaterialStrength" or "Unknown"), mass settings and element counts (transforms, vertices, faces, geometry; 0 without collection data). Use get_gc_hierarchy_info for the bone tree.

Parameter Type Required Description
geometry_collection_path string yes Full asset path, e.g. /Game/Chaos/GC_Wall

Returns: { asset_path: string, num_materials: int, num_geometry_sources: int, damage_model: string, num_damage_thresholds: int, is_empty: bool, num_transforms: int, num_vertices: int, num_faces: int, num_geometry: int, mass: float, mass_as_density: bool, minimum_mass_clamp: float, density_from_physics_material: bool, has_physics_material: bool }

get_ism_instance_info

Read-only.

Count the instances in an InstancedStaticMeshComponent, or read one instance's transform (location / rotation / scale) and per-instance custom data floats. Two modes from one call: omit instance_index for COUNT mode (num_instances + num_custom_data_floats -- the oracle for "did my scatter actually place anything"), pass it for per-instance mode. Reads the component in the editor world, so it needs no PIE.

Parameter Type Required Description
actor_name string yes Display label or internal name of the actor carrying the ISM component (required)
component_name string no Optional ISM component name (defaults to the first one on the actor)
instance_index number no Optional; absent -> count mode; present and >=0 -> per-instance mode (must be a valid index)
world_space boolean no Optional; if true, transform is returned in world space (default true)

Returns: count mode { num_instances: int, num_custom_data_floats: int } or instance mode { instance_index: int, num_instances: int, world_space: bool, location: [x,y,z], rotation: [pitch,yaw,roll], scale: [x,y,z], custom_data: [float], num_custom_data_floats: int }

get_physics_asset_info

Read-only.

Read a UPhysicsAsset's body count, constraint count, and bound skeletal mesh.

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset.

Returns: success or error payload

get_physics_constraint_info

Read-only.

Read the full authored configuration of a world APhysicsConstraintActor's UPhysicsConstraintComponent: identity + wired bodies/bones, linear/angular limits (with motion types), linear/angular drives (motors) with targets, breakable thresholds, projection, and collision/dominance flags. Read-only complement of spawn_physics_constraint / set_constraint_limits / set_physics_constraint_drives; returns the serialized template, not live simulation state (no motor torque/broken/force values, which are 0 outside PIE).

Parameter Type Required Description
constraint_actor_name string yes Label/name of the APhysicsConstraintActor.

Returns: { constraint_actor_name: string, constraint_component: string, constraint_actor1?: string, constraint_actor2?: string, constraint_bone1: string, constraint_bone2: string, linear_limit: number, linear_x_motion: string, linear_y_motion: string, linear_z_motion: string, swing1_limit: number, swing1_motion: string, swing2_limit: number, swing2_motion: string, twist_limit: number, twist_motion: string, angular_drive_mode: string, angular_orientation_drive: bool, angular_velocity_drive: bool, angular_drive_spring: number, angular_drive_damping: number, angular_drive_force_limit: number, angular_orientation_target: [number], linear_position_drive: bool, linear_velocity_drive: bool, linear_drive_spring: number, linear_drive_damping: number, linear_drive_force_limit: number, linear_position_target: [number], linear_breakable: bool, linear_break_threshold: number, angular_breakable: bool, angular_break_threshold: number, projection_enabled: bool, projection_linear_alpha: number, projection_angular_alpha: number, projection_linear_tolerance: number, projection_angular_tolerance: number, parent_dominates: bool, disable_collision: bool, found: bool }

get_physics_settings

Read-only.

One-shot physics census of the current world: UPhysicsSettings substepping/delta-time values, world gravity_z, and a walk of every actor counting collision-enabled vs disabled, simulating bodies, mobility split and mass totals, plus a heuristic quality label and a recommendations list. Use it for a broad "what is the physics state of this level" sweep instead of hand-writing the actor loop in Python; for ONE component's collision use get_collision_info, and to change gravity use set_world_gravity / set_physics_gravity. Read the numbers with three caveats visible in the code: physics_engine is a hardcoded "PhysX" literal (UE5 actually runs Chaos), the walk takes only the FIRST primitive component per actor so multi-component actors are undercounted, and generate_hit_events is always 0 (never populated).

No parameters.

Returns: { physics_settings_found: bool, physics_engine: string (hardcoded "PhysX"), physics_quality: string (heuristic from max_physics_delta_time), max_physics_delta_time, max_substep_delta_time, max_substeps, world_name, world_gravity_z, world_gravity_enabled, per-component counts (collision enabled/disabled, simulating, static/stationary/movable, overlap events), mass totals (only simulating bodies contribute), recommendations: [string], complexity score }

get_scene_bounds

Read-only.

How big is the LEVEL: one world-space bounding box aggregated over every level-bounds-relevant actor in the editor world (persistent level plus any loaded streamed levels), or over an explicit subset if you pass actor_names. Use it for map extents / where-is-everything questions; use get_actor_bounds for a single actor. Note it only sees LOADED actors, so on a World-Partition map an unloaded region contributes nothing and the box reads smaller than the map.

Parameter Type Required Description
actor_names array no Optional subset of actor names/labels; omit for every loaded actor in the world

Returns: { valid: bool, origin: {x,y,z}, extent: {x,y,z}, min: {x,y,z}, max: {x,y,z}, actor_count: int }

list_geometry_collection_bones

Read-only.

List every bone (transform) of a UGeometryCollection asset in index order with its name, parent index (-1 for a root) and simulation type ("Rigid", "Clustered" or "None"), plus transform_count and root_count. Read-only: nothing is generated or saved. A path that does not load or a collection without geometry data is an error. For levels, root indices and whether proximity is computed use get_gc_hierarchy_info; for damage, mass and source settings use get_geometry_collection_info.

Parameter Type Required Description
geometry_collection_path string yes Asset path of the UGeometryCollection, as a package path (/Game/Chaos/GC_Rock) or an object path (/Game/Chaos/GC_Rock.GC_Rock); required.

Returns: { geometry_collection_path, transform_count, root_count, bones: [{name, parent, sim_type}] }

overlap_scene

Read-only.

Sphere / box / capsule overlap query against the world: "what is inside this volume?", returning one JSON entry per overlapping actor+component instead of export-text, so no Python is needed to parse it. Use it over raycast_scene when the question is proximity/containment rather than line of sight -- e.g. is the pawn actually inside a water body's real collision, is anything blocking a build spot. Accepts the same world selector (editor / server / client / pie:N): an editor-world query does NOT see World-Partition/OFPA actor collision, so pass a live PIE world, and in co-op say WHICH one or an empty result is uninterpretable.

Parameter Type Required Description
shape string yes "sphere" | "box" | "capsule"
location array yes World-space [x, y, z] shape center
radius number yes Sphere/capsule radius (required for those shapes)
half_height number yes Capsule half-height (required for capsule)
half_extent array no Box HALF-extent [x, y, z], not the full size (required for box)
trace_channel string no Collision channel, canonical ("ECC_Visibility") or friendly ("Visibility"). Defaults to "Visibility".
ignore_actors array no Actor names/labels to exclude from the overlap.
world string no Which world to query: absent/"editor" (default) | "server" (the PIE world with authority) | "client" | "pie:N" | "pie" (ambiguous) | "game" (alias of "pie"). Pass a live world to hit World-Partition/OFPA actor collision (only cooked in the PIE physics scene).

Returns: { overlaps: [{actor_path, actor_name, component_name, item_index, blocking}], count: int, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }

plane_cut_fracture

Destructive.

Cuts all transforms of a UGeometryCollection asset with num_planes random planes inside its bounds (no noise, islands split by default), then saves it. new_fracture_count is the number of new pieces, measured as the transforms the cut added; the call fails when it added none (an empty collection, or planes that miss every piece) or when the save fails.

Parameter Type Required Description
geometry_collection_path string yes Asset path of the UGeometryCollection
num_planes number no Number of random cutting planes to generate, minimum 1, default 3
random_seed number no Optional seed for plane generation, default 1337
grout number no Width of the gap left between cut pieces, in cm (default 0)
split_islands boolean no Optional, split resulting islands, default true

Returns: { geometry_collection_path: string, num_planes: int, new_fracture_count: int, transform_count: int, success: bool, saved: bool, save_error: string? }

raycast_scene

Read-only.

Line trace / raycast the world and get a REAL JSON hit result -- what actor and component was hit, impact point, normal and distance -- instead of the UE export-text FHitResult blob that call_function on a line-trace UFUNCTION returns, so no Python parsing is needed. Accepts a world selector (editor / server / client / pie:N), which matters twice: an EDITOR-world trace does not hit World-Partition/OFPA actor collision (only cooked in the PIE physics scene) and reads as a clean miss, and in co-op a miss on the client world looks identical to a missing collider -- pass "server" or "pie:N" so a hit:false is interpretable. Also the honest way to prove a custom collision CHANNEL blocks: trace the same segment on a known-good channel (Visibility) and on the new one and compare actor/component/Z/distance, because get_collision_profile does not see +EditProfiles overrides.

Parameter Type Required Description
start array yes World-space [x, y, z] trace start
end array yes World-space [x, y, z] trace end
trace_channel string no Collision channel, canonical ("ECC_Visibility") or friendly ("Visibility", "Camera", or a custom channel name). Defaults to "Visibility". A channel created THIS session is not in the live profile table yet -- restart the editor before trusting a trace on it.
trace_complex boolean no Test against complex (per-poly) collision instead of simple. Defaults to false.
ignore_actors array no Actor names/labels to exclude from the trace.
return_physical_material boolean no Populate physical_material in the result. Defaults to false.
world string no Which world to trace: absent/"editor" (default) | "server" (the PIE world with authority) | "client" | "pie:N" | "pie" (ambiguous: PlayWorld, else the first PIE context) | "game" (alias of "pie"). Editor-world traces do NOT hit World-Partition/OFPA actors, so pass a live world to verify obstacle collision; with 2+ PIE instances prefer "server"/"pie:N".

Returns: { hit: bool, blocking_hit: bool, actor_path: string, actor_name: string, component_name: string, location: {x,y,z}, impact_point: {x,y,z}, normal: {x,y,z}, impact_normal: {x,y,z}, distance: float, bone_name: string, physical_material: string, face_index: int, world: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }

remove_field_node

Destructive, idempotent.

Remove a field command node from a UFieldSystem by index and persist. Inverse of add_field_node: selects the FFieldSystemCommand at the given index in UFieldSystem.Commands, removes it (RemoveAt frees the command's owned RootNode graph), and saves the asset. Idempotent: an out-of-range index is a clean no-op (removed:false, note:"index out of range") so re-running after the node is already gone is safe.

Parameter Type Required Description
field_system_path string yes Asset path of the UFieldSystem (e.g. "/Game/MyGame/FS_Example")
index number yes Zero-based index of the field command to remove

Returns: { field_system_path: string, removed: bool, removed_index?: int, removed_target?: string, command_count: int, success: bool, saved?: bool, save_error?: string, note?: string }

remove_geometry_collection_source

Destructive.

Remove a StaticMesh source reference from an existing geometry collection (inverse of add_geometry_collection_source; drops the GeometrySource entry only, does NOT re-fracture the core geometry)

Parameter Type Required Description
geometry_collection_path string yes Full asset path to the UGeometryCollection
index number no Optional 0-based index into the GeometrySource array (exactly one of index / source_mesh_path)
source_mesh_path string no Optional asset path of the source mesh to match against SourceGeometryObject (exactly one of index / source_mesh_path)

Returns: { geometry_collection_path: string, removed_index: int, removed_source_object: string, removed: bool, already_absent: bool, num_sources: int, success: bool, saved: bool }

remove_ism_instance

Destructive.

Delete ONE instance from an InstancedStaticMeshComponent by index. Indices shift after a removal, so remove from the highest index down when deleting several; to empty the component entirely use clear_ism_instances instead. Re-read num_instances from the reply (or get_ism_instance_info) as the oracle -- removed:true alone is not proof of the final count.

Parameter Type Required Description
actor_name string yes Display label or internal name of the actor carrying the ISM component (required)
instance_index number yes Index of the instance to remove (required, >=0)
component_name string no Optional ISM component name

Returns: { removed: bool, num_instances: int }

remove_physics_asset_constraint

Destructive, idempotent.

Remove a ragdoll constraint (joint) from a UPhysicsAsset — the inverse of add_physics_asset_constraint. Resolves the joint by constraint_name (preferred) or constraint_index and deletes it via FPhysicsAssetUtils::DestroyConstraint (the same ConstraintSetup.RemoveAt the PhAT editor runs). Idempotent: an already-absent constraint returns removed:false/already_absent:true with success (no mutation, no save).

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset to remove the constraint from.
constraint_name string no Optional joint name (JointName) of the constraint to remove; preferred over constraint_index when both are given (see get_physics_asset_info).
constraint_index number no Optional constraint index to remove (used when constraint_name is absent).

Returns: { physics_asset_path: string, constraint_name: string, constraint_index: int, child_bone: string, parent_bone: string, removed: bool, already_absent: bool, constraint_count: int, saved: bool, save_error?: string }

remove_static_mesh_collision

Destructive, idempotent.

Clear ALL simple/convex collision primitives from a UStaticMesh's BodySetup (the 'clear' half of the collision CRUD). Calls UBodySetup::RemoveSimpleCollision (InvalidatePhysicsData + AggGeom.EmptyElements), rebuilds the physics meshes and saves. Reuses the same duplicate-first logic as add_simple_collision_to_static_mesh so a read-only /Engine source is copied into dest_path first. Idempotent: clearing an already-empty BodySetup (or a mesh with no BodySetup) is a no-op reported via already_empty:true.

Parameter Type Required Description
static_mesh_path string yes Path to the source UStaticMesh.
dest_path string yes /Game path to duplicate a read-only /Engine source mesh into first (required only when the source is not under /Game).

Returns: { static_mesh_path, removed_count, element_count, collision_removed, already_empty, duplicated_to_game, saved, save_error? }

set_actor_physical_material

Destructive, idempotent.

Set the body physical-material override on an actor's primitive (static-mesh) component. Calls UPrimitiveComponent::SetPhysMaterialOverride and reads the override back.

Parameter Type Required Description
actor_name string yes Label/name of the target actor.
physical_material_path string yes /Game path to the UPhysicalMaterial asset.

Returns: { actor_name: string, component_name: string, physical_material_path: string, physical_material_name: string, applied_material_name?: string, verified: bool, applied: bool }

set_constraint_limits

Destructive, idempotent.

Set linear/angular limits on a physics-constraint actor's UPhysicsConstraintComponent and read back. Providing a limit sets that axis to a Limited motion type with the given size (linear is shared across X/Y/Z; swing/twist are in degrees).

Parameter Type Required Description
constraint_actor_name string yes Label/name of the APhysicsConstraintActor.
linear_limit number no Optional shared linear limit applied to all 3 axes (cm)
swing1_limit number no Optional swing1 angular limit (degrees)
swing2_limit number no Optional swing2 angular limit (degrees)
twist_limit number no Optional twist angular limit (degrees)

Returns: { constraint_actor_name: string, constraint_component: string, linear_limit: number, linear_x_motion: string, linear_y_motion: string, linear_z_motion: string, swing1_limit: number, swing1_motion: string, swing2_limit: number, swing2_motion: string, twist_limit: number, twist_motion: string, linear_applied: bool, swing1_applied: bool, swing2_applied: bool, twist_applied: bool, updated: bool }

set_gc_connection_settings

Destructive, idempotent.

Write the five clustering and connection-graph properties of a UGeometryCollection asset (cluster connection type, EnableClustering, ClusterGroupIndex, MaxClusterLevel, bounds filtering margin) in an undo transaction, invalidate it and save it; a failed save makes success false. Every field is written on each call, so an omitted one goes back to its listed default, and an unrecognized connection type becomes PointImplicit. The bone hierarchy is not rebuilt: cluster_geometry_collection builds clusters and compute_gc_proximity the proximity graph. The reply reads back the type, enable_clustering and max_cluster_level.

Parameter Type Required Description
geometry_collection_path string yes Asset path of the UGeometryCollection
cluster_connection_type string no PointImplicit, DelaunayTriangulation, MinimalSpanningSubsetDelaunayTriangulation, BoundsOverlapFilteredDelaunayTriangulation, PointImplicitAugmentedWithMinimalDelaunay, or None, default PointImplicit
enable_clustering boolean no If true, enable cluster graph generation, default true
cluster_group_index number no Cluster group index, default 0
max_cluster_level number no Maximum hierarchy level to cluster, default 100
bounds_filtering_margin number no Connection graph bounds filtering margin, default 0

Returns: { geometry_collection_path: string, cluster_connection_type: string, enable_clustering: bool, max_cluster_level: int, success: bool, saved: bool }

set_geometry_collection_damage

Destructive, idempotent.

Set the damage model and/or the per-level damage thresholds of a UGeometryCollection asset in an undo transaction, then save it. Only the fields given change; damage_thresholds overwrites the whole threshold list, skipping entries that are not numbers. Succeeds only when the package reaches disk; a failed save leaves the change in memory only (saved false, save_error). The reply reads back damage_model ("Threshold", "MaterialStrength" or "Unknown") and num_thresholds; get_geometry_collection_info shows them later. Mass: set_geometry_collection_mass; clustering: set_gc_connection_settings.

Parameter Type Required Description
geometry_collection_path string yes Full asset path to the UGeometryCollection
damage_model string no Threshold (alias UserDefined) or Simple (alias Material, the material-strength model), case-insensitive; any other text means Threshold, and leaving it out keeps the current model.
damage_thresholds array no Optional array of per-level damage threshold floats

Returns: { geometry_collection_path: string, damage_model: string, num_thresholds: int, success: bool, saved: bool, save_error: string? }

set_geometry_collection_mass

Destructive, idempotent.

Writes the mass settings of a UGeometryCollection asset (mass, mass_as_density, minimum_mass_clamp, density_from_physics_material), only for the fields given, then saves it; undoable. Returns the four values as stored, success, saved; fails when the save fails. Read them back with get_geometry_collection_info.

Parameter Type Required Description
geometry_collection_path string yes Full asset path to the UGeometryCollection
mass number no Optional total mass (kg), or density (kg/m^3) when mass_as_density is true
mass_as_density boolean no Optional, interpret 'mass' as a density in kg/m^3, default unchanged
minimum_mass_clamp number no Optional smallest allowable mass, default unchanged
density_from_physics_material boolean no Optional, derive density from the physics material, default unchanged

Returns: { geometry_collection_path: string, mass: float, mass_as_density: bool, minimum_mass_clamp: float, density_from_physics_material: bool, success: bool, saved: bool }

set_physical_material_properties

Destructive, idempotent.

Load a UPhysicalMaterial, set surface/object properties, save, and read back (read-modify-write; only provided fields change; idempotent set-to-fixed-value).

Parameter Type Required Description
physical_material_path string yes /Game path to the physical material asset.
friction number no Optional new (kinetic) Friction value (>= 0)
static_friction number no Optional new StaticFriction value (>= 0)
restitution number no Optional new Restitution value (clamped to [0,1])
density number no Optional new Density value (g/cm^3, >= 0)
friction_combine_mode string no Optional Average|Min|Multiply|Max (sets bOverrideFrictionCombineMode true)
restitution_combine_mode string no Optional Average|Min|Multiply|Max (sets bOverrideRestitutionCombineMode true)
surface_type string no Optional EPhysicalSurface by reflected name (e.g. 'SurfaceType_Default','SurfaceType1') or numeric value
raise_mass_to_power number no Optional RaiseMassToPower (clamped to [0.1,1])
sleep_linear_velocity_threshold number no Optional SleepLinearVelocityThreshold (>= 0)
sleep_angular_velocity_threshold number no Optional SleepAngularVelocityThreshold (>= 0)

Returns: { physical_material_path: string, friction: number, static_friction: number, restitution: number, density: number, friction_combine_mode: string, override_friction_combine_mode: bool, restitution_combine_mode: string, override_restitution_combine_mode: bool, surface_type: string, raise_mass_to_power: number, sleep_linear_velocity_threshold: number, sleep_angular_velocity_threshold: number, friction_applied: bool, static_friction_applied: bool, restitution_applied: bool, density_applied: bool, friction_combine_mode_applied: bool, restitution_combine_mode_applied: bool, surface_type_applied: bool, raise_mass_to_power_applied: bool, sleep_linear_velocity_threshold_applied: bool, sleep_angular_velocity_threshold_applied: bool, updated: bool }

set_physics_asset_constraint_drives

Destructive, idempotent.

Set a UPhysicsAsset constraint's drives (linear + angular motors), breakable thresholds, and projection — the "behavior beyond limits" (read-modify-write; only provided fields change; idempotent set-to-fixed-value). Authoring-only: the values persist into the asset (the live motor effect is observed in PIE/sim).

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset.
constraint_name string yes Name (JointName) of the constraint to edit (see get_physics_asset_info).
angular_drive_mode string no Optional angular drive mode: SLERP|TwistAndSwing.
angular_orientation_drive boolean no Optional: enable the angular orientation (position) drive.
angular_velocity_drive boolean no Optional: enable the angular velocity drive.
angular_drive_spring number no Optional angular drive spring/stiffness.
angular_drive_damping number no Optional angular drive damping.
angular_drive_force_limit number no Optional angular drive force/torque limit (0 = unlimited).
angular_orientation_target array no Optional [pitch, yaw, roll] target orientation in degrees.
linear_position_drive boolean no Optional: enable the linear position drive (applied to all 3 axes).
linear_velocity_drive boolean no Optional: enable the linear velocity drive (all 3 axes).
linear_drive_spring number no Optional linear drive spring/stiffness.
linear_drive_damping number no Optional linear drive damping.
linear_drive_force_limit number no Optional linear drive force limit (0 = unlimited).
linear_position_target array no Optional [x, y, z] target position.
linear_breakable boolean no Optional: the joint can break under linear force.
linear_break_threshold number no Optional linear break force threshold.
angular_breakable boolean no Optional: the joint can break under angular force.
angular_break_threshold number no Optional angular break torque threshold.
projection_enabled boolean no Optional: enable projection (post-solve position/angle fixup).
projection_linear_tolerance number no Optional projection linear tolerance.
projection_angular_tolerance number no Optional projection angular tolerance in degrees.
projection_linear_alpha number no Optional semi-physical linear projection alpha [0..1].
projection_angular_alpha number no Optional semi-physical angular projection alpha [0..1].
parent_dominates boolean no Optional: the parent body is unaffected by the child's motion.

Returns: { physics_asset_path: string, constraint_name: string, constraint_index: int, applied_count: int, angular_drive_spring: float, angular_drive_damping: float, angular_drive_force_limit: float, angular_orientation_target: [float], linear_drive_spring: float, linear_drive_damping: float, linear_drive_force_limit: float, linear_position_target: [float], projection_linear_alpha: float, projection_angular_alpha: float, projection_linear_tolerance: float, projection_angular_tolerance: float, saved: bool, save_error?: string, constraint: object }

set_physics_asset_constraint_limits

Destructive, idempotent.

Set the linear/angular motion types and limits of an existing constraint inside a UPhysicsAsset (read-modify-write: only the axes you provide change). Angular limits are in degrees; the linear limit is a single value shared across X/Y/Z (cm). Each *_motion is Free|Limited|Locked; providing a *_limit without its motion implies Limited on that axis. Idempotent (set-to-fixed-value).

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset.
constraint_name string yes Name (JointName) of the constraint to edit (see get_physics_asset_info).
swing1_motion string no Optional cone swing1 motion: Free|Limited|Locked.
swing1_limit number no Optional cone swing1 limit in degrees.
swing2_motion string no Optional cone swing2 motion: Free|Limited|Locked.
swing2_limit number no Optional cone swing2 limit in degrees.
twist_motion string no Optional twist motion: Free|Limited|Locked.
twist_limit number no Optional twist limit in degrees.
linear_x_motion string no Optional linear X-axis motion: Free|Limited|Locked.
linear_y_motion string no Optional linear Y-axis motion: Free|Limited|Locked.
linear_z_motion string no Optional linear Z-axis motion: Free|Limited|Locked.
linear_limit number no Optional shared linear limit in cm (applied to all 3 axes).

Returns: { physics_asset_path: string, constraint_name: string, constraint_index: int, applied_count: int, saved: bool, save_error?: string, constraint: object }

set_physics_body_advanced_properties

Destructive, idempotent.

Writes only the given advanced FBodyInstance fields (damping, mass scale, inertia scale, COM nudge, gravity, mass update on scale) of one body of a UPhysicsAsset, chosen by body_index or bone_name, and saves it. Fails when no field is given. Returns the authored values read back, applied_count, saved.

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset.
body_index number no Index of the body in the asset; wins over bone_name when both are given
bone_name string no Bone name to resolve the body (alternative to body_index).
linear_damping number no Drag that slows linear movement (FBodyInstance LinearDamping, unitless, engine default 0.01); omit to keep the current value
angular_damping number no Drag that slows rotation (FBodyInstance AngularDamping, unitless, engine default 0); omit to keep the current value
mass_scale number no Per-instance mass multiplier (>= 0.001).
inertia_tensor_scale array no [x,y,z] inertia scale.
com_nudge array no [x,y,z] center-of-mass offset.
enable_gravity boolean no Whether the body is affected by gravity.
update_mass_when_scale_changes boolean no Recompute mass on scale change.

Returns: { physics_asset_path: string, body_index: int, bone_name: string, linear_damping: number, angular_damping: number, mass_scale: number, inertia_tensor_scale: [number], com_nudge: [number], enable_gravity: bool, update_mass_when_scale_changes: bool, applied_count: int, updated: bool, saved: bool }

set_physics_body_properties

Destructive, idempotent.

Set the physics type and/or a mass override on one body of a UPhysicsAsset, chosen by body_index or else bone_name, in an undo transaction, then save the asset. Only the fields you pass change; passing neither is an error and nothing is written. An asset with no bodies, no body found or an unknown physics_type is an error, checked before any write. mass_override_enabled is read back from the body. success is false, with save_error, when the save fails (during PIE, for one). For damping, gravity, mass scale or centre of mass use set_physics_body_advanced_properties; get_physics_asset_info reads the body count.

Parameter Type Required Description
physics_asset_path string yes /Game path to the UPhysicsAsset.
body_index number no 0-based index of the body in the asset; wins over bone_name when both are given
bone_name string no Bone whose body to configure, used when body_index is absent
physics_type string no Body physics type (Default|Kinematic|Simulated), case-insensitive; omit to keep the current one
mass number no Mass override in kilograms; also switches the mass override on. Omit to keep the current mass

Returns: { physics_asset_path, body_index, bone_name, physics_type, physics_type_applied, mass_override_enabled, mass, mass_applied, updated, saved, save_error }

set_physics_constraint_drives

Destructive, idempotent.

Set linear/angular drives (motors), breakable thresholds, projection, and collision/dominance on a world APhysicsConstraintActor's UPhysicsConstraintComponent — the "behavior beyond limits" (read-modify-write; only provided fields change; idempotent set-to-fixed-value). Authoring-only: the values are written into the component's serialized ConstraintInstance template and persist; the live motor torque is only applied while simulating (PIE). Distinct from the UPhysicsAsset constraint drives (set_physics_asset_constraint_drives), which author a ragdoll joint inside an asset.

Parameter Type Required Description
constraint_actor_name string yes Label/name of the APhysicsConstraintActor (as spawned by spawn_physics_constraint).
angular_drive_mode string no Optional angular drive mode: SLERP|TwistAndSwing (dispatches the orientation/velocity enable path).
angular_orientation_drive boolean no Optional: enable the angular orientation (position) drive.
angular_velocity_drive boolean no Optional: enable the angular velocity drive.
angular_drive_spring number no Optional angular drive spring/stiffness.
angular_drive_damping number no Optional angular drive damping.
angular_drive_force_limit number no Optional angular drive force/torque limit (0 = unlimited).
angular_orientation_target array no Optional [pitch, yaw, roll] target orientation in degrees.
linear_position_drive boolean no Optional: enable the linear position drive (applied to all 3 axes).
linear_velocity_drive boolean no Optional: enable the linear velocity drive (all 3 axes).
linear_drive_spring number no Optional linear drive spring/stiffness.
linear_drive_damping number no Optional linear drive damping.
linear_drive_force_limit number no Optional linear drive force limit (0 = unlimited).
linear_position_target array no Optional [x, y, z] target position.
linear_breakable boolean no Optional: the joint can break under linear force.
linear_break_threshold number no Optional linear break force threshold.
angular_breakable boolean no Optional: the joint can break under angular force.
angular_break_threshold number no Optional angular break torque threshold.
projection_enabled boolean no Optional: enable projection (post-solve position/angle fixup).
projection_linear_tolerance number no Optional projection linear tolerance.
projection_angular_tolerance number no Optional projection angular tolerance in degrees.
projection_linear_alpha number no Optional semi-physical linear projection alpha [0..1].
projection_angular_alpha number no Optional semi-physical angular projection alpha [0..1].
parent_dominates boolean no Optional: the parent body is unaffected by the child's motion.
disable_collision boolean no Optional: disable collision between the two constrained bodies.
break_constraint boolean no Optional: if true, immediately break the (live) constraint via BreakConstraint().

Returns: { constraint_actor_name: string, constraint_component: string, applied_count: int, angular_drive_mode: string, angular_orientation_drive: bool, angular_velocity_drive: bool, angular_drive_spring: number, angular_drive_damping: number, angular_drive_force_limit: number, angular_orientation_target: [number], linear_position_drive: bool, linear_velocity_drive: bool, linear_drive_spring: number, linear_drive_damping: number, linear_drive_force_limit: number, linear_position_target: [number], linear_breakable: bool, linear_break_threshold: number, angular_breakable: bool, angular_break_threshold: number, projection_enabled: bool, projection_linear_alpha: number, projection_angular_alpha: number, projection_linear_tolerance: number, projection_angular_tolerance: number, parent_dominates: bool, disable_collision: bool, constraint_broken: bool, note: string, updated: bool }

set_static_mesh_convex_collision

Destructive, idempotent.

Replace a UStaticMesh's simple collision with a V-HACD convex decomposition (the "Auto Convex Collision" editor action) via UStaticMeshEditorSubsystem::SetConvexDecompositionCollisionsWithNotification. The subsystem removes any existing collision first, so this is idempotent (re-running replaces, never duplicates). Reuses the duplicate-first logic so a read-only /Engine source is copied into dest_path first. The subsystem returns false honestly on bad input (no valid mesh description / not on the game thread / under PIE) — surfaced as a CLEAN error, never a fake success.

Parameter Type Required Description
static_mesh_path string yes Path to the source UStaticMesh.
dest_path string yes /Game path to duplicate a read-only /Engine source mesh into first (required only when the source is not under /Game).
hull_count number no Maximum number of convex pieces to create (default 4, must be positive).
max_hull_verts number no Maximum vertices per generated hull (default 16).
hull_precision number no Voxel resolution used during decomposition (default 100000, must be positive).

Returns: { static_mesh_path, hull_count, max_hull_verts, hull_precision, convex_count, element_count, collision_set, duplicated_to_game, saved, save_error? }

set_static_mesh_kdop_collision

Destructive, idempotent.

Add a K-DOP (discrete-oriented-polytope) simple collision hull to a UStaticMesh via UStaticMeshEditorSubsystem::AddSimpleCollisionsWithNotification (the "Add K-DOP Simplified Collision" editor action). shape is one of NDOP10_X | NDOP10_Y | NDOP10_Z | NDOP18 | NDOP26. Reuses the duplicate-first logic so a read-only /Engine source is copied into dest_path first. The subsystem returns a negative index on failure — surfaced as a CLEAN error.

Parameter Type Required Description
static_mesh_path string yes Path to the source UStaticMesh.
dest_path string yes /Game path to duplicate a read-only /Engine source mesh into first (required only when the source is not under /Game).
shape string no K-DOP hull shape: NDOP10_X | NDOP10_Y | NDOP10_Z | NDOP18 | NDOP26 (default NDOP18).

Returns: { static_mesh_path, shape, added_index, simple_collision_count, element_count, collision_added, duplicated_to_game, saved, save_error? }

set_vehicle_wheel_setup

Destructive, idempotent.

Configure ONE entry of a UChaosWheeledVehicleMovementComponent's WheelSetups array (wheel class, bone, offset) by index. USE THIS RATHER THAN the generic set_property_value / set_properties, which cannot reliably write the wheel class: it is a TSubclassOf nested in a struct nested in an array, and the generic path only FINDS an already-loaded class instead of loading it. This tool resolves the class explicitly and writes the whole struct element, growing the array to fit if wheel_index is past the end. READING them back needs no special tool -- the generic get_properties / get_property_value already resolves nested object refs correctly.

Parameter Type Required Description
actor_name string yes Editor-world actor with a UChaosWheeledVehicleMovementComponent
wheel_index number yes Index into WheelSetups (>= 0). The array grows to fit if this is past the current end.
wheel_class string yes Full class path of the UChaosVehicleWheel subclass, e.g. "/Script/ChaosVehicles.ChaosVehicleWheel"
bone_name string no Skeletal bone this wheel is attached to. Optional.
additional_offset array no [x, y, z] additional offset applied to the wheel. Optional.

Returns: { actor_name: string, wheel_index: int, wheel_class: string, bone_name: string, additional_offset: {x,y,z}, num_wheels: int }

slice_fracture

Destructive.

Slices all transforms of a UGeometryCollection asset with a regular grid of slices_x by slices_y by slices_z cuts across its bounds (no angle or offset variation, islands split), then saves it. new_fracture_count is the number of new pieces, measured as the transforms the slicing added; the call fails when it added none (an empty collection, or all three slice counts 0) or when the save fails.

Parameter Type Required Description
geometry_collection_path string yes Asset path of the UGeometryCollection
slices_x number no Number of evenly spaced X slices, default 2
slices_y number no Number of evenly spaced Y slices, default 2
slices_z number no Number of evenly spaced Z slices, default 1
random_seed number no Seed passed to the slicer, default 1337; angle and offset variation are fixed at 0, so it changes little
grout number no Width of the gap left between cut pieces, in cm (default 0)

Returns: { geometry_collection_path: string, slices_x: int, slices_y: int, slices_z: int, new_fracture_count: int, transform_count: int, success: bool, saved: bool, save_error: string? }

spawn_field_system_actor

Additive.

Spawn an AFieldSystemActor in the editor world and assign a UFieldSystem. Spawns the actor at the given location, assigns the asset via UFieldSystemComponent::SetFieldSystem, and sets the actor label.

Parameter Type Required Description
actor_label string yes Editor label for the spawned actor
field_system_path string yes Asset path of the UFieldSystem to assign
location array no Optional [x, y, z] world location; defaults to (0,0,0)

Returns: { actor_label: string, field_system_path: string, actor_name: string, has_field_system: bool, success: bool }

spawn_physics_constraint

Additive.

Spawns an APhysicsConstraintActor in the editor world at location (zero rotation) in an undo transaction and optionally sets the two actors it constrains, found by object name or label (first match), then recomputes the joint frames. A name that matches no actor is skipped, not an error: check actor1_wired and actor2_wired. Each call adds a new actor; the level is not saved. Tune it with set_constraint_limits and set_physics_constraint_drives, read it with get_physics_constraint_info; for joints inside a Physics Asset use add_physics_asset_constraint.

Parameter Type Required Description
location array no World [x, y, z] for the constraint actor (defaults to origin)
actor1_name string no Optional name/label of the first actor to constrain
actor2_name string no Optional name/label of the second actor to constrain

Returns: { actor_name: string, actor_internal_name: string, actor_class: string, constraint_component: string, actor1_wired: bool, actor2_wired: bool, constraint_actor1?: string, constraint_actor2?: string, spawned: bool }

update_ism_instance_transform

Destructive.

Move, rotate or rescale ONE existing instance of an InstancedStaticMeshComponent in place, by index -- cheaper than remove + re-add and it keeps the index stable. Leave mark_render_state_dirty at its default true or the viewport keeps drawing the old transform.

Parameter Type Required Description
actor_name string yes Display label or internal name of the actor carrying the ISM component (required)
instance_index number yes Index of the instance to update (required, >=0)
component_name string no Optional ISM component name
location array no [x, y, z] new translation
rotation array no Optional [pitch, yaw, roll]
scale array no Optional [x, y, z]
world_space boolean no Optional; defaults true
mark_render_state_dirty boolean no Optional; default true (engine signature bMarkRenderStateDirty=true)
teleport boolean no Optional; default false

Returns: { updated: bool, num_instances: int }