FREE
Stop using .Touched: zone detection that actually works
Touched events miss fast-moving players, fire multiple times, and break with anchored parts. Here's the spatial-query approach I use in every commission — with the full module to download at the end.
Why .Touched fails
Touched relies on physics contacts. A player moving fast can pass through a thin zone between physics steps, so the event never fires. You end up padding zones and debouncing — and it's still unreliable at 16+ studs/s.
The spatial-query approach
Instead of waiting for physics, we ask every Heartbeat: which parts are inside this box right now?
ZoneDetect.luau — core loopfull source — 4 lines
local parts = workspace:GetPartBoundsInBox(zone.CFrame, zone.Size)for _, part in parts do track(part) -- enter/leave bookkeepingend