Simple, stable colliders. Prefer primitives and convex pieces over render mesh.
When to Use
- Game physics / blocking volumes
- Unreal UCX export
- Unity mesh or primitive colliders
- Hitboxes for interactables
Workflow
Identify collision needs → Build proxies → Name correctly
→ Test overlaps → Export with render mesh
Collider Types
| Type | Use |
|---|---|
| Box | Crates, walls, simple props |
| Capsule | Characters, poles |
| Sphere | Balls, soft approximates |
| Convex hull | Organic / irregular single body |
| Multiple convex (UCX) | Vehicles, complex props |
Unreal Naming
UCX_SM_Asset_01
UCX_SM_Asset_02
- Must match associated mesh naming rules for auto-association
- Convex only for UCX
Unity Notes
- Prefer engine primitives when possible
- Mesh colliders: convex toggle for dynamic rigidbodies
- Keep proxy collection exportable
Authoring Rules
- Slightly smaller than visual mesh to reduce snagging (project-dependent)
- No holes; watertight convex pieces
- Apply scale
- Origin aligned with render mesh
- Collection:
COL_Collision_[Asset]
Validation
- Player cannot fall through intended blockers
- No huge invisible walls beyond mesh
- Wheel/character capsules oriented correctly
- Named for target engine
Constraints
MUST DO
- Prefer few simple shapes over one complex mesh
- Match engine naming conventions
- Keep proxies in dedicated collection
MUST NOT DO
- Write code or snippets for Blender versions before 5.2, or add version fallbacks: this plugin targets 5.2+, and legacy branches teach users APIs that no longer exist
- Use render LOD0 as physics mesh by default
- Non-convex UCX for Unreal auto-convex workflows
Scripts
Tested on Blender 5.2 LTS via the official Blender MCP. Run with execute_blender_code (or headless,
see the blender-mcp-workflow skill); read the script header for every argument.
When the user will paste code into Blender themselves, give them the short runpy call with the absolute
path of this installed script and their ARGS. Don't inline or rewrite the script: the tested file is the point.
| Script | What it does |
|---|---|
scripts/make_collision.py |
Generate simple collision proxies for render meshes, named for the target engine. Shapes: box (oriented to object), convex (hull of evaluated mesh). Proxies go to COL_Collision, display as wire, are hidden from render, and parented to the source. |
import runpy
result = runpy.run_path("<skill_dir>/scripts/make_collision.py", init_globals={"ARGS": {...}})["result"]
ARGS: objects, shape, engine, max_hull_verts, replace (default true)
Proxies carry the custom property collision_proxy = "<source>|<engine>". Re-runs replace only their own tagged proxies (one _01 per source and engine); untagged objects are never touched, and a name clash is reported in name_conflicts. Pass replace: false to stack extra hulls (_02, _03) deliberately. For a hand-made multi-part hull set, rerun with replace: false (or remove the collision_proxy property from hulls you edit by hand): a default rerun replaces every tagged UCX_<name>_NN under the source, including copies you made of a proxy.
Reference Guide
| Topic | Reference | Load When |
|---|---|---|
| Collider Recipes | references/collider-recipes.md |
When needed |
| Engine Naming | references/engine-naming.md |
When needed |