Quick answer: Set continuous_cd = true on the fast RigidBody. Or thicken the thin wall to be wider than (max_speed * physics_tick). For CharacterBody3D, increase safe_margin.
Bullets pass through walls. The wall is 0.1m thick; the bullet moves 1m per physics tick. Bullet starts on one side of the wall and ends on the other; collision missed.
The Symptom
Fast objects pass through thin colliders. Slow speeds collide normally. Reproduces consistently above some speed threshold.
The Fix
Continuous CD on the bullet.
extends RigidBody3D
func _ready() -> void:
continuous_cd = true # sweep test against thin objects
Continuous CD performs a sweep test from previous to current position. Catches the wall regardless of thickness.
Or thicken walls. Cheap. Reliable. Limit max body speed to (wall_thickness / tick_seconds) and you don’t need continuous CD.
Or raycast bullet logic. For very-fast projectiles (laser, hitscan), don’t simulate physics — raycast each tick from old to new position and apply damage / spawn impact at the hit.
CharacterBody3D safe_margin
extends CharacterBody3D
func _ready() -> void:
safe_margin = 0.05 # cm-scale margin
Resolves penetration before move_and_slide. Reduces tunneling without continuous CD.
Verifying
Test with a fast projectile and thin wall. Without fix: passes. With continuous_cd or thick wall: collides reliably.
“Continuous CD on fast bodies. Or raycast hitscan. Or thicker walls.”
Related Issues
For physics interpolation jitter, see interpolation. For PhysicsServer3D direct state, see direct state.
Sweep or thicken. Tunneling stops.