"""Remove the auto-generated simple collision from the site meshes, keeping their triangles. /UnrealEditor-Cmd -run=pythonscript \ -script=/Tools/unreal/ue_clear_simple_collision.py -nullrhi -unattended -nopause -stdout Why: the FBX import runs with `auto_generate_collision`, which adds ONE convex hull per mesh. For a 279 m terrain or road that hull is a giant slab, and any *physics body* inside it - the Chaos vehicle - is pushed out of the hull every frame. Walked characters never notice, because character movement sweeps instead of resolving penetration, which is why the player was fine while the car was thrown into the air. Clearing the hulls leaves `CTF_USE_COMPLEX_AS_SIMPLE`, so traces and physics use the real triangles. Result: /tmp/gigline/clear-simple-collision.txt """ import unreal FOLDERS = ("/Game/Hollywood/Site", "/Game/Hollywood/Streets") RESULT = "/tmp/gigline/clear-simple-collision.txt" lines = [] def log(message): lines.append(str(message)) unreal.log(str(message)) def main(): cleared = 0 for folder in FOLDERS: for path in unreal.EditorAssetLibrary.list_assets(folder, recursive=False): mesh = unreal.EditorAssetLibrary.load_asset(path) if not isinstance(mesh, unreal.StaticMesh): continue body = mesh.get_editor_property("body_setup") if body is None: continue agg = body.get_editor_property("agg_geom") convex = len(agg.get_editor_property("convex_elems")) boxes = len(agg.get_editor_property("box_elems")) if not convex and not boxes: continue agg.set_editor_property("convex_elems", []) agg.set_editor_property("box_elems", []) body.set_editor_property("agg_geom", agg) body.set_editor_property("collision_trace_flag", unreal.CollisionTraceFlag.CTF_USE_COMPLEX_AS_SIMPLE) mesh.set_editor_property("body_setup", body) unreal.EditorAssetLibrary.save_loaded_asset(mesh) log(f"{mesh.get_name()}: cleared {convex} convex, {boxes} box, complex-as-simple") cleared += 1 lines.append(f"VERDICT: {'PASS' if cleared else 'NOTHING-TO-DO'}") log(f"{cleared} meshes cleared") try: main() except Exception as exc: # noqa: BLE001 import traceback log(f"FAILED: {type(exc).__name__}: {exc}") log(traceback.format_exc()) lines.append("VERDICT: FAIL") with open(RESULT, "w") as f: f.write("\n".join(lines) + "\n")