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 }