Quick answer: CSG is for prototyping. At runtime, convert CSG to MeshInstance3D + StaticBody3D + ConcavePolygonShape3D for stable collision. Right-click the CSG root and choose Convert.

Here is how to fix Godot 4 CSGShape3D where the collision lags the visual mesh after edits. CSG was never meant for runtime use; bake to static meshes for shipping.

The Symptom

Edit the CSG. Visual updates. Player walks against the new shape but collides with the old.

What Causes This

Expensive rebuild. CSG operations regenerate full mesh; collision is even more costly.

Runtime use unsupported. Designed for editor prototyping.

The Fix

Step 1: Convert in editor. Right-click the root CSGShape3D → Convert → Convert CSG to MeshInstance3D. The new MeshInstance3D is static and fast.

Step 2: Add collision.

StaticBody3D
  CollisionShape3D (ConcavePolygonShape3D from the mesh)
  MeshInstance3D (the converted mesh)

Right-click the MeshInstance3D → Mesh → Create Trimesh Static Body. Sets up the body and shape automatically.

Step 3: Delete the original CSG. Keeping it around in the scene tree wastes memory and risks accidental edits.

Step 4: For destructible scenes, prefer voxel or chunked meshes. CSG runtime boolean is too slow. Use a voxel system (Zylann’s VoxelTools, etc.) or a chunked mesh approach.

Step 5: For editor-time iteration, keep CSG until satisfied; bake when shipping.

“CSG for prototyping. Convert to static mesh + ConcaveShape for runtime. Voxel for destruction.”

Related Issues

For MeshInstance3D culling, see MeshInstance3D Culling. For CharacterBody3D stairs, see 3D Stairs.

Convert CSG. Static body + concave shape. Ship without CSG.